Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Entwicklung der Sinus-Funktion in einer Taylor-Reihe (https://www.delphipraxis.net/143749-entwicklung-der-sinus-funktion-einer-taylor-reihe.html)

fh_beng 28. Nov 2009 18:08

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
@Wolfgang

ich sitze schon seit stunden daran und komme einfach nicht weiter.. :roll:

Da ich mit dem Stoff noch nicht super "angefreundet" bin habe ich ein Verständnisproblem. Daher wollte ich dich noch mal um Hilfe bitten.

Kann ich die Potenzfunktion und die Umwandlung "radtodeg" unter "Button1Click" durchführen oder muss ich das anders machen?


So habe ich etwas versucht zu gestalten..
Delphi-Quellcode:
  function RadToDeg(const Radians: Extended): Extended;
    var rad,grad:real;

      begin
      grad:=rad*(80/pi);
      end;
Welche Reihenfolge sollte ich am besten angehen. Ich hatte an sowas gedacht:

-> Variablen deklarieren
-> Imagefeld mit einer Mittellinie
-> Rad in Grad umwandeln
-> Potenzfunktion für sinus erstellen
-> Zählen der ButtonClicks
-> Ausgeben in einem Imagefeld
-> Ausgeben in einem memofeld
-> .....??

Wolfgang Mix 28. Nov 2009 18:41

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
Delphi-Quellcode:
grad:=rad*(180/pi)
die Funktionen, die Du benötigst, hast Du ja schon alle aus dem Link und darfst sie auch benutzten.

Vorsichtshalber würde ich in Kommentaren die Quelle angeben, dann ist alles legal.
Im Button1.Click deklarierst nur Deine eigenen Variablen und rufst die Funktionen einfach auf.
Ich hoffe damit kommst Du erstmal weiter, sonst arbeiten wir an Deinem Quelltext.

PS: Warum tut Ihr drei Euch nicht einfach zusammen?

Delphi-Quellcode:
implementation

{$R *.dfm}
//====================My_Math_Functions==============
//Quelle : [url]http://www.gohelmut.de/informatik/[/url]
//delphi11_1/mymathfunctions.php
function my_fakultaet(n:integer):real;
Var i:Integer; s:real;
Begin
   s:=1;
   for i:=1 to n do s:=s*i;
   result:=s;
End;

function my_pow(x:real;n:integer):real;
Var s:real;i:integer;
Begin
   s:=1;
   if n>0 then for i:=1 to n do s:=s*x;
   result:=s;
End;

function my_exp(x:real):real;
Var s,ds,fak:real;
    i:integer;
Begin
   s:=1; fak:=1;
   for i:=1 to steps do
   begin
      fak:=fak*i;
      ds:=my_pow(x,i)/fak;
      s:=s+ds;
   end;
   my_exp:=s;
End;

function my_rpow(x,y:real):real;
Begin
   my_rpow:=my_exp(my_ln(x)*y);
End;

function my_root(x:real;n:integer):real;
Begin
   my_root:=my_exp(my_ln(x)/n);
End;

function my_sin_rad(x:real):real;
Var i,j:integer; s,ds:real;
Begin
   s:=x;
   for i:=1 to steps do
   begin
      j:=2*i+1;
      ds:=power(-1,i)*power(x,j)/my_fakultaet(j);
      s:=s+ds;
   end;
   my_sin_rad:=s;
End;

function my_sin_grad(x:real):real;
Begin
   my_sin_grad:=my_sin_rad(x*my_pi/180);
End;


procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   // Dein Code
end;

end.
[Edit] my_root kann weg, wird ja nicht benötigt [/Edit]

fh_beng 29. Nov 2009 00:42

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
Alles klar, ich habe die Funktionen nun benutzt. Da stieß wieder an einem kleinem Problem. Die benutzung von "power" klappt bei mir nicht so wie erwünscht. Ich dachte, dass es Delphi automatisch erkennt und zugewiesen bekommt?!

Bei mir kommt egal was ich versucht habe, diese Fehlermeldung:
[Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'power'


ps.: Womöglich kennen wir uns nicht, daher das Problem mit zusammen setzen ;-)

DeddyH 29. Nov 2009 00:44

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
Füge einmal die Unit math in der uses-Klausel hinzu.

Wolfgang Mix 29. Nov 2009 10:37

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
@Detlef schrieb:
Zitat:

Füge einmal die Unit math in der uses-Klausel hinzu.
...oder benutze die "eigenen" Funktionen aus Post #21.


Gruß

Wolfgang

DeddyH 29. Nov 2009 10:46

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
Die kommen in der Form aber auch nicht ohne math aus.
Zitat:

Delphi-Quellcode:
ds:=power(-1,i)*power(x,j)/my_fakultaet(j);

;)

helgew 29. Nov 2009 11:06

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
klar gehts ohne unit math, ist doch Sinn und Zweck der Reihenentwicklung, nicht? Nunja, vielleicht ist die Vorgehensweise etwas unklar, aber das Vorgehen ist von Taylorreihenentwicklung nicht so grundverschieden - es wird nur noch eins draufgesetzt und nach dem Abbrechen nochmal gefittet :cyclops:

Taylorreihenentwicklung ist jedoch *ein* Standardverfahren, eine Funktion nach einem Polynom zu entwickeln, nur so um dem Threadtitel noch etwas Praxisrelevanz einzuhauchen

