Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > 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
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 25,368
Сказал(а) спасибо: 246
Поблагодарили 468 раз(а) в 148 сообщениях
Репутация: 80483
По умолчанию

Ничего не понял. Какие вообще могут быть ряды Фурье у непериодической (в данном случае - линейной) функции? Что-то новенькое.
__________________
With Mozilla Firefox - straight to communism!
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
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 25,368
Сказал(а) спасибо: 246
Поблагодарили 468 раз(а) в 148 сообщениях
Репутация: 80483
По умолчанию

Цитата:
Сообщение от Матроскин Посмотреть сообщение
как объяснил препод должно быть нечто такое...
А это это другое дело. Тут всё законно.
Ну не надо, так не надо, как сказал портной во время примерки, стирая рукой меловые отметки на платье заказчицы, которые поставил напротив сосков, предложив ей пришить там пуговки.
__________________
With Mozilla Firefox - straight to communism!
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)
Николай_С
Member
 
Аватар для Николай_С
 
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 18,458
Записей в дневнике: 7
Сказал(а) спасибо: 186
Поблагодарили 163 раз(а) в 51 сообщениях
Репутация: 67075
По умолчанию

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

Уточните пожалуйста, как именно Вы пранируете расчитать мгновенную производительность насоса при помощи рядов Фурье. Желательно расписать алгоритм.
Николай_С вне форума   Ответить с цитированием
Старый 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, время: 00:14.

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