pq-Formel (Algorithmen)
Schon in der Schule lernt man die Nullstellen von quadratischen Gleichungen ax2 + bx + c zu bestimmen mit Hilfe der erweiterten pq-Formel oder auch abc-Lösungsformel:
x1,2 =\frac{-b\pm\sqrt{b^2 -4ac}}{2a}
Hierbei kann es allerdings aufgrund von Auslöschung zu einer stark fehlerbehafteten Rechnung kommen, wenn die Wurzel der Diskriminante in etwa die selbe Größenordnung hat wie der Koeffizient b.
In dieser Programmieraufgabe wird Ihnen aufgetragen ein numerisch stabiles Verfahren in einer Funktion pqsolve(a, b, c) zu implementieren bei dem es nicht zu der oben beschriebenen Auslöschung kommen kann.
Überlegen Sie dazu wie Sie die Tatsache, dass das Produkt der Nullstellen einer quadratischen Gleichung gleich c/a ist (Satz von Vieta) nutzen können, um ein stabiles Verfahren zu finden. Ihre Funktion sollte außerdem mit lediglich linearen Gleichungen umgehen können und mit quadratischen Gleichungen, die keine reellen Nullstellen besitzen.
0 Kommentare
Bitte melde dich an um einen Kommentar abzugeben
3 Lösung(en)
/************************************************************************\
| Die aufgabe bleibt mir zwar ein buch mit vier siegeln (auslöschung, |
| fehlerbehaftung, numerische stabilität, stub-datei), aber eine kurze |
| wissensauffrischung bei https://www.mathebibel.de/pq-formel |
| bringt mich zu folgender lösung. |
| Vielleicht ist sie naiv, der verfasser der aufgabe darf mich aber |
| gerne hierzu kontaktieren und mir näher erläutern, was er mir (oder |
| uns) in beschreibung und checksumme vorenthalten hat. |
\************************************************************************/
function pqSolve(a, b, c) {
// trimmen auf normalform
if (a != 1) {
b /= a;
c /= a;
}
// in die formel einsetzen
let i = -(b/2); // der teil der pq-formel vor dem ±
let j = (b/2) ** 2 - c; // der teil danach
// keine lösung
if (j < 0) return [];
// eine lösung
if (j == 0) return [i];
// zwei lösungen
j = Math.sqrt(j);
return [i - j, i + j];
}
// test
console.log( pqSolve(1, -4, 3) );
console.log( pqSolve(1, -4, 4) );
console.log( pqSolve(1, -4, 7) );
// lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
# frozen-string-literal: false
def classic_pq(a, b, c)
return 0 if a.zero? && b.zero?
return (-c / b) if a.zero?
x0 = (-b + Math.sqrt(b**2 - 4 * a * c)) / (2 * a)
x1 = (-b - Math.sqrt(b**2 - 4 * a * c)) / (2 * a)
[x0, x1]
end
def improved_pq(a, b, c)
return 0 if a.zero? && b.zero?
return (-c / b) if a.zero?
x0 = (-b + Math.sqrt(b**2 - 4 * a * c)) / (2 * a)
x1 = (c / a) / x0
[x0, x1]
end
a = Complex(1, 0)
b = Complex(2, 0)
c = Complex(3, 0)
puts classic_pq(a, b, c)
puts improved_pq(a, b, c) # Verbessert mit Vieta.
# Ob hier wohl jemand versucht hat, sich fix 'ne Hausaufgabenloesung zu besorgen? * grins *
Lösung von: Ich Bins (tubs)
import math
class Quad:
def calc(self, a, b, c):
try:
isinstance(c, (float,int))
isinstance(a, (float,int))
isinstance(b, (float,int))
except Exception as e:
print("Fehler ist ", e)
return
if a != 0:
d = b**2-4*a*c
else:
print(f"a darf nicht 0 sein.")
return
if d > 0:
x1 = (-b - math.sqrt(d))/(2*a)
x1 = round(x1,2)
x2 = (-b + math.sqrt(d))/(2*a)
x2 = round(x2,2)
print(f"x1 = {x1}")
print(f"x2 = {x2}")
elif d == 0:
x1 = (-b)/(2*a)
x1 = round(x1,2)
print(f"x1 = {x1}")
else:
#ergGleichung = str("Die Gleichung hat keine Lösung")
print("ende")
quad = Quad()
quad.calc(1,8,7) #L= {-7; -1}
quad.calc(1,-2.4, 1.44) #L= {1,2}
Lösung von: Py Thon ()
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung: