| |
|
|
p.specht
| Ein Algorithmus aus den Urschleimzeiten der Mathematik, als verschiedene Funktionen überhaupt erstmals - zumindest numerisch - gelöst werden konnten. Damals versuchte man, sich durch händische Berechnung mittels Pergament und Federkiel an die Lösungen heranzutasten. Pech, wenn es gleich mehrere Lösungen gab - man erhielt, abhängig vom Startwert, immer nur eine davon. Daher auch der Name "Falsche Regel".
WindowTitle "Regula falsi: Nullstellensuche circa Sekanten-Abschnitte"
' Abt. "Historische Algorithmen"
' (D) Demoware Mai 2012 P. Specht; Ohne jedwede Gewähr!!!
' Gleichungslösung durch "Herantasten", Indikator: Fehlerkurvenanstieg
' Verwendet hier gerade die proc Formel_1
' Startwert ist verantwortlich, zu welcher einzelnen Lösung
' von ggf. mehreren Lösungen der Algorithmus jeweils tendiert
Font 2:Randomize:Cls rnd(8^8):set("decimals",18)
Declare a!,x!,i&
Var imax&=1000' Maximale Zahl Näherungsschritte
Begin:
print "\n Startwert per Lösungssuche (kritisch!): ";
input a!
x!=regulafalsi(a!)
if x!=val("4.9406564584124654E-323")
print " Lösung nach ";imax&;" Schritten nicht gefunden!"
else
print " Lösung: x = ";x!
print " gefunden nach ";i&;" Schritten."
print " Funktionswert: ";formel_1(x!)'formel_0(x!)
endif
WaitInput
case %csrlin>22:cls
goto "Begin"
proc regulafalsi
parameters a!' Startwert
var er!=10^-13
Declare x0!,x1!,x2!,y0!,y1!
x2!=a!
x1!=a!+0.1' Soll nur gleich zu Beginn Division durch Null vermeiden
i&=0
while i&<=imax&
x0!=x1!:x1!=x2!' next generation vorbereiten
rem y0!=formel_0(x0!) : y1!=formel_0(x1!)' Testfunktion Parabel
y0!=formel_1(x0!) : y1!=formel_1(x1!)' Polynom 3. Grades
if (y1!-y0!)<>0
x2! = x0! - y0! * (x1!-x0!) / (y1!-y0!)
else
print " Warnung: Verfahren wurde instabil!"
break
endif
case abs(x2!-x1!)<=er!:break
inc i&
endwhile
'Bei Error: x2 = -INF + 1e-307 =
'kleinstmöglicher DoublePrecision Floatwert<>0
case i&>imax&:x2!=val("4.9406564584124654E-323")
return x2!
endproc
proc Formel_0
parameters x!
declare y!
'---------------------------------------------------------------
' Formel zuvor stets auf homogene Form bringen: ... = 0
' Ges: Lösung zu x^2 = +4 , wird also (beide Seiten: - 4) zu:
y!=x!*x! - 4' mit y = Abweichung von 0 (Irrtumsvariable)
' Verfahrensziel: Cerca ab Startwert a ein x, das y zu Null macht
' Tipp per Schnittpunkt 2er Funktionen: Differenzfunktion bilden!
'---------------------------------------------------------------
return y!
EndProc
proc Formel_1
parameters x!
declare y!
'-------------------------------------
' Zu lösen: x^3-2*x^2+12*x = 100
y!=x!*x!*x!-2*x!*x!+12*x!-100' = 0
'-------------------------------------
return y!
EndProc
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 07.05.2021 ▲ |
|
|
|