Rozwiązywanie równania kwadratowego – implementacja w języku Python

1
Przykład 1

Zapoznajmy się z programem obliczającym rozwiązanie równania kwadratowego.

Linia 1. def rownanie podkreślnik kwadratowe podkreślnik delta otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły dwukropek. Linia 2. from math import sqrt. Linia 4. if a znak równości znak równości 0 dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów Nie jest to równanie kwadratowe przecinek tylko liniowe przecinek ponieważ a znak równości 0 cudzysłów zamknij nawias okrągły. Linia 6. else dwukropek. Linia 7. delta znak równości b asterysk asterysk 2 minus otwórz nawias okrągły 4 asterysk a asterysk c zamknij nawias okrągły. Linia 8. if delta zamknij nawias ostrokątny 0 dwukropek. Linia 9. d znak równości sqrt otwórz nawias okrągły delta zamknij nawias okrągły. Linia 10. x1 znak równości otwórz nawias okrągły minus b plus d zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 11. x2 znak równości otwórz nawias okrągły minus b minus d zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 12. print otwórz nawias okrągły cudzysłów Równanie ma dwa rozwiązania dwukropek x1 znak równości cudzysłów przecinek x1 przecinek cudzysłów oraz x2 znak równości cudzysłów przecinek x2 zamknij nawias okrągły. Linia 13. elif delta znak równości znak równości 0 dwukropek. Linia 14. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 15. x2 znak równości x1. Linia 16. print otwórz nawias okrągły cudzysłów Równanie ma jedno rozwiązanie dwukropek x znak równości cudzysłów przecinek x1 zamknij nawias okrągły. Linia 17. else dwukropek. Linia 18. print otwórz nawias okrągły cudzysłów Równanie nie ma rozwiązań cudzysłów zamknij nawias okrągły. Linia 20. kratka przykładowe wykonanie. Linia 21. rownanie podkreślnik kwadratowe podkreślnik delta otwórz nawias okrągły 0 kropka 0000001 przecinek 1 przecinek minus 0 kropka 0000001 zamknij nawias okrągły.

Wynik działania programu:

Linia 1. Równanie ma dwa rozwiązania dwukropek x1 znak równości 9 kropka 992007221626409e minus 08 oraz x2 znak równości minus 10000000 kropka 0000001.

Jest to algorytm niestabilny. 

W niektórych przypadkach skuteczność i dokładność takiego sposobu obliczania można zakwestionować. Jeżeli wartość iloczynu 4ac jest mała w stosunku do wielkości b ** 2, to delta dąży do kwadratu z wartości b, a więc wyrażenie:

x1=b±Δ2a

dąży do zera (w zależności od wartości b).

Aby zapobiec błędom niedokładności obliczeń, stosuje się tak zwany algorytm stabilny, który opiera się na wzorach Viète'a.

1
Przykład 2

Przygotujmy kod, który pozwoli zobaczyć różnicę rozwiązań dla algorytmu stabilnego i niestabilnego. Użyjemy konwencji f‑stringf‑stringf‑string, aby podać wynik z dokładnością do 25 miejsc po przecinku, wówczas zobaczymy różnicę w wynikach obliczeń. Różnica między wynikami algorytmów pojawia się dopiero na 17. miejscu po przecinku.

