Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

[Алгоритм] Разложение функции в ряд Фурье

Страницы: 1
[Алгоритм] Разложение функции в ряд Фурье
Товарищи, помогите! Нужно реализовать на Delphi/Pascal программу, раскладывающую заданную функцию на определенном интервале в ряд Фурье. Нужен хотя бы программный алгоритм. Половину интернета перерыл, не нашел ни одной понятной и простой реализации этого... Сам в математике не силен smile:(
Изменено: Андрей - 19.12.2009 15:00:51
Да уж... высшая математика((( брр... как вспомню универ((( Там и вручную не сильно-то разложишь не говоря уж о простой реализации. Кстати, уточни, тебе нужно какую-то определенную посчитать или чтобы пользователь мог сам вводить исходные данные?
да это ещё ничего, мне как-то нужно было матрицу миллион столбцов, 2 строки возвести в "-1" степень, вот где горе было =)
попробую помочь, вы уточните насчёт данных функции
свободный страннык
Если посмотреть статью в Википедии http://ru.wikipedia.org/wiki/%D0%A0%D1%8F%D0%B4_%D0%A4%D1%83%D1%80%D1%­8C%D0%B5, то там видно, что для нахождения коэффициентов ряда нужно вычислять определенные интегралы. Поэтому, вроде бы проблема сводится к этому
Accende lumen sensibus, infude ainorem corbidus!
Вот прога в Паскале ABC:

uses
GraphABC, CRT;

const
pi = 3.1417;
nMax = 200;
step = 0.01;

var
a : array [0..nMax] of real;
b : array [1..nMax] of real;
n : byte;
ch : char;

procedure initGr;
var
grDriver : integer;
grMode : Integer;
ErrCode : Integer;
begin
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
ErrCode:=GraphResult;
If ErrCode <> grOk Then begin
WriteLn('Error init graph: ', GraphErrorMsg(ErrCode));
halt(1);
end;
end;

function f (x : real) : real;
begin
f:=sin(x)+cos(x);
end;

function fFourie (x : real; n : byte) : real;
var
res : real;
i : byte;
begin
res:=a[0]/2;
for i:=1 to n do
res:=res+a[i]*cos(i*x)+b[i]*sin(i*x);
fFourie:=res;
end;

procedure plot (n : byte);
var
x,y,yf : array [0..639] of real;
max : real;
i,j : integer;
s : string;
begin
x[0]:=-pi;
y[0]:=f(x[0]);
max:=abs(y[0]);
yf[0]:=fFourie(x[0],n);
if abs(yf[0])>max then max:=abs(yf[0]);
for i:=1 to 639 do begin
x[i]:=-pi+2*pi/640*i;
y[i]:=f(x[i]);
if abs(y[i])>max then max:=abs(y[i]);
yf[i]:=fFourie(x[i],n);
if abs(yf[i])>max then max:=abs(yf[i]);
end;
clearDevice;
setcolor(LIGHTGRAY);
line(0,getmaxy div 2,getmaxx,getmaxy div 2);
line(getmaxx div 2,0,getmaxx div 2,getmaxy);
for i:=0 to 639 do begin
putpixel(i,479-trunc(y[i]/max*getmaxy/2+480/2),BLUE);
end;
for i:=0 to 639 do begin
putpixel(i,479-trunc(yf[i]/max*480/2+480/2),RED);
end;
str(n,s);
s:='n='+s;
settextstyle(3,HorizDir,2);
outtextxy(5,450,s);
end;

procedure calculateAB;
var
i,j : byte;
x : real;
begin
x:=-pi+step;
a[0]:=0;
while (x<=pi) do begin
a[0]:=a[0]+f(x)*cos(0)*step;
x:=x+step;
end;
a[0]:=a[0]/pi;
for i:=1 to nMax do begin
x:=-pi+step;
a[i]:=0;
b[i]:=0;
while (x<=pi) do begin
a[i]:=a[i]+f(x)*cos(i*x)*step;
b[i]:=b[i]+f(x)*sin(i*x)*step;
x:=x+step;
end;
a[i]:=a[i]/pi;
b[i]:=b[i]/pi;
end;
end;

begin
initGr;
calculateAB;
n:=10;
plot(n);
repeat
ch:=readkey;
if ord(ch)=0 then ch:=readkey;
case ord(ch) of
72 : if (n<200) then inc(n);
80 : if (n>1) then dec(n);
end;
plot(n);
until (ord(ch)=27);
closeGraph;
end.
Cyber
Евгений Хлёбас, что ж вы так... даже не отструктурировали не читается
Да некогда было,так скопировалось smile:D
Cyber
Ну ладно мы с вами понимаем что да как,а кому то наверное не понятно,не примите за замечание,это я так к слову smile;)
Ну помоему сдесь все прекрасно понимают о чём речь,так что не будем вдаваться в подробности,кому надо тот наверняка разберёться smile;)
Cyber
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)