• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Ряды Фурье

Матроскин

4846АМ
Почётный участник
Регистрация
7 Май 2010
Сообщения
1,941
Реакции
58
Баллы
0
Ряды Фурье

Дано: программа, высчитывающая ряды фурье
Ошибка: неверно вычисляет 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
 
Ничего не понял. Какие вообще могут быть ряды Фурье у непериодической (в данном случае - линейной) функции? Что-то новенькое.
 
как объяснил препод должно быть нечто такое http://upload.wikimedia.org/wikipedia/commons/e/e8/Periodic_identity_function.gif . Но сейчас, после курения литературы, я уже начинаю думать, что я его не правильно понял. Ладно, в курсовой их делать больше не надо, так что тему можно закрывать за ненадобностью.
 
как объяснил препод должно быть нечто такое...
А это это другое дело. Тут всё законно.
Ну не надо, так не надо, как сказал портной во время примерки, стирая рукой меловые отметки на платье заказчицы, которые поставил напротив сосков, предложив ей пришить там пуговки.
 
Возродим тему?
Есть задача, которая рассчитывает мгновенную производительность насоса. Есть задача, которая рассчитывает ряды фурье по определенной формуле. нужно преобразовать задачи так, чтобы ряды высчитывались для мгновенной производительности насоса. Подскажите, как мне это сделать?
ряды
Код:
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.
 
Ряды Фурье на столько всеобъемлющи, что с помощью них можно решить практически любую задачу. Даже посчитать мгновенную производительность насоса, разложив его в ряд. :D

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

Вложения

  • 2013-07-06_214232.webp
    2013-07-06_214232.webp
    29.3 KB · Просмотры: 56
  • 2013-07-06_145143.webp
    2013-07-06_145143.webp
    14.6 KB · Просмотры: 58
Назад
Сверху