Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

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 = −b ± √b2 − 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.

Eine  genaue  Beschreibung  der  Rückgabe  der  Funktion  finden  Sie  in  der  auf  der  Vorlesungshomepage  zur  Verfügung  gestellten  stub-Datei.   Auch  darin  finden  Sie  die  naive Variante der Lösungsformel implementiert,  die Sie mit der numerisch stabilen vergleichen können.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

2 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)

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 1
Schwierigkeit: Leicht
Webcode: by8u-yhds
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen