Autor Wiadomość
Linka
PostWysłany: Wto 15:05, 27 Lis 2007    Temat postu: Metody Numeryczne - Zajecia

To co dzis na zajeciach mamy zrobic:)


Kod:
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
 y, yr                 : array[1..1000] of single;
 sum_sin, sum_cos, amp : array [0..500] of single;
 xx,yy, aa                 : double;
 i,n,j                 : integer;
 plik, wynik           : textfile;
begin
 n:=1000;
 //assignfile(plik,'c:\fou_dane.txt');
 //assignfile(wynik,'c:\fou_dane_wyn.txt');
 //rewrite(plik);
 //rewrite(wynik);
// generowanie danych
 //form1.series2.clear;
 aa:=0.0;
 for i:=1 to n do
   begin
    xx       := i*0.1;
    yy       := xx+aa;
    if yy>3 then aa:=aa-3;
    y[i]   := yy;
    //writeln(plik,yy);
    //form1.series2.addxy(xx,yy,'',clred);
    form1.Canvas.pixels[i,trunc(abs(yy)*10)]:=clred;
    //form1.Canvas.rectangle(i,trunc(abs(yy)*10),i+5,trunc(abs(yy)*10)+5);
   end;
  //closefile(plik);
// obliczanie współczynników
  for j := 1 to (n div 2) - 1 do
   begin
    sum_sin[j] := 0.0;
    sum_cos[j] := 0.0;
    for i := 1 to n do
     begin
       sum_sin[j] := sum_sin[j] + y[i]*sin(2*pi*j*i/n);
       sum_cos[j] := sum_cos[j] + y[i]*cos(2*pi*j*i/n);
     end;
    sum_sin[j] := sum_sin[j]*2/n;
    sum_cos[j] := sum_cos[j]*2/n;
   end;
// obliczenia zerowych współczynników
  sum_sin[0] := 0.0;
  sum_cos[(n div 2)] := 0.0;
  for i := 1 to n do
    begin
      sum_sin[0] := sum_sin[0] + y[i];
      sum_cos[(n div 2)] := sum_cos[(n div 2)] + y[i]*cos(pi*i);
    end;
  sum_sin[0] := sum_sin[0]/n;
  sum_cos[0] := 0.0;
  sum_cos[(n div 2)] := sum_cos[(n div 2)]/n;
  sum_sin[(n div 2)] := 0.0;
// wydruk widma
  //form1.series1.clear;
  for j:=1 to (n div 2) do
    begin
      amp[j]:=sqrt(sqr(sum_sin[j])+sqr(sum_cos[j]));
      xx:=j;
      yy:=amp[j];
      //writeln(wynik,yy);
      //form1.series1.addxy(xx,yy,'',clred);
      form1.Canvas.pixels[i,trunc(abs(yy)*10)]:=clred;
    end;
   //closefile(wynik);
// rekonstrukcja
  for i:=1 to n do
    begin
      yr[i]:= 0.0;
//for j:=1 to (n div 2) do
      for j:=100 to 150 do
       yr[i]:=yr[i] + sum_sin[j]*sin(2*pi*j*i/n)+ sum_cos[j]*cos(2*pi*j*i/n);
      yr[i]:=yr[i]+sum_sin[0];
    end;
  //form1.series3.clear;
  for i:=1 to n do
    begin
      xx := i;
      yy := yr[i];
      //form1.series3.addxy(xx,yy,'',clred);
      form1.Canvas.pixels[i,trunc(abs(yy)*10)]:=clred;
    end;
 end;

end.



wersja zmieniona:) :

Kod:

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
 y, yr                 : array[1..1000] of single;
 sum_sin, sum_cos, amp : array [0..500] of single;
 xx,yy, aa                 : double;
 i,n,j                 : integer;
 plik, wynik           : textfile;
begin
 n:=1000;
 //assignfile(plik,'c:\fou_dane.txt');
 //assignfile(wynik,'c:\fou_dane_wyn.txt');
 //rewrite(plik);
 //rewrite(wynik);
// generowanie danych
 //form1.series2.clear;
 aa:=0.0;
 for i:=1 to n do
   begin
    xx       := i*0.1;
    //yy       := xx+aa;
    //if yy>3 then aa:=aa-3;
    yy:=3.0*sin(xx)+cos(5.0*xx);
    y[i]   := yy;
    //writeln(plik,yy);
    //form1.series2.addxy(xx,yy,'',clred);
    form1.Canvas.pixels[i,trunc(abs(yy)*10)]:=clred;
    //form1.Canvas.rectangle(i,trunc(abs(yy)*100),i+5,trunc(abs(yy)*100)+5);
   end;
  //closefile(plik);
// obliczanie współczynników
  for j := 1 to (n div 2) - 1 do
   begin
    sum_sin[j] := 0.0;
    sum_cos[j] := 0.0;
    for i := 1 to n do
     begin
       sum_sin[j] := sum_sin[j] + y[i]*sin(2*pi*j*i/n);
       sum_cos[j] := sum_cos[j] + y[i]*cos(2*pi*j*i/n);
     end;
    sum_sin[j] := sum_sin[j]*2/n;
    sum_cos[j] := sum_cos[j]*2/n;
   end;
// obliczenia zerowych współczynników
  sum_sin[0] := 0.0;
  sum_cos[(n div 2)] := 0.0;
  for i := 1 to n do
    begin
      sum_sin[0] := sum_sin[0] + y[i];
      sum_cos[(n div 2)] := sum_cos[(n div 2)] + y[i]*cos(pi*i);
    end;
  sum_sin[0] := sum_sin[0]/n;
  sum_cos[0] := 0.0;
  sum_cos[(n div 2)] := sum_cos[(n div 2)]/n;
  sum_sin[(n div 2)] := 0.0;
// wydruk widma
  //form1.series1.clear;
  for j:=1 to (n div 2) do
    begin
      amp[j]:=sqrt(sqr(sum_sin[j])+sqr(sum_cos[j]));
      xx:=j;
      yy:=amp[j];
      //writeln(wynik,yy);
      //form1.series1.addxy(xx,yy,'',clred);
      memo1.lines.add(floattostr(yy));
      //form1.Canvas.pixels[j,trunc(abs(yy)*1000)+100]:=clred;
      form1.Canvas.rectangle(j,trunc(abs(yy)*1000)+100,j+5,trunc(abs(yy)*1000)+100+5);
    end;
   //closefile(wynik);
// rekonstrukcja
  for i:=1 to n do
    begin
      yr[i]:= 0.0;
for j:=1 to (n div 2) do
      //for j:=100 to 150 do
       yr[i]:=yr[i] + sum_sin[j]*sin(2*pi*j*i/n)+ sum_cos[j]*cos(2*pi*j*i/n);
      yr[i]:=yr[i]+sum_sin[0];
    end;
  //form1.series3.clear;
  for i:=1 to n do
    begin
      xx := i;
      yy := yr[i];
      //form1.series3.addxy(xx,yy,'',clred);
      form1.Canvas.pixels[i,trunc(abs(yy)*10)+300]:=clblue;
      //form1.Canvas.rectangle(i,trunc(abs(yy)*100),i+5,trunc(abs(yy)*100)+5);
    end;
 end;

Powered by phpBB © 2001, 2005 phpBB Group