Аппроксимация данных с помощью частичных сумм тригонометрического ряда Фурье

Определение сущности аппроксимации — научного метода, состоящего в замене одних объектов другими. Рассмотрение внешнего вида интерфейса. Разработка листинга программы. Ознакомление с примером вызова программы. Характеристика результатов тестирования.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 21.10.2017
Размер файла 345,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

"Московский государственный технический университет радиотехники, электроники и автоматики"

МГТУ МИРЭА

Факультет радиотехнических и телекоммуникационных систем

Кафедра “Радиосистем передачи информации”

Курсовая работа по дисциплине: «Информатика»

Тема курсовой работы: «Аппроксимация данных с помощью частичных сумм тригонометрического ряда Фурье»

Студент группы РРБ-1-13

Буянов А.С.

Руководитель курсовой работы

доцент, к.т.н. Петрова Н.Я.

Москва 2014

Содержание

1. Теоритическое введение

2. Постановка задачи

3. Функции

4. Интерфейс

5. Главная исполняющая функция

6. Листинг программы в C++

7. Пример вызова программы

8. Тесты

Список использованной литературы

1. Теоретическое введение

Аппроксимация -- научный метод, состоящий в замене одних объектов другими, в том или ином смысле близкими к исходным, но более простыми.

Аппроксимация позволяет исследовать числовые характеристики и качественные свойства объекта, сводя задачу к изучению более простых или более удобных объектов.

Ряд Фурье может быть представлен для функции обозначенной на интервале от - до ,а может на -l до l.Период T=2*l

Ряд Фурье представляет собой функцию (f), зависящую от переменной (x),приближённое значение которой можно вычислить, вычислив ряд Фурье.

Где a0, an, bn - коэффициенты ряда Фурье

Для того, чтобы между f(x) и рядом Фурье можно было поставить знак равенства, вместо знака приближенного равенства, необходимо доказать сходимость полученного ряда к функции, посредством Теоремы Дирихле.

2. Постановка задачи

Произвести аппроксимацию заданной функции с помощью тригонометрического ряда Фурье.

Исходные данные:

В данной работе используется функция, состоящая из трёх простых функций (три прямые)

Рис.1. Исходный график

3. Функции

Данная работа выполнена в двух частях:

· Первая часть - интерфейс, созданый в среде MatLab через которые Пользователь задаёт нужные значения, для процесса аппроксимации, а также может получить визуальное представление о изначальной и конечной функции.

· Вторая часть - главный исполняющий .ехе файл, написанный и скомпилированный в среде Visual Studio C++, в котором идет расчет координат конечной аппроксимированой функции.

4. Интерфейс

m-Функция launch- основная m-функция интерфейса. Она вызывается из командной строки MATLAB.

Пример вызова

>>launch

(предварительно нужно выбрать путь к данной m-функции)

В основном окне программы расположены следующие элементы интерфейса:

· Краткое руководство к эксплуатации.

· Окно графопостроителя.

· Краткое описание задействованных переменных.

· Поля для ввода элементов.

· Кнопка очистки окна графопостроителя.

· Кнопка построения изначального графика функции.

· Кнопка построения аппроксимированного графика функции.

· Кнопка для проверки успешного считывания данных из полей ввода.

· Кнопка для проверки успешного создания координат аппроксимированной функции.

Внешний вид интерфейса

Рис.2. Внешний вид интерфейс

Исходный код функции launch

Функция launch не имеет ни входных ни выходных параметров. Она создает окно интерфейса. Содержит подфункции : graph, read, clearaxes, mlchec, cppchec.Эти подфункции обеспечивают работу всех составляющих интерфейса.

function launch

global haxes h_k h_n h_z h_c

%----------------------------график-----------------------------

hfig=figure('NumberTitle','off','name','Approx',...

'position',[100,100,700,500]);

haxes=axes('Units','pixels','position',[50 100 300 300]);

%----------------------------подписи----------------------------

