![]() |
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; |
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:
statt so hier, wie es richtigerweise sein muss:
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;
Delphi-Quellcode:
So, nun funtzt das Ganze. Die Grenzwertberechnung ist also doch richtig.
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; |
Re: Mathematisches Problem
Hat(te) nicht wirklich etwas mit deinem Problem zu tun, aber:
Delphi-Quellcode:
Du solltest statt die Gegenkathete ins Gradmaß (:stupid:) lieber den Winkel ins Bogenmaß umrechnen :zwinker: .
Result := (sin(X)/X)*(180/pi);
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