Wiemy już, że istnieją błędy przybliżeń, wśród których wyróżniamy błąd bezwzględnybłąd bezwzględnybłąd bezwzględny oraz błąd względnybłąd względnybłąd względny. W tym e‑materiale użyjemy języka Python do obliczenia i wizualizacji tych błędów.

1
Przykład 1

Znając definicje błędów bezwzględnego oraz względnego, możemy napisać funkcje obliczające odpowiednie wartości. Przetestujemy je dla wartości zmierzonych: 225 i 250 oraz wartości dokładnej 242.

Linia 1. from math import fabs. Linia 3. def blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 4. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 5. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 6. return fabs otwórz nawias okrągły x minus x0 zamknij nawias okrągły. Linia 8. def blad podkreślnik wzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 9. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 10. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 12. d znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły. Linia 13. return d prawy ukośnik x. Linia 15. def blad podkreślnik wzgledny podkreślnik proc otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 16. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 17. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 19. d znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły. Linia 20. return round otwórz nawias okrągły otwórz nawias okrągły d prawy ukośnik x zamknij nawias okrągły asterysk 100 przecinek 2 zamknij nawias okrągły. Linia 22. kratka przykładowe wywołanie. Linia 23. print otwórz nawias okrągły cudzysłów Wartość błędu przybliżenia dla 250 dwukropek cudzysłów przecinek blad podkreślnik bezwzgledny otwórz nawias okrągły 242 przecinek 250 zamknij nawias okrągły zamknij nawias okrągły. Linia 24. print otwórz nawias okrągły cudzysłów Wartość błędu przybliżenia dla 225 dwukropek cudzysłów przecinek blad podkreślnik bezwzgledny otwórz nawias okrągły 242 przecinek 225 zamknij nawias okrągły zamknij nawias okrągły. Linia 26. print otwórz nawias okrągły cudzysłów Wartość błędu względnego dla 250 dwukropek cudzysłów przecinek blad podkreślnik wzgledny otwórz nawias okrągły 242 przecinek 250 zamknij nawias okrągły zamknij nawias okrągły. Linia 27. print otwórz nawias okrągły cudzysłów Wartość błędu względnego dla 225 dwukropek cudzysłów przecinek blad podkreślnik wzgledny otwórz nawias okrągły 242 przecinek 225 zamknij nawias okrągły zamknij nawias okrągły. Linia 29. print otwórz nawias okrągły cudzysłów Wartość błędu względnego procentowo dla 250 dwukropek cudzysłów przecinek blad podkreślnik wzgledny podkreślnik proc otwórz nawias okrągły 242 przecinek 250 zamknij nawias okrągły zamknij nawias okrągły. Linia 30. print otwórz nawias okrągły cudzysłów Wartość błędu względnego procentowo dla 225 dwukropek cudzysłów przecinek blad podkreślnik wzgledny podkreślnik proc otwórz nawias okrągły 242 przecinek 225 zamknij nawias okrągły zamknij nawias okrągły.

Wynikiem wykonania kodu dla wartości zmierzonych 225 i 250 oraz wartości dokładnej 242 jest:

Linia 1. Wartość błędu przybliżenia dla 250 dwukropek 8 kropka 0. Linia 2. Wartość błędu przybliżenia dla 225 dwukropek 17 kropka 0. Linia 3. Wartość błędu względnego dla 250 dwukropek 0 kropka 03305785123966942. Linia 4. Wartość błędu względnego dla 225 dwukropek 0 kropka 07024793388429752. Linia 5. Wartość błędu względnego procentowo dla 250 dwukropek 3 kropka 31. Linia 6. Wartość błędu względnego procentowo dla 225 dwukropek 7 kropka 02.

Przeanalizujmy teraz sytuację, w której symulujemy „ręczne” obliczenie wartości za pomocą zaokrąglenia. Prześledźmy błąd bezwzględny oraz względny dla kolejnych zaokrągleń liczby pi.