DeddyH 29. Nov 2009 11:08

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
Es hat ja auch niemand etwas Gegenteiliges behauptet.

Wolfgang Mix 29. Nov 2009 11:31

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
@Vorredner:

Ihr habt beide recht.
Die Zeilen mit
Delphi-Quellcode:
ds:=power(-1,i)*power(x,j)/my_fakultaet(j);
hatte ich übersehen. Das geht natürlich auch mit einer eigenen Power-Funktion.

[Edit] In der Originalquelle wurde Math.Power dazu benutzt, verschiedene Delphi-Funktionen
mit Funktionen zu vergleichen, die mit Taylorreihen gecodet wurden. Ansonsten läüft das ganze
natürlich auch ohne die Unit Math. [/Edit]

fh_beng 29. Nov 2009 13:16

Re: Entwicklung der Sinus-Funktion in einer Taylor-Reihe
 
vielen vielen Dank, das Problem mit der "power" Funktion habe ich nun beheben können. (das hätte auch unser Prof. auch wirklich sagen können;-) )


Bis jetzt habe ich nur das hier erstellen können...
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, math, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    function my_fakultaet(n:integer):real;
    function my_pow(x:real;n:integer):real;
    function my_exp(x:real):real;
    function my_ln (x:real):real;
    function my_rpow(x,y:real):real;
    function my_root(x:real;n:integer):real;
    function my_pi:real;
    function my_sin_rad(x:real):real;
    function my_sin_grad(x:real):real;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  steps:integer=10;

implementation

{$R *.dfm}

function Tform1.my_fakultaet(n:integer):real;
Var i:Integer; s:real;
  Begin
    s:=1;
    for i:=1 to n do s:=s*i;
    result:=s;
  End;

function Tform1.my_pow(x:real;n:integer):real;
Var i:integer; s,ds:real;
  Begin
    s:=1;
    if n>0 then for i:=1 to n do s:=s*x;
    result:=s;
  End;

function Tform1.my_exp(x:real):real;
Var i:integer; s,ds,fak:real;
  Begin
    s:=1; fak:=1;
    for i:=1 to steps do
    begin
      fak:=fak*i;
      ds:=my_pow(x,i)/fak;
      s:=s+ds;
    end;
    my_exp:=s;
  End;

function Tform1.my_ln (x:real):real;
Var i,n:integer; s,ds:real;
  Begin
  s:=0;
  for i:=1 to steps do
    begin
      n:=2*i-1;
      ds:=(x-1)/(x+1);
      ds:=my_pow(ds,n)*1/n;
      s:=s+ds;
    end;
    my_ln:=s*2;

  End;

function Tform1.my_rpow(x,y:real):real;
Var i:integer; s,ds:real;
  Begin
    my_rpow:=my_exp(my_ln(x)*y);
  End;

function Tform1.my_root(x:real;n:integer):real;
Var i:integer;
  Begin
    my_root:=my_exp(my_ln(x)/n);
  End;

function Tform1.my_pi :real;
Var i:integer; s,ds:real;
  Begin
    s:=1;
    for i:=1 to steps do
      begin
        ds:=power(-1,i)/((2*i+1)* power(3,i));
        s:=s+ds;
      end;
      my_pi:=6/sqrt(3)*s;

  End;

function Tform1.my_sin_rad(x:real):real;
Var i,j:integer; s,ds:real;
  Begin
    s:=x;
    for i:=1 to steps do
    begin
      j:=2*i+1;
      ds:=power(-1,i)*power(x,j)/my_fakultaet(j);
      s:=s+ds;
    end;
    my_sin_rad:=s;
  End;

function Tform1.my_sin_grad(x:real):real;
Var i:integer;
  Begin
    my_sin_grad:=my_sin_rad(x*my_pi/180);
  End;


procedure TForm1.Button1Click(Sender: TObject);
Var grad,rad,s,ds:real;
    x,xm,y,
      i,
      h,
      xoffset,
      yoffset,
      ix,
      iy,
      endwert
                :integer;
      kopfstand :boolean;

      deltay,
      ydiffz,
      ymin,
      ymax,
      omega,
      sy,
      t
                :double;

begin
   grad:=rad*(180/pi);
   image1.picture:=nil;
   x:=0;
   y:=image1.Height div 2;
   xm:=image1.width;
   image1.Canvas.moveto(x,y);
   image1.canvas.lineto(xm,y);



  begin
  kopfstand:=true;
  omega:=2;
  h:=image1.Height;
  ymin:=-1.1;
  ymax:=1.1;
  ydiffz:=ymax-ymin;
  deltay:=ydiffz/h;
  xoffset:=10;
  yoffset:=h div 2;

  with image1.Canvas do
    begin
    moveto(x,0);
    lineto(x,h);
    moveto(x,y);
    lineto(image1.width,y);
    pen.color:=clblack;
  end;

  Endwert:=trunc(2*pi/0.02/omega);
  for i:=0 to endwert do
    begin
    t:=i*0.02;
    sy:=sin(omega*t);
    x:=i;
    y:=trunc(sy/deltay);
    ix:=trunc(x+xoffset);
    with image1.canvas do
      begin
      if kopfstand then
        begin
        y:=h-y;
        iy:=trunc(y-yoffset)
      end
      else iy:=trunc(y+yoffset);
      if i=0 then
            moveto(ix,iy)
          else
            lineto(ix,iy);
      end;
  end;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
  begin
  image1.Picture:=nil;
  end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz