Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mathematisches Problem (https://www.delphipraxis.net/87572-mathematisches-problem.html)

AMD_prozessor 2. Mär 2007 12:23


Mathematisches Problem
 
Hallo!

Wer kann mir hier helfen? Ich will den Grenzwert einer mit func übergebenen Funktion
berechnen. So weit, so gut. Aber beim Test mit der Funktion sin(x)/x die für x->oo
den Grenzwert 0 hat (laut Formelsammlung) erhalte ich sogar negative Werte. Das heißt,
wenn ich eine Anzahl Berechnungen mache, hört das Programm nicht bei 0 auf, sondern
berechnet mir danach negative Werte also den vermutlichen Grenzwert -oo
Wo liegt mein Fehler im Algo. Ich setze mal voraus, das meine Formelsammlung den
richtigen Grenzwert angibt. Also sollte mein Algo auch auf Grenzwert 0 kommen. Da
müsste mein Programm doch aber mit Rechnen aufhören, wenn die 0 erreicht ist.
Was mach ich also falsch?

Delphi-Quellcode:
//Hier noch die Funktion:
Type TDerivedFunc = function(X: RealType): RealType;

function SinXdivX(X: RealType): RealType;  //RealType = (Single,Double,Extended,Currency)
begin                                      //   |-----> wegen Rechengenauigkeit
  Result := (sin(X)/X)*(180/pi);
end;

function TValueTable.Limes(func: TDerivedFunc; X: RealType): RealType;
var          //|---------------->//ValueTable ist eine Tabelle auf TForm zur Ergebnisanz.
 i: Integer;                     //Laufvariable
 eps: RealType;                  //eps=>Minimaler Wert, der nicht unterschr. werden darf
 res: RealType;                  //Differenz zweier aufeinanderfolgender Ergebnisse
 buf: array[0..1] of RealType;   //Puffer für Differenzberechnung
 idx: Integer;                   //Index in diesen Puffer
begin
  i := 0;
  res := 0.1;
  eps := 0.0000001;              //Ergebnis darf nicht kleiner werden
  buf[0] := 0.0;                 //Anfangswerte in Puffer
  buf[1] := res;
  {$B+}
  while res > eps do
  begin
    res := Abs(buf[1]-buf[0]);   //Differenz berechnen
    if i mod 2 = 0 then idx := 0 else idx := 1;  //Pufferindex berechnen
    buf[idx] := func(X);         //aktuelles Ergebnis in Puffer
    inc(i);
  end;
  {$B-}
  Result := buf[idx];            //Ergebnis ausgeben
end;

AMD_prozessor 2. Mär 2007 12:40

Re: Mathematisches Problem
 
Hallo!

Tschuldigung!!! Die Grenzwertrechnung funzt so. Ich hatte statt der Limes() Funktion die SinXdivX Funktion in der Ausgabeschleife. So hier:

Delphi-Quellcode:
procedure TValueTable.ToolButton2Click(Sender: TObject);
var i: Integer; X: RealType;
begin
  //Grenzwertberechnung
  X := 0.1;
  for i := 1 to 100 do
  begin
    AddXValue(X);
    AddYValue( SinXdivX(X) ); //Hier kommen die negativen Zahlenwerte, weil nicht Grenzwert,
    AddTValue(i);            //sondern sin(x)/x berechnet wird
    inc(FTblRow);
    fTable.RowCount := fTable.RowCount + 1;
    X := X + 0.1;
  end;
end;
statt so hier, wie es richtigerweise sein muss:

Delphi-Quellcode:
procedure TValueTable.ToolButton2Click(Sender: TObject);
var i: Integer; X: RealType;
begin
  //Grenzwertberechnung
  X := 0.1;
  for i := 1 to 100 do
  begin
    AddXValue(X);
    AddYValue(  Limes(SinXdivX,X) ); //So ist es richtig. Jetzt stimmt auch das Ergebnis
    AddTValue(i);
    inc(FTblRow);
    fTable.RowCount := fTable.RowCount + 1;
    X := X + 0.1;
  end;
end;
So, nun funtzt das Ganze. Die Grenzwertberechnung ist also doch richtig.

Khabarakh 2. Mär 2007 12:53

Re: Mathematisches Problem
 
Hat(te) nicht wirklich etwas mit deinem Problem zu tun, aber:
Delphi-Quellcode:
  Result := (sin(X)/X)*(180/pi);
Du solltest statt die Gegenkathete ins Gradmaß (:stupid:) lieber den Winkel ins Bogenmaß umrechnen :zwinker: .
Delphi-Quellcode:
sin(x * Pi / 180) / x


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 Uhr.

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-2025 by Thomas Breitkreuz