Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Ряды Фурье (http://www.tehnari.ru/f43/t88773/)

Матроскин 05.06.2013 10:07

Ряды Фурье
 
Дано: программа, высчитывающая ряды фурье
Ошибка: неверно вычисляет a0 b0
Код:
Код:

Program ryad;
const aa=-Pi; bb=Pi; nn=20; eps=1e-3;
var a0,ak,bk:real;
    k:integer;
    a,b:array[1..nn] of real;
function f(x:real):real;
begin
f:=x+Pi
end;
function integ (c,k:integer):real;
 var x, xn, dx, s, ss, e :real;
    i, n:integer;
begin
dx:=bb-aa;
n:=1;
repeat
ss:=s;
s:=0;
n:=n*2;
dx:=dx/2;
x:=aa;
for i:=1 to n do
      begin
      xn:=x+dx;
      case c of
      0: s:=s+((1/Pi)*(f(x)+f(xn))/2*dx);
      1: s:=s+((1/Pi)*(f(x)*cos(k*x)+f(xn)*cos(k*xn))/2*dx);
      2: s:=s+((1/Pi)*(f(x)*sin(k*x)+f(xn)*sin(k*xn))/2*dx);
      end;
      x:=x+dx;
      end;
if abs(s)>(1/1000) then e:=abs((ss-s)/s)
else
begin
e:=0;
s:=0;
end;
until e<eps;
integ:=s
end;
begin
a0:=integ (0,0);
writeln(a0);
for k:=1 to nn do
begin
a[k]:=integ(1,k);
write('ak ', a[k]);
b[k]:=integ(2,k);
writeln(' bk ', b[k]);
end;
end.

Где я допустил ошибку? tehnobanka

Vladimir_S 05.06.2013 10:33

Ничего не понял. Какие вообще могут быть ряды Фурье у непериодической (в данном случае - линейной) функции? Что-то новенькое.

Матроскин 05.06.2013 13:50

как объяснил препод должно быть нечто такое http://upload.wikimedia.org/wikipedi...y_function.gif . Но сейчас, после курения литературы, я уже начинаю думать, что я его не правильно понял. Ладно, в курсовой их делать больше не надо, так что тему можно закрывать за ненадобностью.

Vladimir_S 05.06.2013 13:59

Цитата:

Сообщение от Матроскин (Сообщение 914724)
как объяснил препод должно быть нечто такое...

А это это другое дело. Тут всё законно.
Ну не надо, так не надо, как сказал портной во время примерки, стирая рукой меловые отметки на платье заказчицы, которые поставил напротив сосков, предложив ей пришить там пуговки.

Матроскин 06.07.2013 16:36

Возродим тему?
Есть задача, которая рассчитывает мгновенную производительность насоса. Есть задача, которая рассчитывает ряды фурье по определенной формуле. нужно преобразовать задачи так, чтобы ряды высчитывались для мгновенной производительности насоса. Подскажите, как мне это сделать?
ряды
Код:

const ee=0.001; aa=0; bb=Pi; period=bb-aa; II=0.003;
var kk,nn:integer; f1,f2:text; a0,t,dt,St,Ampl,phi,I,I2:real; ak,bk:array [1..100] of real;

function f(t:real):real;
 begin
  if (t>=0) and (t<1) then f:=t;
  if (t>=1) and (t<2) then f:=1;
  if (t>=2) then f:=6-2*t;
 end;

function Si(c,kk:integer):real;
var t,dt,e,ss,s:real; z:integer;
 begin
  dt:=(bb-aa)/50;
  repeat
  ss:=s;
  dt:=dt/2;
  case c of
  1: s:=f(aa)+f(bb);
  2: s:=f(aa)*cos(2*Pi*kk*aa/period)+f(bb)*cos(2*Pi*kk*bb/period);
  3: s:=f(aa)*sin(2*Pi*kk*aa/period)+f(bb)*sin(2*Pi*kk*bb/period);
  4: s:=f(aa)*f(aa)+f(bb)*f(bb);
  end;
  t:=aa+dt;
  z:=-1;
  while t<bb do
  begin
    z:=-z;
    case c of
    1: s:=s+f(t)*(3+z);
    2: s:=s+f(t)*cos(2*Pi*kk*t/period)*(3+z);
    3: s:=s+f(t)*sin(2*Pi*kk*t/period)*(3+z);
    4: s:=s+f(t)*f(t)*(3+z);
    end;
    t:=t+dt;
  end;
  s:=2*s*dt/3/period;
  if abs(s)<ee then  begin
                                    s:=0;
                                    e:=0;
                                  end
  else e:=abs((ss-s)/s);
  until e<=ee;
  Si:=s;
 end;

begin
 a0:=Si(1,0);
 I:=Si(4,kk)/2-sqr(a0)/4;
 writeln(' k    a[k]    b[k]      I    Amplituda  phi');
 assign(f1,'F:\af.txt');
 rewrite(f1);
  repeat
  nn:=nn+1;
  ak[nn]:=Si(2,nn);
  write(nn:2,ak[nn]:9:4);
  bk[nn]:=Si(3,nn);
  write(bk[nn]:9:4);
  I2:=sqr(ak[nn])+sqr(bk[nn]);
  Ampl:=sqrt(sqr(ak[nn])+sqr(bk[nn]));
  if (ak[nn]>0) and (bk[nn]>0) then phi:=arctan(ak[nn]/bk[nn]);
  if (ak[nn]>0) and (bk[nn]<0) then phi:=arctan(ak[nn]/bk[nn])+pi;
  if (ak[nn]>0) and (bk[nn]=0) then phi:=pi/2;
  if (ak[nn]<0) and (bk[nn]>0) then phi:=arctan(ak[nn]/bk[nn])+2*pi;
  if (ak[nn]<0) and (bk[nn]<0) then phi:=arctan(ak[nn]/bk[nn])+pi;
  if (ak[nn]<0) and (bk[nn]=0) then phi:=3*pi/2;
  if (ak[nn]=0) and (bk[nn]>0) then phi:=0;
  if (ak[nn]=0) and (bk[nn]<0) then phi:=pi;
  if (ak[nn]=0) and (bk[nn]=0) then writeln('net');
  I:=I-I2/2; write(I:8:4);
  write(Ampl:9:2);
  writeln(phi*180/pi:8:0);
  writeln(f1,nn:2,ak[nn]:8:4,bk[nn]:8:4,Ampl:7:2,phi*180/pi:9:0);
  until I<=II;
 dt:=(period)/(40*nn);
 t:=aa;
 assign(f2,'F:\furie.txt');
 rewrite(f2);
 while t<=bb do
  begin
  St:=a0/2;
  for kk:=1 to nn do
  St:=St+ak[kk]*cos(2*pi*kk*t/period)+bk[kk]*sin(2*pi*kk*t/period);
  writeln(f2,' ',t:0:5,' ',f(t):0:5,' ',St:0:5);
  t:=t+dt;
  end;
 close(f1); close(f2);

 writeln('n=',nn);
end.

Производительность насоса
Код:

program practica1;
var fi, fik,delFi,C2,q,min,sig,max,dp,hmax:real;
    k:integer;
    txt:text;
const z=9;qsr=20;n=3000;v=qsr*1000/n;omg=Pi*n/30;kh=1.1;B=2*Pi/z;

begin
assign (txt, 'C:\Users\user\Desktop\ïðàêòèêà\result4.txt');
rewrite (txt);
dp:=power(((4*v)/(kh*Pi*z)),1/3);
hmax:=kh*dp;
C2:=(Pi*sqr(dp)/4)*(hmax/2)*omg;
delFi:=2*Pi/(2*z*40);
min:=1000;
fi:=0;

while fi <=2*Pi do
      begin
      q:=0;
for k:=1 to z do
begin
      Fik:=fi+(k-1)*B;
      if sin(fik)>=0 then q:=q+sin(fik);
end;
q:=q*C2;
writeln(fi*180/pi,' ',q);
write(txt, fi*180/pi, ' ',q);
writeln (txt);
if q > max then max:=q;
if min > q then min:=q;
fi:=fi+delFi;
end;
sig:=((max-min)/max)*100;
writeln (sig);
close (txt);
end.


Николай_С 06.07.2013 17:01

Ряды Фурье на столько всеобъемлющи, что с помощью них можно решить практически любую задачу. Даже посчитать мгновенную производительность насоса, разложив его в ряд. :D

Уточните пожалуйста, как именно Вы пранируете расчитать мгновенную производительность насоса при помощи рядов Фурье. Желательно расписать алгоритм.

Матроскин 06.07.2013 20:46

Вложений: 2
Для первого графика (рис1) нужно построить такой же график как на рисунке 2 ряд 2 (на сколько я понял препода)


Часовой пояс GMT +4, время: 22:43.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.