Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2009, 14:56   #1
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию Ряд Фурье (Паскаль)

Программа написана в ПаскалеАВС. Проблема в том, что придираеться к индетификаторам.

Код:
uses
   GraphABC, CRT;

const
   pi   = 3.1417;
   { максимальна кiлькiсть доданкiв a_n та b_n}
   nMax = 200;
   { крок при обрахунку iнтеграла }
   step = 0.01;

var
   { масив коефiцiєнтiв a_n }
   a  : array [0..nMax] of real;
   { масив коефiцiєнтiв b_n }
   b  : array [1..nMax] of real;
   { кiлькiсть коефiцiєнтiв, що використовуються
     при поточному обрахунку значення функцii Фур'є }
   n  : byte;
   { зчитане значення натиснутої кнопки }
   ch : char;

   { iнiцiалiзацiя графiчного режиму - стандартно, взято з
     допомоги }

 procedure initGr;
   var
      grDriver : integer;
      grMode   : Integer;
      ErrCode  : Integer;
   begin
        grDriver:=Detect;
      InitGraph(grDriver, grMode, '');
      ErrCode:=GraphResult;
      { якщо графiчний режим не проiнiцiалiзовано - виводимо
        повiдомлення про помилку i виходимо з програми }
      If ErrCode <> grOk Then begin
         WriteLn('Error init graph: ', GraphErrorMsg(ErrCode));
         halt(1); { закiнчення роботи програми з кодом 1 }
      end;
   end;

   { обрахунок значення функцiї }
   { при перевiрцi використовувались кiлька функцiй - одна
     повинна бути обов'язково розкоментована }
   function f (x : real) : real;
        begin
      { f:=x*x+2*x; }
        f:=sin(x)+cos(x);
      { f:=x*x+3*x; }
       {f:=5*x+7;}
        end;

   { обрахунок значення функцiї Фур'є;
     в якостi вхiдного параметра передається кiлькiсть
     доданкiв a_n та b_n }
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...

Последний раз редактировалось МартинИ; 17.06.2009 в 14:58.
МартинИ вне форума Ответить с цитированием
Старый 17.06.2009, 14:58   #2
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию

продолжение

Код:
 
   { обрахунок значення функцiї Фур'є;
     в якостi вхiдного параметра передається кiлькiсть
     доданкiв a_n та b_n }
   function fFourie (x : real; n : byte) : real;
   var
      res : real;
      i   : byte;
   begin
      { записуємо значення a_0 }
      res:=a[0]/2;
      { обраховуємо з використанням послiдовно
        вiд a_1, b_1 до a_n, b_n }
      for i:=1 to n do
         res:=res+a[i]*cos(i*x)+b[i]*sin(i*x);
      { вертаємо обраховане значення }
      fFourie:=res;
   end;

   { побудова графiкiв;
     передається кiлькiсть доданкiв a та b при обрахунку ряду Фур'є }
   procedure plot (n : byte);
   var
      x,y,yf     : array [0..639] of real;
      max        : real;
      i,j        : integer;
      s          : string;
   begin
      { початкове значення абсциси - беремо iнтервал (-pi,pi) }
      x[0]:=-pi;
      { значення функцiї }
      y[0]:=f(x[0]);
      { записуємо початкове значення для визначення найбiльшого
        значення функцiї }
      max:=abs(y[0]);
      { значення функцiї Фур'є в точцi }
      yf[0]:=fFourie(x[0],n);
      { порiвнюємо з найбiльшим i - при необхiдностi - коригуємо }
      if abs(yf[0])>max then max:=abs(yf[0]);
      { проходимо по всiм абсцисам }
      for i:=1 to 639 do begin
         { масштабуємо абсцису з вiдрiзка [0,639] на вiдрiзок [-pi,pi] }
         x[i]:=-pi+2*pi/640*i;
         { знаходимо значення функцiї }
         y[i]:=f(x[i]);
         { коригуємо найбiльше значення }
         if abs(y[i])>max then max:=abs(y[i]);
         { знаходимо значення функцiї Фур'є }
         yf[i]:=fFourie(x[i],n);
         { коригуємо найбiльше значення }
         if abs(yf[i])>max then max:=abs(yf[i]);
      end;
      { очищуємо екран }
      clearDevice;
      { проводитимемо осi свiтло-сiрим кольором }
      setcolor(LIGHTGRAY);
      { будуємо осi }
      line(0,getmaxy div 2,getmaxx,getmaxy div 2);
      line(getmaxx div 2,0,getmaxx div 2,getmaxy);
      { будуємо графiк вихiдної функцiї }
      for i:=0 to 639 do begin
         putpixel(i,479-trunc(y[i]/max*getmaxy/2+480/2),BLUE);
      end;
      { будуємо графiк функцiї за Фур'є }
      for i:=0 to 639 do begin
         putpixel(i,479-trunc(yf[i]/max*480/2+480/2),RED);
      end;
      { для виводу напису кiлькостi коефiцiєнтiв a та b конвертуємо
        число в рядок }
      str(n,s);
      { формуємо напис виду "n=xxx"}
      s:='n='+s;
      { встановлюємо шрифт, спосiб виведення та розмiр шрифта }
      settextstyle(3,HorizDir,2);
      { виводимо напис на екран }
      outtextxy(5,450,s);
   end;

   { розрахунок коефiцiєнтiв ряду Фур'є;
     при обрахунку iнтегралiв використовуємо метод прямокутникiв }
   procedure calculateAB;
   var
      i,j : byte;
      x   : real;
   begin
      { початкове значення абсциси -pi+0.01}
      x:=-pi+step;
      { початкове значення коефiцiєнта a_0 }
      a[0]:=0;
      { знаходимо площу фiгури за методом прямокутникiв }
      while (x<=pi) do begin
         a[0]:=a[0]+f(x)*cos(0)*step;
         x:=x+step;
      end;
      { знаходимо кiнцеве значення a_0 }
      a[0]:=a[0]/pi;
      { аналогiчно шукаємо всi iншi по 200 коефiцiєнтiв a та b }
      for i:=1 to nMax do begin
         { початкове значення абсциси }
         x:=-pi+step;
         { початковi значення чергових коефiцiєнтiв }
         a[i]:=0;
         b[i]:=0;
         { знаходимо площi }
         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;
         { записуємо кiнцевi значення чергових коефiцiєнтiв }
         a[i]:=a[i]/pi;
         b[i]:=b[i]/pi;
      end;
   end;

begin
   { iнiцiалiзуємо графiчний режим }
   initGr;
   { обраховуємо коефiцiєнти ряду Фур'є }
   calculateAB;
   { спочатку беремо по 10 коефiцiєнтiв a_i та b_i
     плюс коефiцiєнт a_0}
   n:=10;
   { виводим графiк }
   plot(n);
   repeat
      { зчитуємо натиснуту клавiшу }
      ch:=readkey;
      { якщо була натиснута службова клавiша, наприклад, стрiлочка -
        першим буде прочитано 0, тому читаємо з буфера клавiатури ще раз }
      if ord(ch)=0 then ch:=readkey;
      { обробляємо натиснуту клавiшу }
      case ord(ch) of
      { натинуто стрiлку вгору - збiльшуємо кiлькiсть коефiцiєнтiв,
        але не бiльше 200 }
      72 : if (n<200) then inc(n);
      { натиснуто стрiлку вниз - зменшуємо кiлькiсть коефiцiєнтiв,
        але не менше 1 }
      80 : if (n>1) then dec(n);
      end;
      { виводимо графiки з новими параметрами }
      plot(n);
   { виконуємо дiї, поки не натиснуто ESC }
   until (ord(ch)=27);
   { виходимо з графiчного режиму }
   closeGraph;
end.
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...
МартинИ вне форума Ответить с цитированием
Старый 17.06.2009, 15:00   #3
МартинИ
Пользователь
 
Аватар для МартинИ
 
Регистрация: 23.12.2008
Сообщений: 47
По умолчанию

первую ошибку выбивает в строке, в детект

Код:
procedure initGr;
   var
      grDriver : integer;
      grMode   : Integer;
      ErrCode  : Integer;
   begin
        grDriver:=Detect;
Люди - отвратительные. Эгоистичные. Шумные. Говорят ерунду. А подумав еще немножко, понимаешь, что ты абсолютно такой же, если не хуже...
МартинИ вне форума Ответить с цитированием
Старый 18.06.2009, 11:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
МартинИ
Если компилировать в Turbo Pascal и заменить GraphABC на Graph
То ошибка появляется не в инициальзации графики а в зацикливании в одном из циклов процедуры calculateAB
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.06.2011, 16:28   #6
vitlav
Новичок
Джуниор
 
Регистрация: 12.05.2011
Сообщений: 2
По умолчанию

Адаптировал данную програму под Delphi. Проблема в том что не могу реализовать вывод графика каждой последующей гармоники, то есть если надо построить 5 гармоник то сначала строиться одна, две, ...пять гармоник, для визуальной наглядности приближения к заданной функции. Также возникли проблемы с изменением интервала функции. Может кто подскажит. Заранее благодарен.
vitlav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ряд Фурье(Delphi,график) menX Помощь студентам 1 23.04.2009 21:26
Фурье DeDoK Общие вопросы Delphi 0 12.09.2008 17:28
Ряд Тейлора . Паскаль Zond235 Паскаль, Turbo Pascal, PascalABC.NET 5 30.01.2008 01:42
задача:Паскаль и ряд чисел Фибоначчи SEREG@ Помощь студентам 20 16.12.2007 20:05