Registriert seit: 6. Dez 2005
999 Beiträge
|
Re: Quadratische Gleichungen vollständig lösen
29. Jan 2010, 20:10
Zitat von Wolfgang Mix:
...
Leider habe ich kein Mathlab, wäre deswegen aber dankbar für zu prüfende
Koeffitienten a,b und c mit demonstrativ ungenauen und genaueren
Ergebnissen.
Testfälle kann man einfach selbstbasteln. Hier ein kleines Beispiel:
Mit a=10^n, b=-2*10^n+2, c=10^n+2, also zB a=1000, b=-2002, c=1002. Mit den Deinen Bezeichnungen sind die Lösungen X1=1, X2=1+2/10^n und die Diskriminante D=1/10^(2n), und dies sind die Rechenergebnisse (erste Spalte ist n):
Code:
1 X1=1,2 X2=0,999999999999999 D=0,0100000000000002
2 X1=1,02 X2=1 D=0,0001
3 X1=1,00199999999989 X2=1,00000000000011 D=9,99999999777763E-7
4 X1=1,0002 X2=1 D=1,0000000000049E-8
5 X1=1,0000200000111 X2=0,999999999988896 D=1,00000222078706E-10
6 X1=1,00000199988897 X2=1,00000000011103 D=9,99777951399272E-13
7 X1=1,00000020110428 X2=0,999999998895723 D=1,02220749226278E-14
8 X1=1,00000001 + 1,10490345560989E-8 i
X2=1,00000001 - 1,10490345560989E-8 i
D=-1,22081164621868E-16
Sie zeigen auch schön, daß die Berechnung der Diskriminante der kritische Teil ist (mit der nicht gekürzten Formal ist sie immer b^2-4ac = 4!), und daß der Fehler in den Lösungen langsam nach "vorn kriecht" und ab n=8 reicht die genauigkeit nicht mehr aus.
Ich meine, daß im Rahmen der Delphi-Praxis und als Basis für ein Tutorial Deine jetzige Berechnungsroutine ausreicht. Wie schon von anderen gesagt, finde ich allerdings auch mM das Interface (also die Parameterübergabe) verbesserungswürdig.
In dem von Dir angehängten PDF wird zB vorgegeben:
procedure SolveQuadraticEquation(var Anzahl: integer; var IstKomplex: boolean; var x1,x2: double);
Ich verwende in meiner QuadSolv- Unit folgende Funktionen:
Delphi-Quellcode:
function squad(a,b,c: double; var x1,y1,x2,y2: double): integer;
{-Solve the quadratic equation a*x^2 + b*x + c = 0. Result is the number}
{ of different solutions: 0 (if a=b=0), 1 (x1), or 2 (x1,x2). If the}
{ result is = -2, x1+i*y1 and x2+i*y2 are the two complex solutions.}
{ No precautions against over/underflow, NAN/INF coefficients return 0.}
function squadx(a,b,c: double; var x1,y1,x2,y2: double): integer;
{-Solve the quadratic equation a*x^2 + b*x + c = 0. Result is the number}
{ of different solutions: 0 (if a=b=0 or INF/NAN), 1 (x1), or 2 (x1,x2).}
{ If the result is = -2, then x1 + i*y1 and x2 + i*y2 are the two complex}
{ solutions. Uses scaling by powers of two to minimize over/underflows.}
function squad_selftest: integer;
{-Selftest for squad core routine, result=0 if OK, else number of the}
{ failing test case.}
|