ich einen Code in Matlab Implementierung quadratische Gleichungen zu lösen, die resolvent Formel:mit sehr kleinen Koeffizienten in Matlab eine quadratische Gleichung lösen
Heres der Code:
clear all
format short
a=1; b=30000000.001; c=1/4;
rdelta=sqrt(b^2-4*a*c);
x1=(-b+rdelta)/(2*a);
x2=(-b-rdelta)/(2*a);
fprintf(' Roots of the polynomial %5.3f x^2 + %5.3f x+%5.3f \n',a,b,c)
fprintf ('x1= %e\n',x1)
fprintf ('x2= %e\n\n',x2)
valor_real_x1= -8.3333e-009;
valor_real_x2= -2.6844e+007;
error_abs_x1 = abs (valor_real_x1-x1);
error_abs_x2 = abs (valor_real_x2-x2);
error_rel_x1 = abs (error_abs_x1/valor_real_x1);
error_rel_x2 = abs (error_abs_x2/valor_real_x2);
fprintf(' absolute_errorx1 = |real value - obtained value| = |%e - %e| = %e \n',valor_real_x1,x1,error_abs_x1)
fprintf(' absolute_errorx2 = |real value - obtained value| = |%e - %e| = %e \n\n',valor_real_x2,x2,error_abs_x2)
fprintf(' relative error_x1 = |absolut error/real value| = |%e/%e| = %e \n',error_abs_x1,valor_real_x1,error_rel_x1)
fprintf(' relative_error_x2 = |absolut error/real value| = |%e/%e| = %e \n',error_abs_x2,valor_real_x2,error_rel_x2)
Das Problem, das ich habe ist, dass es mir eine exakte Lösung, dh für Werte a = 1, b = 30000000.001 c = 1/4, die Werte der Wurzeln gibt:
Roots of the polynomial 1.000 x^2 + 30000000.001 x+0.250
x1= -9.313226e-009
x2= -3.000000e+007
Zu wissen, dass der genaue Wert der Wurzeln des Polynoms ist:
x1= -8.3333e-009
x2= -2.6844e+007
die mir die folgenden Fehler in der absoluten und relativen Genauigkeit der Berechnungen ergibt:
absolute_errorx1 = |real value - obtained value| = |-8.333300e-009 - -9.313226e-009| = 9.799257e-010
absolute_errorx2 = |real value - obtained value| = |-2.684400e+007 - -3.000000e+007| = 3.156000e+006
relative error_x1 = |absolut error/real value| = |9.799257e-010/-8.333300e-009| = 1.175916e-001
relative_error_x2 = |absolut error/real value| = |3.156000e+006/-2.684400e+007| = 1.175682e-001
Meine Frage ist, : Gibt es eine optimale Methode, um die Wurzeln einer quadratischen Gleichung zu erhalten? Dh ich kann Änderungen an meinem Code vornehmen, um den relativen Fehler zwischen der erwarteten Lösung und der resultierenden Lösung zu reduzieren?
nur eine Sache: Wenn Sie denken, Sie die „echte“ Lösungen haben, überprüfen Sie sie mit den girard Beziehungen (nennen wir sie wie die auf dem lateinischen Sprachraum, Ich denke in angelsächsischen Ländern werden sie Newton Identity oder so genannt. Es scheint, dass Holzhackschnitzel Ihre Frage gut beantwortet haben, aber erinnern Sie sich auch daran, dass in der Welt mit doppelter Genauigkeit Ihre tatsächliche Mantissenpräzision 2^53, Unordnung mit Unterschieden größer oder kleiner als Ihr Exponent ist und Sie mit Müll – Castilho
2 enden + 2^54 == 2 + 2^54 +1 versuche das in Matlab, oder dieses 2^54 - (2^54 - 1) == 0, und sieh, was ist die Rückkehr – Castilho