W przykładzie mamy podaną wartość liczby pi z dokładnością do 42 miejsc po przecinku. W języku Python w module math wartość liczby pi jest zapisana jako math.pi z dostępną precyzją – w tym przypadku 3.141592653589793. Będziemy obliczali błąd bezwzględny i względny oraz błąd względny wyrażony w procentach dla kolejnych przybliżeń: od dwóch miejsc po przecinku, czyli wartości 3.14, do 15 miejsc po przecinku, a więc dokładnej wartości, kiedy błąd będzie wynosił 0. Sprawdzimy kilka obliczonych wartości.

Wartość dokładna to 3.141592653589793

Wartość zmierzona

Błąd względny

Błąd względny w procentach

3.14

0.0005069573828972128

0.05069573828972128

3.141592

2.0804409260601893e‑07

2.0804409260601892e‑05

3.14159265358

3.1172263038059322e‑12

3.117226303805932e‑10

3.141592653589793

0.0

0.0

1
Przykład 2

Napiszmy kod, który pozwoli zobrazować błąd w zależności od kolejnych zaokrągleń. Przygotujemy dwa wykresy w celu odpowiedniego doboru skali.

Bibliotekę matplotlib omawialiśmy również w e‑materiale Modelowanie ruchów Browna w języku PythonD1H3IlzDiModelowanie ruchów Browna w języku Python.

Linia 1. kratka importujemy niezbędne funkcje i moduły. Linia 2. from math import fabs. Linia 3. import matplotlib kropka pyplot as plt. Linia 5. kratka definiujemy funkcje pomocnicze. Linia 6. def blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 7. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 8. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 9. return fabs otwórz nawias okrągły x minus x0 zamknij nawias okrągły. Linia 11. def blad podkreślnik wzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 12. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 13. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 15. d znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły. Linia 16. return d prawy ukośnik x. Linia 18. def blad podkreślnik wzgledny podkreślnik proc podkreślnik dokladn otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 19. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 20. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 22. d znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły. Linia 23. return otwórz nawias okrągły d prawy ukośnik x zamknij nawias okrągły asterysk 100 kratka tutaj zwaracamy dokładną wartość przecinek bez zaokrąglenia. Linia 26. kratka wartości niezbędne dla obliczeń. Linia 27. pi znak równości 3 kropka 141592653589793. Linia 28. wartosci znak równości otwórz nawias kwadratowy x for x in range otwórz nawias okrągły 2 przecinek 16 zamknij nawias okrągły zamknij nawias kwadratowy. Linia 29. bl podkreślnik bezw znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 30. bl podkreślnik wzgl znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 31. bl podkreślnik wzgp znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 33. kratka w pętli sprawdzamy coraz dokładniejsze przybliżenie wartości pi. Linia 34. kratka używamy funkcji round otwórz nawias okrągły zamknij nawias okrągły minus która zaokrągla wynik przecinek dając wartość z błędem. Linia 35. for x in range otwórz nawias okrągły 2 przecinek 16 zamknij nawias okrągły dwukropek. Linia 36. base znak równości round otwórz nawias okrągły pi przecinek x zamknij nawias okrągły. Linia 37. print otwórz nawias okrągły cudzysłów Obliczamy błąd przybliżenia dla wartości dwukropek cudzysłów przecinek base zamknij nawias okrągły. Linia 38. bl podkreślnik bezw kropka append otwórz nawias okrągły blad podkreślnik bezwzgledny otwórz nawias okrągły pi przecinek base zamknij nawias okrągły zamknij nawias okrągły. Linia 39. bl podkreślnik wzgl kropka append otwórz nawias okrągły blad podkreślnik wzgledny otwórz nawias okrągły pi przecinek base zamknij nawias okrągły zamknij nawias okrągły. Linia 40. bl podkreślnik wzgp kropka append otwórz nawias okrągły blad podkreślnik wzgledny podkreślnik proc podkreślnik dokladn otwórz nawias okrągły pi przecinek base zamknij nawias okrągły zamknij nawias okrągły. Linia 42. kratka pierwszy wykres. Linia 43. plt kropka plot otwórz nawias okrągły wartosci przecinek bl podkreślnik bezw przecinek label znak równości cudzysłów Błąd bezwzględny cudzysłów zamknij nawias okrągły. Linia 44. plt kropka plot otwórz nawias okrągły wartosci przecinek bl podkreślnik wzgl przecinek label znak równości cudzysłów Błąd względny cudzysłów zamknij nawias okrągły. Linia 45. plt kropka legend otwórz nawias okrągły zamknij nawias okrągły. Linia 46. plt kropka title otwórz nawias okrągły cudzysłów Wartość bazowa pi znak równości cudzysłów plus str otwórz nawias okrągły pi zamknij nawias okrągły zamknij nawias okrągły. Linia 47. plt kropka grid otwórz nawias okrągły True zamknij nawias okrągły. Linia 48. plt kropka show otwórz nawias okrągły zamknij nawias okrągły. Linia 49. kratka drugi wykres. Linia 50. plt kropka plot otwórz nawias okrągły wartosci przecinek bl podkreślnik wzgp przecinek label znak równości cudzysłów Błąd względny procentowo cudzysłów zamknij nawias okrągły. Linia 51. plt kropka legend otwórz nawias okrągły zamknij nawias okrągły. Linia 52. plt kropka title otwórz nawias okrągły cudzysłów Wartość bazowa pi znak równości cudzysłów plus str otwórz nawias okrągły pi zamknij nawias okrągły zamknij nawias okrągły. Linia 53. plt kropka grid otwórz nawias okrągły True zamknij nawias okrągły. Linia 54. plt kropka show otwórz nawias okrągły zamknij nawias okrągły.