Linia 1. def rownanie podkreślnik niestabilne podkreślnik test otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły dwukropek. Linia 2. from math import sqrt. Linia 4. if a znak równości znak równości 0 dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów Nie jest to równanie kwadratowe przecinek tylko liniowe przecinek ponieważ a znak równości 0 cudzysłów zamknij nawias okrągły. Linia 6. else dwukropek. Linia 7. delta znak równości b asterysk asterysk 2 minus otwórz nawias okrągły 4 asterysk a asterysk c zamknij nawias okrągły. Linia 8. if delta zamknij nawias ostrokątny 0 dwukropek. Linia 9. d znak równości sqrt otwórz nawias okrągły delta zamknij nawias okrągły. Linia 10. x1 znak równości otwórz nawias okrągły minus b minus d zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 11. x2 znak równości otwórz nawias okrągły minus b plus d zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 13. print otwórz nawias okrągły f cudzysłów x1 znak równości otwórz nawias klamrowy x1 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 14. print otwórz nawias okrągły f cudzysłów x2 znak równości otwórz nawias klamrowy x2 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 17. elif delta znak równości znak równości 0 dwukropek. Linia 18. x1 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 19. x2 znak równości x1. Linia 20. print otwórz nawias okrągły f cudzysłów x znak równości otwórz nawias klamrowy x1 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 21. else dwukropek. Linia 22. print otwórz nawias okrągły cudzysłów Równanie nie ma rozwiązań cudzysłów zamknij nawias okrągły. Linia 24. def rownanie podkreślnik kwadratowe podkreślnik stabilne podkreślnik test otwórz nawias okrągły a przecinek b przecinek c zamknij nawias okrągły dwukropek. Linia 25. from math import sqrt. Linia 26. if a znak równości znak równości 0 dwukropek. Linia 27. print otwórz nawias okrągły cudzysłów Nie jest to równanie kwadratowe przecinek tylko liniowe przecinek ponieważ a znak równości 0 cudzysłów zamknij nawias okrągły. Linia 28. else dwukropek. Linia 29. delta znak równości b asterysk asterysk 2 minus otwórz nawias okrągły 4 asterysk a asterysk c zamknij nawias okrągły. Linia 30. if delta zamknij nawias ostrokątny 0 dwukropek. Linia 31. d znak równości sqrt otwórz nawias okrągły delta zamknij nawias okrągły. Linia 33. if b otwórz nawias ostrokątny 0 dwukropek. Linia 34. x1 znak równości otwórz nawias okrągły minus b plus d zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 35. x2 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x1 zamknij nawias okrągły. Linia 37. print otwórz nawias okrągły f cudzysłów x1 znak równości otwórz nawias klamrowy x1 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 38. print otwórz nawias okrągły f cudzysłów x2 znak równości otwórz nawias klamrowy x2 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 41. else dwukropek kratka b zamknij nawias ostrokątny znak równości 0 dwukropek. Linia 42. x2 znak równości otwórz nawias okrągły minus b minus d zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 43. x1 znak równości c prawy ukośnik otwórz nawias okrągły a asterysk x2 zamknij nawias okrągły. Linia 44. print otwórz nawias okrągły f cudzysłów x1 znak równości otwórz nawias klamrowy x1 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 45. print otwórz nawias okrągły f cudzysłów x2 znak równości otwórz nawias klamrowy x2 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 47. elif delta znak równości znak równości 0 dwukropek. Linia 48. x2 znak równości minus b prawy ukośnik otwórz nawias okrągły 2 asterysk a zamknij nawias okrągły. Linia 49. x1 znak równości x2. Linia 50. print otwórz nawias okrągły f cudzysłów x znak równości otwórz nawias klamrowy x1 dwukropek kropka 25f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 51. else dwukropek. Linia 52. print otwórz nawias okrągły cudzysłów Równanie nie ma rozwiązań cudzysłów zamknij nawias okrągły. Linia 54. kratka przykładowe wykonanie. Linia 55. print otwórz nawias okrągły cudzysłów Równanie niestabilne dwukropek cudzysłów zamknij nawias okrągły. Linia 56. rownanie podkreślnik niestabilne podkreślnik test otwórz nawias okrągły 0 kropka 001 przecinek 7845369758436 przecinek 0 kropka 0001 zamknij nawias okrągły. Linia 58. print otwórz nawias okrągły cudzysłów Równanie stabilne dwukropek cudzysłów zamknij nawias okrągły. Linia 59. rownanie podkreślnik kwadratowe podkreślnik stabilne podkreślnik test otwórz nawias okrągły 0 kropka 001 przecinek 7845369758436 przecinek 0 kropka 0001 zamknij nawias okrągły.
Już wiesz
  • Niektóre algorytmy zachowują się niestabilnie przy pewnych zestawach danych wejściowych.

  • Komputery nie są w stanie dokładnie przechowywać pewnych liczb w swojej pamięci, ponieważ w komputerze liczby wymierne przechowywane są w postaci binarnej, zgodnie z formatem IEEE 754IEEE 754IEEE 754.

Słownik

f‑string
f‑string

sposób zapisu zmiennych w łańcuchu znaków przeznaczonym do wypisania funkcją print() – dokładnie opisany w dokumencie PEP 498 – Literal String Interpolation; zakłada format: f"Napis, a w nim {zmienna} do wypisania"

IEEE 754
IEEE 754

standard zapisu zmiennoprzecinkowego, opracowany przez Williama Kahenema, definiuje 32‑bitowe oraz 64‑bitowe liczby zmiennoprzecinkowe

wzory Viète'a
wzory Viète'a

wzory wiążące współczynniki wielomianów i ich pierwiastki; w 1591 r. Francois Viète jako pierwszy wprowadził oznaczenia literowe dla zmiennych – w trakcie wojny francusko‑hiszpańskiej złamał szyfr używany przez Hiszpanów