uicontrol(hfig,'style','text','string','k=',...

'position',[45 10 25 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','n=',...

'position',[125 10 25 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','z=',...

'position',[205 10 25 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','k-какую частичную сумму вычислить и пострить',...

'position',[470 200 100 60],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','n-сколько разбиений,для вычисления интеграла',...

'position',[470 300 100 60],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','z-на сколько частей делить отрезок [2;11]',...

'position',[470 400 100 60],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','Инструкция:',...

'position',[95 470 500 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','1)ввести значения n и k. 2)нажать на "график". 2)нажать на "запустить р-ту в с++" ',...

'position',[95 455 500 25],'backgroundcolor',[.8 0.8 0.8]);

%----------------------------поля ввода-------------------------

h_k=uicontrol(hfig,'style','edit','position',[65 10 40 25],...

'backgroundcolor',[1 1 1],'horizontalalignment','left','enable','on');

h_n=uicontrol(hfig,'style','edit','position',[150 10 40 25],...

'backgroundcolor',[1 1 1],'horizontalalignment','left','enable','on');

h_z=uicontrol(hfig,'style','edit','position',[235 10 40 25],...

'backgroundcolor',[1 1 1],'horizontalalignment','left','enable','on');

%----------------------------кнопки-----------------------------

uicontrol(hfig,'style','pushbutton','string','график',...

'position',[400 80 120 25],'callback','graph');

uicontrol(hfig,'style','pushbutton','string','запустить р-ту в с++',...

'position',[550 80 120 25],'callback','read');

uicontrol(hfig,'style','text','string',...

'Рис.1 График функций',...

'position',[50 40 300 35],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','pushbutton','string','открыть cpp.txt',...

'position',[400 43 120 25],'callback','cppchec');

uicontrol(hfig,'style','pushbutton','string','открыть ML.txt',...

'position',[550 43 120 25],'callback','mlchec');

h_c=uicontrol(hfig,'Style','pushbutton','Position',[320 10 45 30],'String', 'очистить','Callback','clearaxes' );

end

Исходный код подфункции graph

Подфункция graph не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы выводить график исходной функции и отправлять значения k,n,z в программу С++,для вычисления координат аппроксимированной функции.

function graph

global h_k h_n h_z

hold on;

x=[2,5,8,11];

y=[0,2,2,0];

plot(x,y,'-m');

k=str2double(get(h_k,'string'));

n=str2double(get(h_n,'string'));

z=str2double(get(h_z,'string'));

m=[k,n,z];

f=fopen('CPP.txt','wt');

fprintf(f,'%u\n',m);

fclose(f);

hold off;

grid on;

end

Исходный код подфункции read

Подфункция read не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы запустить .exe файл, в котором идет вычисление координат аппроксимированной функции, считывать .txt файл с этими координатами и строить по ним график в окне графопостроителя.

function read

!E:\MIREA\VisualStudio\Kypc\Debug\Kypc.exe

[f,or]=fopen('ML.txt', 'rt');

if (isempty(or))

mas=' ';

while ~feof(f)

line=fgetl(f);

mas=char(mas,line);

end

fclose(f);

else

disp(or);

end

mas=str2num(mas);

x=mas(:,1);

y=mas(:,2);

plot(x,y);

grid on;

xlim([2,11]);

end

Исходный код подфункции clearaxes

Подфункция clearaxes не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы очистить поле графопостроителя.

function clearaxes

global haxes

hold on;

axes(haxes); cla;

hold off;

Исходный код подфункции cppchec

Подфункция cppchec не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы открывать файл, содержащий данные, введёные пользователем в интерфейсе.

function cppchec

!E:\MIREA\VisualStudio\Kypc\Kypc\Cpp.txt

Исходный код подфункции mlchec

Подфункция mlchec не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы открывать файл, содержащий координаты аппроксимированной функции, рассчитанные главным исполняющим .exe файлом.

function cppchec

!E:\MIREA\VisualStudio\Kypc\Kypc\Cpp.txt

5. Главная исполняющая функция

Функция main является основной функцией исполнительной части. Она не имеет ни входных, ни выходных параметров.Cодержит подфункции double fun(double x),

void furie(int m, int k), double find_koef0(double(*f)(double), int m),

double find_koef1(double(*f)(double), int k, int m),

double find_koef2(double(*f)(double), int k, int m) . Эти подфункции обеспечивают работу главной функции main.

В функции main происходит

· Считывание данных, введённые пользователем в интерфейсе.

· Запуск аппарата аппроксимации, основанный на принципе рядa Фурье.

Исходный код функции main

void main(void)

{

double ya, bn, ao, an;

ifstream file1;

file1.open("CPP.txt");

if (!file1)

{

cout << "error" << endl;

}

file1 >> k;

file1 >> m;

file1 >> z;

file1.close();

h = (double)l / (double)m;

furie(m, k);

}

Исходный код подфункции fun

Подфункция double fun(double x) имеет входной параметр «x» и выходной параметр «y». Она предназначена для вызова главной функцией main для того, чтобы в соответствии от значения параметра «x», выбирать соответствующую для него функцию y(x).

Параметр «x»: типа «double», является аргументом для функции y(x).

Параметр «y»: типа «double», является значение функции (x).

double fun(double x)

{

double y;

if (x >= 2 & x <= 5)

y = (2 / 3)*x - (4 / 3);

else if (x > 5 & x <= 8)

y = 2;

else if (x > 8 & x <= 11)

y = -(2 / 3)*x + (22 / 3);

else y = 0;

return y;

}

Исходный код подфункции furie

Подфункция void furie(int m, int k) имеет входные параметры «m» и «k». Она предназначена для вызова главной функцией main для того, чтобы производить расчет значений ряда Фурье и записывать их вместе с соответствующими значениями «x» в файл, который считывается интерфейсом.

Параметр «m»: типа «int», является числом, определяющим количество разбиений при подсчете интегралов .

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы (гармоники), которая будет подлежать выводу в окне графопостроителя

void furie(int m, int k)

{

double ya;

ofstream file2;

file2.open("ML.txt");

x = 0;

for (int p = 0; p<=z; p++)

{

ya = find_koef0(fun, m) / 2;

for (int j = 1; j <= k; j++)

ya += (find_koef1(fun, j, m))*cos(j*pi*x / l) + (find_koef2(fun, j, m))*sin(j*pi*x / l);

file2 << x << " " << ya << endl;

x += 2 * l / z;

}

file2.close();

}

Исходный код подфункции find_koef1

Подфункция double find_koef1(double(*f)(double), int k, int m)имеет входные параметры «(*f)(double) », «m» и «k» и выходной «Ia» параметры. Она предназначена для вызова подфункцией furie для того, чтобы производить расчет коэффициента Фурье «аn».

Параметр «m»: типа «int», является числом, определяющим количество разбиений при подсчете интегралов .

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы(гармоники), которая будет подлежать выводу в окне графопостроителя

Параметр «double(*f)(double) »: типа «double», является указателем на функцию y(x) по которой идет дальнейший расчет в зависимости от значения «x».

Параметр «Ia»: типа «double», является коэффициентом ряда Фурье «аn».

double find_koef1(double(*f)(double), int k, int m)

{

double sa = 0, Ia;

for (int i = 0; i < m; i++)

{

sa += f(x0 + h / 2 + i*h)*cos((x0+ h / 2 + i*h)*pi*k / l);

}

sa = sa / l;

Ia = sa*h;

return Ia;

Исходный код подфункции find_koef2

Подфункция double find_koef2(double(*f)(double), int k, int m)имеет входные параметры «(*f)(double) », «m» и «k» и выходной «Ib» параметры. Она предназначена для вызова подфункцией furie для того, чтобы производить расчет коэффициента ряда Фурье «bn».

Параметр «m»: типа «int», является числом, определяющим количество разбиений при подсчете интегралов .

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы(гармоники), которая будет подлежать выводу в окне графопостроителя

Параметр «double(*f)(double) »: типа «double», является указателем на функцию y(x) по которой дальнейший идет расчет в зависимости от значения «x».

Параметр «Ib»: типа «double», является коэффициентом ряда Фурье «bn».

{

double sb = 0, Ib;

for (int i = 0; i < m; i++)

{

sb += f(x0 + h / 2 + i*h)*sin((x0 + h / 2 + i*h)*pi*k / l);

}

sb = sb / l;

Ib = sb*h;

return Ib;

}

Исходный код подфункции find_koef0

Подфункция double find_koef0(double(*f)(double), int k)имеет входные параметры «(*f)(double)», «k» и выходной «Io» параметры. Она предназначена для вызова подфункцией furie для того, чтобы производить расчет коэффициента ряда Фурье «ao».

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы (гармоники), которая будет подлежать выводу в окне графопостроителя. интерфейс аппроксимация программа

Параметр «double(*f)(double) »: типа «double», является указателем на функцию y(x) по которой дальнейший идет расчет в зависимости от значения «x».

Параметр «Io»: типа «double», является коэффициентом ряда Фурье «ao».

double find_koef0(double(*f)(double), int m)

{

double so = 0, Io;

for (int i = 0; i < m; i++)

so += f(x0+ h / 2 + i*h);

so = so / l;

Io = so*h;

return Io;

}

6. Листинг программы в C++

#include <cmath>

#include <cstdlib>

#include <iostream>

#include <fstream>

using namespace std;

double fun(double x);

void furie(int m, int k);

double find_koef2(double(*f)(double), int k, int m);

double find_koef1(double(*f)(double), int k, int m);

double find_koef0(double(*f)(double), int m);

double pi = 3.1415926535;

double x;

double l = 12.0;

double h;

double x0 = 2.0;

int z;

int k ;

int m ;

void main(void)

{

double ya, bn, ao, an;

ifstream file1;

file1.open("CPP.txt");

if (!file1)

{

cout << "error" << endl;

}

//сейчас будет считывание данных из интерфейса

file1 >> k;

file1 >> m;

file1 >> z;

file1.close();

//конец считывание+закрытие файла.

h = (double)l / (double)m;

furie(m, k);

}

double fun(double x)

{

double y;

if (x >= 2 & x <= 5)

y = (2 / 3)*x - (4 / 3);

else if (x > 5 & x <= 8)

y = 2;

else if (x > 8 & x <= 11)

y = -(2 / 3)*x + (22 / 3);

else y = 0;

return y;

}

void furie(int m, int k)

{

double ya;

//сейчас откроется файл, который будет заполнен координатами аппроксимированной функции

ofstream file2;

file2.open("ML.txt");

x = 0;

for (int p = 0; p<=z; p++)

{

ya = find_koef0(fun, m) / 2;

for (int j = 1; j <= k; j++)

ya += (find_koef1(fun, j, m))*cos(j*pi*x / l) + (find_koef2(fun, j, m))*sin(j*pi*x / l);

//каждый раз при прохождении в цикле следующей строчки,будет записываться очередная пара координат

file2 << x << " " << ya << endl;

x += 2 * l / z;

}

file2.close();//закрытие файла.

}

double find_koef0(double(*f)(double), int m)

{

double so = 0, Io;

for (int i = 0; i < m; i++)

so += f(x0+ h / 2 + i*h);

so = so / l;

Io = so*h;

return Io;

}

double find_koef1(double(*f)(double), int k, int m)

{

double sa = 0, Ia;

for (int i = 0; i < m; i++)

{

sa += f(x0 + h / 2 + i*h)*cos((x0+ h / 2 + i*h)*pi*k / l);

}

sa = sa / l;

Ia = sa*h;

return Ia;

}

double find_koef2(double(*f)(double), int k, int m)

{

double sb = 0, Ib;

for (int i = 0; i < m; i++)

{

sb += f(x0 + h / 2 + i*h)*sin((x0 + h / 2 + i*h)*pi*k / l);

}

sb = sb / l;

Ib = sb*h;

return Ib;

}

7. Пример вызова программы

Примечание #1 Данная работа сделана и протестирована на

ОС Windows 8 для одного языка

Matlab 2010, version 7.11.0.584 (R2010b) 64-bit(win64)

Microsoft Visual Studio Ultimate(trial) 2013, version 12.0.31101.00 Update4

Примечание #2 нужно выбрать правильный путь.

(для ВСЕХ m-функций и текстовых файлов CPP.txt и ML.txt :\…\Kypc\Kypc\

для Kypc.exe :\…\Kypc\Debug\ Kypc.exe)

1)Открываем Matlab

Рис. 3 Открывается окно интерфейса

Рис. 4

2)Вводим значения k n z и нажимаем «график»

Рис. 5 Строится график иссходной функции

3)Нажимаем на «запустить работу в с++»

Рис. 6Строится график аппроксимированной функции

4)Нажимаем на «очистить»

Рис. 7 Очищает окно графопостроителя

5)Вводим новые значения k n z и нажимаем «график»,затем на «запустить работу в с++»

Рис. 8 Рисует новую аппроксимированную функцию

8. Tecты

Рис. 9

Рис. 10

Рис. 11

Рис. 12

Рис.13

Список использованной литературы

1. Лекционные материалы (ИТ). Лектор : Петрова Н.Я.

2. Лекционные материалы (Электротехника) :Лектор : Буянов С.И.

3. Лекционные материалы(Математический анализ). Лектор : Малыгина О.А.

4. Теория с сайта mathprofi.ru

5. Теория с сайта wikipedia.org

6. http://www.butovo.com/

7. http://www.pvsm.ru/matlab

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.