Wykres pierwszy – błąd względny oraz bezwzględny wartościowo:

R1LARMAAiuuZb
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Wykres drugi – błąd względny procentowo:

RWWi7RM8MjNXI
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Ważne!

Możemy zauważyć, że błąd przybliżenia (zarówno względny, jak i bezwzględny) zmienia się – maleje wraz ze wzrostem dokładności obserwowanej liczby.

1
Przykład 3

Napiszmy kod, który pozwoli zaokrąglić liczbę pi do takiego momentu, dla którego błąd względny przekroczy 0,01 procenta – wówczas zatrzymamy kolejne zaokrąglenia.

Linia 1. kratka importujemy niezbędne funkcje i moduły. Linia 2. from math import fabs. Linia 3. import matplotlib kropka pyplot as plt. Linia 5. kratka definiujemy funkcje pomocnicze. Linia 6. def blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 7. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 8. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 9. return fabs otwórz nawias okrągły x minus x0 zamknij nawias okrągły. Linia 11. def blad podkreślnik wzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 12. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 13. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 15. d znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły. Linia 16. return d prawy ukośnik x. Linia 18. def blad podkreślnik wzgledny podkreślnik proc podkreślnik dokladn otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły dwukropek. Linia 19. cudzysłów cudzysłów cudzysłów x minus wartość dokładna. Linia 20. x0 minus wartość zmierzona cudzysłów cudzysłów cudzysłów. Linia 22. d znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły. Linia 23. return otwórz nawias okrągły d prawy ukośnik x zamknij nawias okrągły asterysk 100 kratka tutaj zwaracamy dokładną wartość przecinek bez zaokrąglenia. Linia 27. pi znak równości 3 kropka 141592653589793. Linia 28. bl podkreślnik bezw znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 29. bl podkreślnik wzgl znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 30. bl podkreślnik wzgp znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 31. przyblizenia znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 32. ok znak równości cudzysłów cudzysłów. Linia 34. for dokladnosc in range otwórz nawias okrągły 15 przecinek 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 35. wartosc znak równości round otwórz nawias okrągły pi przecinek dokladnosc zamknij nawias okrągły. Linia 36. blad podkreślnik wzgledny podkreślnik v znak równości blad podkreślnik wzgledny otwórz nawias okrągły pi przecinek wartosc zamknij nawias okrągły. Linia 37. blad podkreślnik bezwzgledny podkreślnik v znak równości blad podkreślnik bezwzgledny otwórz nawias okrągły pi przecinek wartosc zamknij nawias okrągły. Linia 38. blad podkreślnik proc znak równości blad podkreślnik wzgledny podkreślnik proc podkreślnik dokladn otwórz nawias okrągły pi przecinek wartosc zamknij nawias okrągły. Linia 39. if blad podkreślnik proc zamknij nawias ostrokątny 0 kropka 01 dwukropek. Linia 40. break. Linia 41. else dwukropek. Linia 42. bl podkreślnik bezw kropka append otwórz nawias okrągły blad podkreślnik bezwzgledny podkreślnik v zamknij nawias okrągły. Linia 43. bl podkreślnik wzgl kropka append otwórz nawias okrągły blad podkreślnik wzgledny podkreślnik v zamknij nawias okrągły. Linia 44. bl podkreślnik wzgp kropka append otwórz nawias okrągły blad podkreślnik proc zamknij nawias okrągły. Linia 45. ok znak równości str otwórz nawias okrągły wartosc zamknij nawias okrągły. Linia 46. przyblizenia kropka append otwórz nawias okrągły dokladnosc zamknij nawias okrągły. Linia 48. kratka przygotowujemy wartości X przecinek bazując na długości listy przybliżeń. Linia 49. X znak równości otwórz nawias kwadratowy x for x in range otwórz nawias okrągły len otwórz nawias okrągły przyblizenia zamknij nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy. Linia 51. kratka pierwszy wykres. Linia 52. plt kropka plot otwórz nawias okrągły X przecinek bl podkreślnik bezw przecinek label znak równości cudzysłów Błąd bezwzględny cudzysłów zamknij nawias okrągły. Linia 53. plt kropka plot otwórz nawias okrągły X przecinek bl podkreślnik wzgl przecinek label znak równości cudzysłów Błąd względny cudzysłów zamknij nawias okrągły. Linia 54. plt kropka legend otwórz nawias okrągły zamknij nawias okrągły. Linia 55. plt kropka title otwórz nawias okrągły cudzysłów Wartość bazowa pi znak równości cudzysłów plus str otwórz nawias okrągły pi zamknij nawias okrągły plus cudzysłów kropka Ostatni wynik w założonym błędzie znak równości cudzysłów plus str otwórz nawias okrągły ok zamknij nawias okrągły zamknij nawias okrągły. Linia 56. plt kropka grid otwórz nawias okrągły True zamknij nawias okrągły. Linia 57. plt kropka show otwórz nawias okrągły zamknij nawias okrągły. Linia 58. kratka drugi wykres. Linia 59. plt kropka plot otwórz nawias okrągły X przecinek bl podkreślnik wzgp przecinek label znak równości cudzysłów Błąd względny procentowo cudzysłów zamknij nawias okrągły. Linia 60. plt kropka legend otwórz nawias okrągły zamknij nawias okrągły. Linia 61. plt kropka title otwórz nawias okrągły cudzysłów Wartość bazowa pi znak równości cudzysłów plus str otwórz nawias okrągły pi zamknij nawias okrągły plus cudzysłów kropka Ostatni wynik w założonym błędzie znak równości cudzysłów plus str otwórz nawias okrągły ok zamknij nawias okrągły zamknij nawias okrągły. Linia 62. plt kropka grid otwórz nawias okrągły True zamknij nawias okrągły. Linia 63. plt kropka show otwórz nawias okrągły zamknij nawias okrągły.

