Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 05.06.2013, 10:07   #1 (permalink)
Матроскин
4846АМ
 
Аватар для Матроскин
 
Регистрация: 07.05.2010
Сообщений: 1,941
Записей в дневнике: 22
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 3 сообщениях
Репутация: 7564
По умолчанию Ряды Фурье

Дано: программа, высчитывающая ряды фурье
Ошибка: неверно вычисляет 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.
Где я допустил ошибку?
__________________
Человек будет свободен до тех пор, пока дважды два равно четырем
Матроскин вне форума   Ответить с цитированием

Старый 05.06.2013, 10:07
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Вашего прочтения ждут аналогичные топики

Ряды: найти сумму, исследовать на сходимость

Старый 05.06.2013, 10:33   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ничего не понял. Какие вообще могут быть ряды Фурье у непериодической (в данном случае - линейной) функции? Что-то новенькое.
Vladimir_S вне форума   Ответить с цитированием
Старый 05.06.2013, 13:50   #3 (permalink)
Матроскин
4846АМ
 
Аватар для Матроскин
 
Регистрация: 07.05.2010
Сообщений: 1,941
Записей в дневнике: 22
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 3 сообщениях
Репутация: 7564
По умолчанию

как объяснил препод должно быть нечто такое http://upload.wikimedia.org/wikipedi...y_function.gif . Но сейчас, после курения литературы, я уже начинаю думать, что я его не правильно понял. Ладно, в курсовой их делать больше не надо, так что тему можно закрывать за ненадобностью.
__________________
Человек будет свободен до тех пор, пока дважды два равно четырем
Матроскин вне форума   Ответить с цитированием
Старый 05.06.2013, 13:59   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Матроскин Посмотреть сообщение
как объяснил препод должно быть нечто такое...
А это это другое дело. Тут всё законно.
Ну не надо, так не надо, как сказал портной во время примерки, стирая рукой меловые отметки на платье заказчицы, которые поставил напротив сосков, предложив ей пришить там пуговки.
Vladimir_S вне форума   Ответить с цитированием
Старый 06.07.2013, 16:36   #5 (permalink)
Матроскин
4846АМ
 
Аватар для Матроскин
 
Регистрация: 07.05.2010
Сообщений: 1,941
Записей в дневнике: 22
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 3 сообщениях
Репутация: 7564
По умолчанию

Возродим тему?
Есть задача, которая рассчитывает мгновенную производительность насоса. Есть задача, которая рассчитывает ряды фурье по определенной формуле. нужно преобразовать задачи так, чтобы ряды высчитывались для мгновенной производительности насоса. Подскажите, как мне это сделать?
ряды
Код:
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.
__________________
Человек будет свободен до тех пор, пока дважды два равно четырем
Матроскин вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 06.07.2013, 17:01   #6 (permalink)
Николай_С
Радиоинженер
 
Аватар для Николай_С
 
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 25,308
Записей в дневнике: 7
Сказал(а) спасибо: 292
Поблагодарили 219 раз(а) в 70 сообщениях
Репутация: 110185
По умолчанию

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

Уточните пожалуйста, как именно Вы пранируете расчитать мгновенную производительность насоса при помощи рядов Фурье. Желательно расписать алгоритм.
Николай_С вне форума   Ответить с цитированием
Старый 06.07.2013, 20:46   #7 (permalink)
Матроскин
4846АМ
 
Аватар для Матроскин
 
Регистрация: 07.05.2010
Сообщений: 1,941
Записей в дневнике: 22
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 3 сообщениях
Репутация: 7564
По умолчанию

Для первого графика (рис1) нужно построить такой же график как на рисунке 2 ряд 2 (на сколько я понял препода)
Миниатюры
2013-07-06_214232.png   2013-07-06_145143.png  
__________________
Человек будет свободен до тех пор, пока дважды два равно четырем
Матроскин вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.