Wykres pierwszy – błąd względny oraz bezwzględny wartościowo:

R1RxgzoStsP14
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Wykres drugi – błąd względny procentowo:

RI2tyAzM4gIXN
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
1
Dla zainteresowanych

W języku Python istnieje moduł o nazwie Decimal. Zapewnia on obsługę arytmetyki zmiennoprzecinkowej i podaje dokładniejsze wyniki. Prześledźmy to na przykładzie dodawania do siebie dwóch wartości rzeczywistych: 0.1 + 0.2. Z lekcji matematyki wiemy, że wynik powinien wynosić 0.3, a jednak program w języku Python wyświetla następującą wartość:

Linia 1. print otwórz nawias okrągły 0 kropka 1 plus 0 kropka 2 zamknij nawias okrągły. Linia 2. kratka 0 kropka 30000000000000004.

Wynik jest większy niż 0.3 - niewiele, ale jednak większy. Jest to związane ze sposobem, w jaki język Python przechowuje w pamięci liczby. Zobaczymy, jak wygląda ta sama sytuacja, kiedy użyjemy modułu Decimal. Pamiętajmy, że liczby podajemy jako parametr typu str.

Linia 1. a znak równości Decimal otwórz nawias okrągły cudzysłów 0 kropka 1 cudzysłów zamknij nawias okrągły. Linia 2. b znak równości Decimal otwórz nawias okrągły cudzysłów 0 kropka 2 cudzysłów zamknij nawias okrągły. Linia 3. c znak równości a plus b. Linia 4. print otwórz nawias okrągły c zamknij nawias okrągły. Linia 5. kratka 0 kropka 3.

Zauważmy, że wartości podane po wykorzystaniu modułu Decimal są dokładniejsze.

  3 a     b   =   c
3     0.1     0.3   =   0
Linia 1. a znak równości 0 kropka 1. Linia 2. b znak równości 0 kropka 3. Linia 3. c znak równości 3 asterysk a minus b. Linia 5. if c znak równości znak równości 0 dwukropek. Linia 6. print otwórz nawias okrągły cudzysłów Wynik poprawny znak równości 0 kropka cudzysłów zamknij nawias okrągły. Linia 7. else dwukropek. Linia 8. print otwórz nawias okrągły cudzysłów Wynik niepoprawny średnik wartość znak równości cudzysłów przecinek c zamknij nawias okrągły. Linia 10. kratka Wynik niepoprawny średnik wartość znak równości 5 kropka 551115123125783e minus 17.
Linia 1. from decimal import asterysk. Linia 2. x znak równości Decimal otwórz nawias okrągły cudzysłów 0 kropka 1 cudzysłów zamknij nawias okrągły. Linia 3. y znak równości Decimal otwórz nawias okrągły cudzysłów 0 kropka 3 cudzysłów zamknij nawias okrągły. Linia 4. z znak równości 3 asterysk x minus y. Linia 6. if z znak równości znak równości 0 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Wynik poprawny znak równości 0 kropka cudzysłów zamknij nawias okrągły. Linia 8. else dwukropek. Linia 9. print otwórz nawias okrągły cudzysłów Wynik niepoprawny średnik wartość znak równości cudzysłów przecinek z zamknij nawias okrągły. Linia 11. kratka Wynik poprawny znak równości 0 kropka.

Dla komputera obliczenie 3 * 0.1 - 0.3 daje wynik 5.551115123125783e‑17. Jest on bardzo bliski zeru, jednak nie jest to dokładnie zero. Natomiast zastosowanie do tego obliczenia modułu i typu danych Decimal daje oczekiwany wynik.

Słownik

błąd bezwzględny
błąd bezwzględny

wyraża bezwzględną różnicę pomiędzy wartością zmierzoną a dokładną; obliczamy go zgodnie ze wzorem:

Δ x = | x x 0 |

gdzie x to wartość dokładna, x 0  – wartość zmierzona, a Δ x – błąd bezwzględny

błąd względny
błąd względny

informuje, o ile procent różni się wartość zmierzona od dokładnej; obliczamy go zgodnie ze wzorem:

δ = | x x 0 | x 100 % = Δ x x 100 %

gdzie x to wartość dokładna, x 0 – wartość zmierzona, Δ x – błąd bezwzględny, zaś δ to błąd względny