Zdjęcie przedstawia tablicę z różnymi wyciętymi liczbami, które podświetlone są białym światłem przez wycięcia.
Zdjęcie przedstawia tablicę z różnymi wyciętymi liczbami, które podświetlone są białym światłem przez wycięcia.
I_R_W14_M39_Java Błędy obliczeń numerycznych
Źródło: Nick Hillier, domena publiczna.
Wiemy już, że istnieją błędy przybliżeń, wśród których wyróżniamy błąd bezwzględny oraz błąd względny. W tym e‑materiale użyjemy języka Java 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. import javax kropka swing kropka asterysk średnik.
Linia 2. import java kropka awt kropka asterysk średnik.
Linia 3. import java kropka awt kropka geom kropka Path2D średnik.
Linia 4. import java kropka math kropka BigDecimal średnik.
Linia 5. import java kropka math kropka RoundingMode średnik.
Linia 6. import java kropka util kropka ArrayList średnik.
Linia 7. import java kropka util kropka List średnik.
Linia 9. public class Main otwórz nawias klamrowy.
Linia 11. prawy ukośnik prawy ukośnik x minus wartość dokładna.
Linia 12. prawy ukośnik prawy ukośnik x0 minus wartość zmierzona.
Linia 13. public static double bladBezwzgledny otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. return Math kropka abs otwórz nawias okrągły x minus x0 zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. public static double bladWzgledny otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. double d znak równości bladBezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły średnik.
Linia 19. return d prawy ukośnik x średnik.
Linia 20. zamknij nawias klamrowy.
Linia 22. public static double bladWzglednyProcentowy otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 23. double d znak równości bladBezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły średnik.
Linia 24. double wynik znak równości otwórz nawias okrągły d prawy ukośnik x zamknij nawias okrągły asterysk 100 średnik.
Linia 26. prawy ukośnik prawy ukośnik Zaokrąglenie wyniku do dwóch miejsc po przecinku.
Linia 27. return Math kropka round otwórz nawias okrągły wynik asterysk 100 kropka 0 zamknij nawias okrągły prawy ukośnik 100 kropka 0 średnik.
Linia 28. zamknij nawias klamrowy.
Linia 30. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 32. prawy ukośnik prawy ukośnik Przykładowe wywołania.
Linia 33. System kropka out kropka println otwórz nawias okrągły.
Linia 34. cudzysłów Wartość błędu przybliżenia dla 250 dwukropek cudzysłów.
Linia 35. plus bladBezwzgledny otwórz nawias okrągły 242 przecinek 250 zamknij nawias okrągły.
Linia 36. zamknij nawias okrągły średnik.
Linia 38. System kropka out kropka println otwórz nawias okrągły.
Linia 39. cudzysłów Wartość błędu przybliżenia dla 225 dwukropek cudzysłów.
Linia 40. plus bladBezwzgledny otwórz nawias okrągły 242 przecinek 225 zamknij nawias okrągły.
Linia 41. zamknij nawias okrągły średnik.
Linia 43. System kropka out kropka println otwórz nawias okrągły.
Linia 44. cudzysłów Wartość błędu względnego dla 250 dwukropek cudzysłów.
Linia 45. plus bladWzgledny otwórz nawias okrągły 242 przecinek 250 zamknij nawias okrągły.
Linia 46. zamknij nawias okrągły średnik.
Linia 48. System kropka out kropka println otwórz nawias okrągły.
Linia 49. cudzysłów Wartość błędu względnego dla 225 dwukropek cudzysłów.
Linia 50. plus bladWzgledny otwórz nawias okrągły 242 przecinek 225 zamknij nawias okrągły.
Linia 51. zamknij nawias okrągły średnik.
Linia 53. System kropka out kropka println otwórz nawias okrągły.
Linia 54. cudzysłów Wartość błędu względnego procentowo dla 250 dwukropek cudzysłów.
Linia 55. plus bladWzglednyProcentowy otwórz nawias okrągły 242 przecinek 250 zamknij nawias okrągły.
Linia 56. zamknij nawias okrągły średnik.
Linia 58. System kropka out kropka println otwórz nawias okrągły.
Linia 59. cudzysłów Wartość błędu względnego procentowo dla 225 dwukropek cudzysłów.
Linia 60. plus bladWzglednyProcentowy otwórz nawias okrągły 242 przecinek 225 zamknij nawias okrągły.
Linia 61. zamknij nawias okrągły średnik.
Linia 62. zamknij nawias klamrowy.
Linia 63. zamknij nawias klamrowy.
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Path2D;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
public class Main {
// x - wartość dokładna
// x0 - wartość zmierzona
public static double bladBezwzgledny(double x, double x0) {
return Math.abs(x - x0);
}
public static double bladWzgledny(double x, double x0) {
double d = bladBezwzgledny(x, x0);
return d / x;
}
public static double bladWzglednyProcentowy(double x, double x0) {
double d = bladBezwzgledny(x, x0);
double wynik = (d / x) * 100;
// Zaokrąglenie wyniku do dwóch miejsc po przecinku
return Math.round(wynik * 100.0) / 100.0;
}
public static void main(String[] args) {
// Przykładowe wywołania
System.out.println(
"Wartość błędu przybliżenia dla 250: "
+ bladBezwzgledny(242, 250)
);
System.out.println(
"Wartość błędu przybliżenia dla 225: "
+ bladBezwzgledny(242, 225)
);
System.out.println(
"Wartość błędu względnego dla 250: "
+ bladWzgledny(242, 250)
);
System.out.println(
"Wartość błędu względnego dla 225: "
+ bladWzgledny(242, 225)
);
System.out.println(
"Wartość błędu względnego procentowo dla 250: "
+ bladWzglednyProcentowy(242, 250)
);
System.out.println(
"Wartość błędu względnego procentowo dla 225: "
+ bladWzglednyProcentowy(242, 225)
);
}
}
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.
Wartość błędu przybliżenia dla 250: 8.0
Wartość błędu przybliżenia dla 225: 17.0
Wartość błędu względnego dla 250: 0.03305785123966942
Wartość błędu względnego dla 225: 0.07024793388429752
Wartość błędu względnego procentowo dla 250: 3.31
Wartość błędu względnego procentowo dla 225: 7.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 Java 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.
Linia 1. package com kropka mycompany kropka ore średnik.
Linia 2. import javax kropka swing kropka asterysk średnik.
Linia 3. import java kropka awt kropka asterysk średnik.
Linia 4. import java kropka awt kropka geom kropka Path2D średnik.
Linia 5. import java kropka math kropka BigDecimal średnik.
Linia 6. import java kropka math kropka RoundingMode średnik.
Linia 7. import java kropka util kropka ArrayList średnik.
Linia 8. import java kropka util kropka List średnik.
Linia 10. public class Main otwórz nawias klamrowy.
Linia 12. prawy ukośnik prawy ukośnik Wartość dokładna i wartość zmierzona.
Linia 13. public static double bladBezwzgledny otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. return Math kropka abs otwórz nawias okrągły x minus x0 zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. prawy ukośnik prawy ukośnik x minus wartość dokładna.
Linia 18. prawy ukośnik prawy ukośnik x0 minus wartość zmierzona.
Linia 19. public static double bladWzgledny otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 20. double d znak równości bladBezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły średnik.
Linia 21. return d prawy ukośnik x średnik.
Linia 22. zamknij nawias klamrowy.
Linia 24. prawy ukośnik prawy ukośnik Względny błąd procentowy.
Linia 25. public static double bladWzglednyProcentowy otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 26. return bladWzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły asterysk 100 kropka 0 średnik.
Linia 27. zamknij nawias klamrowy.
Linia 29. prawy ukośnik prawy ukośnik Odpowiednik round otwórz nawias okrągły pi przecinek liczbaMiejsc zamknij nawias okrągły z Pythona.
Linia 30. public static double zaokraglij otwórz nawias okrągły double liczba przecinek int liczbaMiejsc zamknij nawias okrągły otwórz nawias klamrowy.
Linia 31. return BigDecimal kropka valueOf otwórz nawias okrągły liczba zamknij nawias okrągły.
Linia 32. kropka setScale otwórz nawias okrągły liczbaMiejsc przecinek RoundingMode kropka HALF podkreślnik EVEN zamknij nawias okrągły.
Linia 33. kropka doubleValue otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 34. zamknij nawias klamrowy.
Linia 36. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 37. double pi znak równości 3 kropka 141592653589793 średnik.
Linia 39. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny wartosci znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 40. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny bledyBezwzgledne znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 41. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny bledyWzgledne znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 42. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny bledyProcentowe znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 44. prawy ukośnik prawy ukośnik Sprawdzamy coraz dokładniejsze przybliżenie liczby pi.
Linia 45. for otwórz nawias okrągły int x znak równości 2 średnik x otwórz nawias ostrokątny 16 średnik x plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 46. double przyblizenie znak równości zaokraglij otwórz nawias okrągły pi przecinek x zamknij nawias okrągły średnik.
Linia 48. System kropka out kropka println otwórz nawias okrągły.
Linia 49. cudzysłów Obliczamy błąd przybliżenia dla wartości dwukropek cudzysłów.
Linia 50. plus przyblizenie.
Linia 51. zamknij nawias okrągły średnik.
Linia 53. wartosci kropka add otwórz nawias okrągły x zamknij nawias okrągły średnik.
Linia 54. bledyBezwzgledne kropka add otwórz nawias okrągły.
Linia 55. bladBezwzgledny otwórz nawias okrągły pi przecinek przyblizenie zamknij nawias okrągły.
Linia 56. zamknij nawias okrągły średnik.
Linia 57. bledyWzgledne kropka add otwórz nawias okrągły.
Linia 58. bladWzgledny otwórz nawias okrągły pi przecinek przyblizenie zamknij nawias okrągły.
Linia 59. zamknij nawias okrągły średnik.
Linia 60. bledyProcentowe kropka add otwórz nawias okrągły.
Linia 61. bladWzglednyProcentowy otwórz nawias okrągły pi przecinek przyblizenie zamknij nawias okrągły.
Linia 62. zamknij nawias okrągły średnik.
Linia 63. zamknij nawias klamrowy.
Linia 65. SwingUtilities kropka invokeLater otwórz nawias okrągły otwórz nawias okrągły zamknij nawias okrągły minus zamknij nawias ostrokątny otwórz nawias klamrowy.
Linia 66. utworzWykres otwórz nawias okrągły.
Linia 67. cudzysłów Wartość bazowa pi znak równości cudzysłów plus pi przecinek.
Linia 68. wartosci przecinek.
Linia 69. bledyBezwzgledne przecinek.
Linia 70. bledyWzgledne przecinek.
Linia 71. cudzysłów Błąd bezwzględny cudzysłów przecinek.
Linia 72. cudzysłów Błąd względny cudzysłów.
Linia 73. zamknij nawias okrągły średnik.
Linia 75. utworzWykres otwórz nawias okrągły.
Linia 76. cudzysłów Wartość bazowa pi znak równości cudzysłów plus pi przecinek.
Linia 77. wartosci przecinek.
Linia 78. bledyProcentowe przecinek.
Linia 79. null przecinek.
Linia 80. cudzysłów Błąd względny procentowy cudzysłów przecinek.
Linia 81. null.
Linia 82. zamknij nawias okrągły średnik.
Linia 83. zamknij nawias klamrowy zamknij nawias okrągły średnik.
Linia 84. zamknij nawias klamrowy.
Linia 86. private static void utworzWykres otwórz nawias okrągły.
Linia 87. String tytul przecinek.
Linia 88. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny x przecinek.
Linia 89. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria1 przecinek.
Linia 90. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria2 przecinek.
Linia 91. String nazwaSerii1 przecinek.
Linia 92. String nazwaSerii2.
Linia 93. zamknij nawias okrągły otwórz nawias klamrowy.
Linia 94. JFrame okno znak równości new JFrame otwórz nawias okrągły tytul zamknij nawias okrągły średnik.
Linia 95. okno kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik.
Linia 96. okno kropka setSize otwórz nawias okrągły 850 przecinek 550 zamknij nawias okrągły średnik.
Linia 97. okno kropka setLocationByPlatform otwórz nawias okrągły true zamknij nawias okrągły średnik.
Linia 99. okno kropka add otwórz nawias okrągły new PanelWykresu otwórz nawias okrągły.
Linia 100. tytul przecinek.
Linia 101. x przecinek.
Linia 102. seria1 przecinek.
Linia 103. seria2 przecinek.
Linia 104. nazwaSerii1 przecinek.
Linia 105. nazwaSerii2.
Linia 106. zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 108. okno kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik.
Linia 109. zamknij nawias klamrowy.
Linia 111. static class PanelWykresu extends JPanel otwórz nawias klamrowy.
Linia 112. private final String tytul średnik.
Linia 113. private final List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny x średnik.
Linia 114. private final List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria1 średnik.
Linia 115. private final List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria2 średnik.
Linia 116. private final String nazwaSerii1 średnik.
Linia 117. private final String nazwaSerii2 średnik.
Linia 119. private final int marginesLewy znak równości 90 średnik.
Linia 120. private final int marginesPrawy znak równości 40 średnik.
Linia 121. private final int marginesGorny znak równości 70 średnik.
Linia 122. private final int marginesDolny znak równości 80 średnik.
Linia 124. PanelWykresu otwórz nawias okrągły.
Linia 125. String tytul przecinek.
Linia 126. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny x przecinek.
Linia 127. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria1 przecinek.
Linia 128. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria2 przecinek.
Linia 129. String nazwaSerii1 przecinek.
Linia 130. String nazwaSerii2.
Linia 131. zamknij nawias okrągły otwórz nawias klamrowy.
Linia 132. this kropka tytul znak równości tytul średnik.
Linia 133. this kropka x znak równości x średnik.
Linia 134. this kropka seria1 znak równości seria1 średnik.
Linia 135. this kropka seria2 znak równości seria2 średnik.
Linia 136. this kropka nazwaSerii1 znak równości nazwaSerii1 średnik.
Linia 137. this kropka nazwaSerii2 znak równości nazwaSerii2 średnik.
Linia 139. setBackground otwórz nawias okrągły Color kropka WHITE zamknij nawias okrągły średnik.
Linia 140. zamknij nawias klamrowy.
Linia 142. at Override.
Linia 143. protected void paintComponent otwórz nawias okrągły Graphics graphics zamknij nawias okrągły otwórz nawias klamrowy.
Linia 144. super kropka paintComponent otwórz nawias okrągły graphics zamknij nawias okrągły średnik.
Linia 146. Graphics2D g2 znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły graphics średnik.
Linia 147. g2 kropka setRenderingHint otwórz nawias okrągły.
Linia 148. RenderingHints kropka KEY podkreślnik ANTIALIASING przecinek.
Linia 149. RenderingHints kropka VALUE podkreślnik ANTIALIAS podkreślnik ON.
Linia 150. zamknij nawias okrągły średnik.
Linia 152. int szerokoscWykresu znak równości.
Linia 153. getWidth otwórz nawias okrągły zamknij nawias okrągły minus marginesLewy minus marginesPrawy średnik.
Linia 154. int wysokoscWykresu znak równości.
Linia 155. getHeight otwórz nawias okrągły zamknij nawias okrągły minus marginesGorny minus marginesDolny średnik.
Linia 157. double maksY znak równości znajdzMaksimum otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 158. if otwórz nawias okrągły maksY znak równości znak równości 0 kropka 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 159. maksY znak równości 1 kropka 0 średnik.
Linia 160. zamknij nawias klamrowy.
Linia 162. prawy ukośnik prawy ukośnik Tytuł.
Linia 163. g2 kropka setColor otwórz nawias okrągły Color kropka BLACK zamknij nawias okrągły średnik.
Linia 164. g2 kropka setFont otwórz nawias okrągły new Font otwórz nawias okrągły cudzysłów SansSerif cudzysłów przecinek Font kropka BOLD przecinek 16 zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 165. g2 kropka drawString otwórz nawias okrągły tytul przecinek marginesLewy przecinek 30 zamknij nawias okrągły średnik.
Linia 167. prawy ukośnik prawy ukośnik Siatka i wartości osi Y.
Linia 168. g2 kropka setFont otwórz nawias okrągły new Font otwórz nawias okrągły cudzysłów SansSerif cudzysłów przecinek Font kropka PLAIN przecinek 11 zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 170. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny znak równości 5 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 171. int yPozycja znak równości.
Linia 172. marginesGorny plus i asterysk wysokoscWykresu prawy ukośnik 5 średnik.
Linia 174. g2 kropka setColor otwórz nawias okrągły Color kropka LIGHT podkreślnik GRAY zamknij nawias okrągły średnik.
Linia 175. g2 kropka drawLine otwórz nawias okrągły.
Linia 176. marginesLewy przecinek.
Linia 177. yPozycja przecinek.
Linia 178. marginesLewy plus szerokoscWykresu przecinek.
Linia 179. yPozycja.
Linia 180. zamknij nawias okrągły średnik.
Linia 182. double wartoscY znak równości maksY asterysk otwórz nawias okrągły 5 minus i zamknij nawias okrągły prawy ukośnik 5 kropka 0 średnik.
Linia 184. g2 kropka setColor otwórz nawias okrągły Color kropka BLACK zamknij nawias okrągły średnik.
Linia 185. g2 kropka drawString otwórz nawias okrągły.
Linia 186. String kropka format otwórz nawias okrągły cudzysłów procent kropka 3e cudzysłów przecinek wartoscY zamknij nawias okrągły przecinek.
Linia 187. 10 przecinek.
Linia 188. yPozycja plus 5.
Linia 189. zamknij nawias okrągły średnik.
Linia 190. zamknij nawias klamrowy.
Linia 192. prawy ukośnik prawy ukośnik Osie.
Linia 193. g2 kropka setColor otwórz nawias okrągły Color kropka BLACK zamknij nawias okrągły średnik.
Linia 194. g2 kropka drawLine otwórz nawias okrągły.
Linia 195. marginesLewy przecinek.
Linia 196. marginesGorny przecinek.
Linia 197. marginesLewy przecinek.
Linia 198. marginesGorny plus wysokoscWykresu.
Linia 199. zamknij nawias okrągły średnik.
Linia 200. g2 kropka drawLine otwórz nawias okrągły.
Linia 201. marginesLewy przecinek.
Linia 202. marginesGorny plus wysokoscWykresu przecinek.
Linia 203. marginesLewy plus szerokoscWykresu przecinek.
Linia 204. marginesGorny plus wysokoscWykresu.
Linia 205. zamknij nawias okrągły średnik.
Linia 207. prawy ukośnik prawy ukośnik Wartości osi X.
Linia 208. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny x kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 209. int xPozycja znak równości obliczX otwórz nawias okrągły i przecinek szerokoscWykresu zamknij nawias okrągły średnik.
Linia 211. g2 kropka drawString otwórz nawias okrągły.
Linia 212. String kropka valueOf otwórz nawias okrągły x kropka get otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły przecinek.
Linia 213. xPozycja minus 5 przecinek.
Linia 214. marginesGorny plus wysokoscWykresu plus 20.
Linia 215. zamknij nawias okrągły średnik.
Linia 216. zamknij nawias klamrowy.
Linia 218. g2 kropka drawString otwórz nawias okrągły.
Linia 219. cudzysłów Liczba miejsc po przecinku cudzysłów przecinek.
Linia 220. marginesLewy plus szerokoscWykresu prawy ukośnik 2 minus 70 przecinek.
Linia 221. getHeight otwórz nawias okrągły zamknij nawias okrągły minus 20.
Linia 222. zamknij nawias okrągły średnik.
Linia 224. rysujSerie otwórz nawias okrągły.
Linia 225. g2 przecinek.
Linia 226. seria1 przecinek.
Linia 227. maksY przecinek.
Linia 228. szerokoscWykresu przecinek.
Linia 229. wysokoscWykresu przecinek.
Linia 230. Color kropka RED.
Linia 231. zamknij nawias okrągły średnik.
Linia 233. if otwórz nawias okrągły seria2 wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy.
Linia 234. rysujSerie otwórz nawias okrągły.
Linia 235. g2 przecinek.
Linia 236. seria2 przecinek.
Linia 237. maksY przecinek.
Linia 238. szerokoscWykresu przecinek.
Linia 239. wysokoscWykresu przecinek.
Linia 240. Color kropka BLUE.
Linia 241. zamknij nawias okrągły średnik.
Linia 242. zamknij nawias klamrowy.
Linia 244. prawy ukośnik prawy ukośnik Legenda.
Linia 245. int legendaX znak równości getWidth otwórz nawias okrągły zamknij nawias okrągły minus 240 średnik.
Linia 246. int legendaY znak równości 30 średnik.
Linia 248. g2 kropka setColor otwórz nawias okrągły Color kropka RED zamknij nawias okrągły średnik.
Linia 249. g2 kropka drawLine otwórz nawias okrągły legendaX przecinek legendaY przecinek legendaX plus 25 przecinek legendaY zamknij nawias okrągły średnik.
Linia 250. g2 kropka setColor otwórz nawias okrągły Color kropka BLACK zamknij nawias okrągły średnik.
Linia 251. g2 kropka drawString otwórz nawias okrągły nazwaSerii1 przecinek legendaX plus 35 przecinek legendaY plus 5 zamknij nawias okrągły średnik.
Linia 253. if otwórz nawias okrągły seria2 wykrzyknik znak równości null ampersant ampersant nazwaSerii2 wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy.
Linia 254. g2 kropka setColor otwórz nawias okrągły Color kropka BLUE zamknij nawias okrągły średnik.
Linia 255. g2 kropka drawLine otwórz nawias okrągły.
Linia 256. legendaX przecinek.
Linia 257. legendaY plus 20 przecinek.
Linia 258. legendaX plus 25 przecinek.
Linia 259. legendaY plus 20.
Linia 260. zamknij nawias okrągły średnik.
Linia 262. g2 kropka setColor otwórz nawias okrągły Color kropka BLACK zamknij nawias okrągły średnik.
Linia 263. g2 kropka drawString otwórz nawias okrągły.
Linia 264. nazwaSerii2 przecinek.
Linia 265. legendaX plus 35 przecinek.
Linia 266. legendaY plus 25.
Linia 267. zamknij nawias okrągły średnik.
Linia 268. zamknij nawias klamrowy.
Linia 269. zamknij nawias klamrowy.
Linia 271. private void rysujSerie otwórz nawias okrągły.
Linia 272. Graphics2D g2 przecinek.
Linia 273. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny seria przecinek.
Linia 274. double maksY przecinek.
Linia 275. int szerokoscWykresu przecinek.
Linia 276. int wysokoscWykresu przecinek.
Linia 277. Color kolor.
Linia 278. zamknij nawias okrągły otwórz nawias klamrowy.
Linia 279. Path2D sciezka znak równości new Path2D kropka Double otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 281. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny seria kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 282. int px znak równości obliczX otwórz nawias okrągły i przecinek szerokoscWykresu zamknij nawias okrągły średnik.
Linia 284. int py znak równości marginesGorny plus wysokoscWykresu.
Linia 285. minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły.
Linia 286. seria kropka get otwórz nawias okrągły i zamknij nawias okrągły prawy ukośnik maksY asterysk wysokoscWykresu.
Linia 287. zamknij nawias okrągły średnik.
Linia 289. if otwórz nawias okrągły i znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 290. sciezka kropka moveTo otwórz nawias okrągły px przecinek py zamknij nawias okrągły średnik.
Linia 291. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 292. sciezka kropka lineTo otwórz nawias okrągły px przecinek py zamknij nawias okrągły średnik.
Linia 293. zamknij nawias klamrowy.
Linia 294. zamknij nawias klamrowy.
Linia 296. g2 kropka setColor otwórz nawias okrągły kolor zamknij nawias okrągły średnik.
Linia 297. g2 kropka setStroke otwórz nawias okrągły new BasicStroke otwórz nawias okrągły 2 kropka 0f zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 298. g2 kropka draw otwórz nawias okrągły sciezka zamknij nawias okrągły średnik.
Linia 300. prawy ukośnik prawy ukośnik Punkty na wykresie.
Linia 301. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny seria kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 302. int px znak równości obliczX otwórz nawias okrągły i przecinek szerokoscWykresu zamknij nawias okrągły średnik.
Linia 304. int py znak równości marginesGorny plus wysokoscWykresu.
Linia 305. minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły.
Linia 306. seria kropka get otwórz nawias okrągły i zamknij nawias okrągły prawy ukośnik maksY asterysk wysokoscWykresu.
Linia 307. zamknij nawias okrągły średnik.
Linia 309. g2 kropka fillOval otwórz nawias okrągły px minus 3 przecinek py minus 3 przecinek 6 przecinek 6 zamknij nawias okrągły średnik.
Linia 310. zamknij nawias klamrowy.
Linia 311. zamknij nawias klamrowy.
Linia 313. private int obliczX otwórz nawias okrągły int indeks przecinek int szerokoscWykresu zamknij nawias okrągły otwórz nawias klamrowy.
Linia 314. if otwórz nawias okrągły x kropka size otwórz nawias okrągły zamknij nawias okrągły otwórz nawias ostrokątny znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 315. return marginesLewy średnik.
Linia 316. zamknij nawias klamrowy.
Linia 318. return marginesLewy.
Linia 319. plus indeks asterysk szerokoscWykresu prawy ukośnik otwórz nawias okrągły x kropka size otwórz nawias okrągły zamknij nawias okrągły minus 1 zamknij nawias okrągły średnik.
Linia 320. zamknij nawias klamrowy.
Linia 322. private double znajdzMaksimum otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 323. double maksimum znak równości 0 kropka 0 średnik.
Linia 325. for otwórz nawias okrągły double wartosc dwukropek seria1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 326. maksimum znak równości Math kropka max otwórz nawias okrągły maksimum przecinek wartosc zamknij nawias okrągły średnik.
Linia 327. zamknij nawias klamrowy.
Linia 329. if otwórz nawias okrągły seria2 wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy.
Linia 330. for otwórz nawias okrągły double wartosc dwukropek seria2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 331. maksimum znak równości Math kropka max otwórz nawias okrągły maksimum przecinek wartosc zamknij nawias okrągły średnik.
Linia 332. zamknij nawias klamrowy.
Linia 333. zamknij nawias klamrowy.
Linia 335. return maksimum średnik.
Linia 336. zamknij nawias klamrowy.
Linia 337. zamknij nawias klamrowy.
Linia 338. zamknij nawias klamrowy.
package com.mycompany.ore;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Path2D;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
public class Main {
// Wartość dokładna i wartość zmierzona
public static double bladBezwzgledny(double x, double x0) {
return Math.abs(x - x0);
}
// x - wartość dokładna
// x0 - wartość zmierzona
public static double bladWzgledny(double x, double x0) {
double d = bladBezwzgledny(x, x0);
return d / x;
}
// Względny błąd procentowy
public static double bladWzglednyProcentowy(double x, double x0) {
return bladWzgledny(x, x0) * 100.0;
}
// Odpowiednik round(pi, liczbaMiejsc) z Pythona
public static double zaokraglij(double liczba, int liczbaMiejsc) {
return BigDecimal.valueOf(liczba)
.setScale(liczbaMiejsc, RoundingMode.HALF_EVEN)
.doubleValue();
}
public static void main(String[] args) {
double pi = 3.141592653589793;
List<Integer> wartosci = new ArrayList<>();
List<Double> bledyBezwzgledne = new ArrayList<>();
List<Double> bledyWzgledne = new ArrayList<>();
List<Double> bledyProcentowe = new ArrayList<>();
// Sprawdzamy coraz dokładniejsze przybliżenie liczby pi
for (int x = 2; x < 16; x++) {
double przyblizenie = zaokraglij(pi, x);
System.out.println(
"Obliczamy błąd przybliżenia dla wartości: "
+ przyblizenie
);
wartosci.add(x);
bledyBezwzgledne.add(
bladBezwzgledny(pi, przyblizenie)
);
bledyWzgledne.add(
bladWzgledny(pi, przyblizenie)
);
bledyProcentowe.add(
bladWzglednyProcentowy(pi, przyblizenie)
);
}
SwingUtilities.invokeLater(() -> {
utworzWykres(
"Wartość bazowa pi = " + pi,
wartosci,
bledyBezwzgledne,
bledyWzgledne,
"Błąd bezwzględny",
"Błąd względny"
);
utworzWykres(
"Wartość bazowa pi = " + pi,
wartosci,
bledyProcentowe,
null,
"Błąd względny procentowy",
null
);
});
}
private static void utworzWykres(
String tytul,
List<Integer> x,
List<Double> seria1,
List<Double> seria2,
String nazwaSerii1,
String nazwaSerii2
) {
JFrame okno = new JFrame(tytul);
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.setSize(850, 550);
okno.setLocationByPlatform(true);
okno.add(new PanelWykresu(
tytul,
x,
seria1,
seria2,
nazwaSerii1,
nazwaSerii2
));
okno.setVisible(true);
}
static class PanelWykresu extends JPanel {
private final String tytul;
private final List<Integer> x;
private final List<Double> seria1;
private final List<Double> seria2;
private final String nazwaSerii1;
private final String nazwaSerii2;
private final int marginesLewy = 90;
private final int marginesPrawy = 40;
private final int marginesGorny = 70;
private final int marginesDolny = 80;
PanelWykresu(
String tytul,
List<Integer> x,
List<Double> seria1,
List<Double> seria2,
String nazwaSerii1,
String nazwaSerii2
) {
this.tytul = tytul;
this.x = x;
this.seria1 = seria1;
this.seria2 = seria2;
this.nazwaSerii1 = nazwaSerii1;
this.nazwaSerii2 = nazwaSerii2;
setBackground(Color.WHITE);
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D g2 = (Graphics2D) graphics;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON
);
int szerokoscWykresu =
getWidth() - marginesLewy - marginesPrawy;
int wysokoscWykresu =
getHeight() - marginesGorny - marginesDolny;
double maksY = znajdzMaksimum();
if (maksY == 0.0) {
maksY = 1.0;
}
// Tytuł
g2.setColor(Color.BLACK);
g2.setFont(new Font("SansSerif", Font.BOLD, 16));
g2.drawString(tytul, marginesLewy, 30);
// Siatka i wartości osi Y
g2.setFont(new Font("SansSerif", Font.PLAIN, 11));
for (int i = 0; i <= 5; i++) {
int yPozycja =
marginesGorny + i * wysokoscWykresu / 5;
g2.setColor(Color.LIGHT_GRAY);
g2.drawLine(
marginesLewy,
yPozycja,
marginesLewy + szerokoscWykresu,
yPozycja
);
double wartoscY = maksY * (5 - i) / 5.0;
g2.setColor(Color.BLACK);
g2.drawString(
String.format("%.3e", wartoscY),
10,
yPozycja + 5
);
}
// Osie
g2.setColor(Color.BLACK);
g2.drawLine(
marginesLewy,
marginesGorny,
marginesLewy,
marginesGorny + wysokoscWykresu
);
g2.drawLine(
marginesLewy,
marginesGorny + wysokoscWykresu,
marginesLewy + szerokoscWykresu,
marginesGorny + wysokoscWykresu
);
// Wartości osi X
for (int i = 0; i < x.size(); i++) {
int xPozycja = obliczX(i, szerokoscWykresu);
g2.drawString(
String.valueOf(x.get(i)),
xPozycja - 5,
marginesGorny + wysokoscWykresu + 20
);
}
g2.drawString(
"Liczba miejsc po przecinku",
marginesLewy + szerokoscWykresu / 2 - 70,
getHeight() - 20
);
rysujSerie(
g2,
seria1,
maksY,
szerokoscWykresu,
wysokoscWykresu,
Color.RED
);
if (seria2 != null) {
rysujSerie(
g2,
seria2,
maksY,
szerokoscWykresu,
wysokoscWykresu,
Color.BLUE
);
}
// Legenda
int legendaX = getWidth() - 240;
int legendaY = 30;
g2.setColor(Color.RED);
g2.drawLine(legendaX, legendaY, legendaX + 25, legendaY);
g2.setColor(Color.BLACK);
g2.drawString(nazwaSerii1, legendaX + 35, legendaY + 5);
if (seria2 != null && nazwaSerii2 != null) {
g2.setColor(Color.BLUE);
g2.drawLine(
legendaX,
legendaY + 20,
legendaX + 25,
legendaY + 20
);
g2.setColor(Color.BLACK);
g2.drawString(
nazwaSerii2,
legendaX + 35,
legendaY + 25
);
}
}
private void rysujSerie(
Graphics2D g2,
List<Double> seria,
double maksY,
int szerokoscWykresu,
int wysokoscWykresu,
Color kolor
) {
Path2D sciezka = new Path2D.Double();
for (int i = 0; i < seria.size(); i++) {
int px = obliczX(i, szerokoscWykresu);
int py = marginesGorny + wysokoscWykresu
- (int) (
seria.get(i) / maksY * wysokoscWykresu
);
if (i == 0) {
sciezka.moveTo(px, py);
} else {
sciezka.lineTo(px, py);
}
}
g2.setColor(kolor);
g2.setStroke(new BasicStroke(2.0f));
g2.draw(sciezka);
// Punkty na wykresie
for (int i = 0; i < seria.size(); i++) {
int px = obliczX(i, szerokoscWykresu);
int py = marginesGorny + wysokoscWykresu
- (int) (
seria.get(i) / maksY * wysokoscWykresu
);
g2.fillOval(px - 3, py - 3, 6, 6);
}
}
private int obliczX(int indeks, int szerokoscWykresu) {
if (x.size() <= 1) {
return marginesLewy;
}
return marginesLewy
+ indeks * szerokoscWykresu / (x.size() - 1);
}
private double znajdzMaksimum() {
double maksimum = 0.0;
for (double wartosc : seria1) {
maksimum = Math.max(maksimum, wartosc);
}
if (seria2 != null) {
for (double wartosc : seria2) {
maksimum = Math.max(maksimum, wartosc);
}
}
return maksimum;
}
}
}
Wykres pierwszy – błąd względny oraz bezwzględny wartościowo:
R1R3GG411QETL
Wykres drugi – błąd względny procentowo:
RWWi7RM8MjNXI
Ilustracja przedstawia wykres błędu względnego procentowo zatytułowany "Wartość bazowa pi = 3,141592653589793". Pozioma oś jest przedstawiona od minus jednej drugiej do dwunastu z podziałką co dwa. Oś pionowa przedstawiona jest od minus jednej setnej do pięciu setnych z podziałką co jedną setną. Wykres błędu względnego zaczyna się w punkcie (0,0) i biegnie poziomo od punktu (0,0) do punktu (8,0), od którego zaczyna linowo rosnąć do punktu około (10;0,001). Stąd zaczyna rosnąć liniowo szybciej, czyli jest bardziej pochyły do punktu (;0,013). Stąd wykres rośnie liniowo szybciej do punktu (12;0,05).
Ź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. package com kropka mycompany kropka ore średnik.
Linia 2. import org kropka knowm kropka xchart kropka SwingWrapper średnik.
Linia 3. import org kropka knowm kropka xchart kropka XYChart średnik.
Linia 4. import org kropka knowm kropka xchart kropka XYChartBuilder średnik.
Linia 5. import org kropka knowm kropka xchart kropka style kropka markers kropka SeriesMarkers średnik.
Linia 7. import java kropka math kropka BigDecimal średnik.
Linia 8. import java kropka math kropka RoundingMode średnik.
Linia 9. import java kropka util kropka ArrayList średnik.
Linia 10. import java kropka util kropka List średnik.
Linia 12. public class Main otwórz nawias klamrowy.
Linia 14. prawy ukośnik prawy ukośnik x – wartość dokładna.
Linia 15. prawy ukośnik prawy ukośnik x0 – wartość zmierzona.
Linia 16. public static double bladBezwzgledny otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 17. return Math kropka abs otwórz nawias okrągły x minus x0 zamknij nawias okrągły średnik.
Linia 18. zamknij nawias klamrowy.
Linia 20. public static double bladWzgledny otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. double d znak równości bladBezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły średnik.
Linia 22. return d prawy ukośnik x średnik.
Linia 23. zamknij nawias klamrowy.
Linia 25. public static double bladWzglednyProcentowy otwórz nawias okrągły double x przecinek double x0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 26. double d znak równości bladBezwzgledny otwórz nawias okrągły x przecinek x0 zamknij nawias okrągły średnik.
Linia 27. return otwórz nawias okrągły d prawy ukośnik x zamknij nawias okrągły asterysk 100 kropka 0 średnik.
Linia 28. zamknij nawias klamrowy.
Linia 30. prawy ukośnik prawy ukośnik Odpowiednik funkcji round otwórz nawias okrągły zamknij nawias okrągły z Pythona.
Linia 31. public static double zaokraglij otwórz nawias okrągły double liczba przecinek int dokladnosc zamknij nawias okrągły otwórz nawias klamrowy.
Linia 32. return BigDecimal kropka valueOf otwórz nawias okrągły liczba zamknij nawias okrągły.
Linia 33. kropka setScale otwórz nawias okrągły dokladnosc przecinek RoundingMode kropka HALF podkreślnik EVEN zamknij nawias okrągły.
Linia 34. kropka doubleValue otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 35. zamknij nawias klamrowy.
Linia 37. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 38. double pi znak równości 3 kropka 141592653589793 średnik.
Linia 40. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny bledyBezwzgledne znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 41. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny bledyWzgledne znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 42. List otwórz nawias ostrokątny Double zamknij nawias ostrokątny bledyProcentowe znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 43. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny przyblizenia znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 45. String ostatniPoprawnyWynik znak równości cudzysłów cudzysłów średnik.
Linia 47. prawy ukośnik prawy ukośnik Python dwukropek range otwórz nawias okrągły 15 przecinek 1 przecinek minus 1 zamknij nawias okrągły.
Linia 48. for otwórz nawias okrągły int dokladnosc znak równości 15 średnik dokladnosc zamknij nawias ostrokątny znak równości 2 średnik dokladnosc minus minus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 49. double wartosc znak równości zaokraglij otwórz nawias okrągły pi przecinek dokladnosc zamknij nawias okrągły średnik.
Linia 51. double bladWzgledny znak równości bladWzgledny otwórz nawias okrągły pi przecinek wartosc zamknij nawias okrągły średnik.
Linia 52. double bladBezwzgledny znak równości bladBezwzgledny otwórz nawias okrągły pi przecinek wartosc zamknij nawias okrągły średnik.
Linia 53. double bladProcentowy znak równości.
Linia 54. bladWzglednyProcentowy otwórz nawias okrągły pi przecinek wartosc zamknij nawias okrągły średnik.
Linia 56. if otwórz nawias okrągły bladProcentowy zamknij nawias ostrokątny 0 kropka 01 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 57. break średnik.
Linia 58. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 59. bledyBezwzgledne kropka add otwórz nawias okrągły bladBezwzgledny zamknij nawias okrągły średnik.
Linia 60. bledyWzgledne kropka add otwórz nawias okrągły bladWzgledny zamknij nawias okrągły średnik.
Linia 61. bledyProcentowe kropka add otwórz nawias okrągły bladProcentowy zamknij nawias okrągły średnik.
Linia 63. ostatniPoprawnyWynik znak równości String kropka valueOf otwórz nawias okrągły wartosc zamknij nawias okrągły średnik.
Linia 64. przyblizenia kropka add otwórz nawias okrągły dokladnosc zamknij nawias okrągły średnik.
Linia 65. zamknij nawias klamrowy.
Linia 66. zamknij nawias klamrowy.
Linia 68. prawy ukośnik prawy ukośnik Przygotowanie wartości osi X.
Linia 69. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny x znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 71. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny przyblizenia kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 72. x kropka add otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 73. zamknij nawias klamrowy.
Linia 75. System kropka out kropka println otwórz nawias okrągły.
Linia 76. cudzysłów Ostatni wynik w założonym błędzie dwukropek cudzysłów.
Linia 77. plus ostatniPoprawnyWynik.
Linia 78. zamknij nawias okrągły średnik.
Linia 80. System kropka out kropka println otwórz nawias okrągły.
Linia 81. cudzysłów Liczby miejsc po przecinku dwukropek cudzysłów.
Linia 82. plus przyblizenia.
Linia 83. zamknij nawias okrągły średnik.
Linia 85. prawy ukośnik prawy ukośnik Pierwszy wykres.
Linia 86. XYChart pierwszyWykres znak równości new XYChartBuilder otwórz nawias okrągły zamknij nawias okrągły.
Linia 87. kropka width otwórz nawias okrągły 900 zamknij nawias okrągły.
Linia 88. kropka height otwórz nawias okrągły 600 zamknij nawias okrągły.
Linia 89. kropka title otwórz nawias okrągły.
Linia 90. cudzysłów Wartość bazowa pi znak równości cudzysłów plus pi.
Linia 91. plus cudzysłów – ostatni wynik w założonym błędzie znak równości cudzysłów.
Linia 92. plus ostatniPoprawnyWynik.
Linia 93. zamknij nawias okrągły.
Linia 94. kropka xAxisTitle otwórz nawias okrągły cudzysłów Numer przybliżenia cudzysłów zamknij nawias okrągły.
Linia 95. kropka yAxisTitle otwórz nawias okrągły cudzysłów Wartość błędu cudzysłów zamknij nawias okrągły.
Linia 96. kropka build otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 98. pierwszyWykres kropka addSeries otwórz nawias okrągły.
Linia 99. cudzysłów Błąd bezwzględny cudzysłów przecinek.
Linia 100. x przecinek.
Linia 101. bledyBezwzgledne.
Linia 102. zamknij nawias okrągły.
Linia 103. kropka setMarker otwórz nawias okrągły SeriesMarkers kropka CIRCLE zamknij nawias okrągły średnik.
Linia 105. pierwszyWykres kropka addSeries otwórz nawias okrągły.
Linia 106. cudzysłów Błąd względny cudzysłów przecinek.
Linia 107. x przecinek.
Linia 108. bledyWzgledne.
Linia 109. zamknij nawias okrągły.
Linia 110. kropka setMarker otwórz nawias okrągły SeriesMarkers kropka DIAMOND zamknij nawias okrągły średnik.
Linia 112. prawy ukośnik prawy ukośnik Drugi wykres.
Linia 113. XYChart drugiWykres znak równości new XYChartBuilder otwórz nawias okrągły zamknij nawias okrągły.
Linia 114. kropka width otwórz nawias okrągły 900 zamknij nawias okrągły.
Linia 115. kropka height otwórz nawias okrągły 600 zamknij nawias okrągły.
Linia 116. kropka title otwórz nawias okrągły.
Linia 117. cudzysłów Wartość bazowa pi znak równości cudzysłów plus pi.
Linia 118. plus cudzysłów – ostatni wynik w założonym błędzie znak równości cudzysłów.
Linia 119. plus ostatniPoprawnyWynik.
Linia 120. zamknij nawias okrągły.
Linia 121. kropka xAxisTitle otwórz nawias okrągły cudzysłów Numer przybliżenia cudzysłów zamknij nawias okrągły.
Linia 122. kropka yAxisTitle otwórz nawias okrągły cudzysłów Błąd procentowy otwórz nawias kwadratowy procent zamknij nawias kwadratowy cudzysłów zamknij nawias okrągły.
Linia 123. kropka build otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 125. drugiWykres kropka addSeries otwórz nawias okrągły.
Linia 126. cudzysłów Błąd względny procentowo cudzysłów przecinek.
Linia 127. x przecinek.
Linia 128. bledyProcentowe.
Linia 129. zamknij nawias okrągły.
Linia 130. kropka setMarker otwórz nawias okrągły SeriesMarkers kropka CIRCLE zamknij nawias okrągły średnik.
Linia 132. new SwingWrapper otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły pierwszyWykres zamknij nawias okrągły kropka displayChart otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 133. new SwingWrapper otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły drugiWykres zamknij nawias okrągły kropka displayChart otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 134. zamknij nawias klamrowy.
Linia 135. zamknij nawias klamrowy.
package com.mycompany.ore;
import org.knowm.xchart.SwingWrapper;
import org.knowm.xchart.XYChart;
import org.knowm.xchart.XYChartBuilder;
import org.knowm.xchart.style.markers.SeriesMarkers;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
public class Main {
// x – wartość dokładna
// x0 – wartość zmierzona
public static double bladBezwzgledny(double x, double x0) {
return Math.abs(x - x0);
}
public static double bladWzgledny(double x, double x0) {
double d = bladBezwzgledny(x, x0);
return d / x;
}
public static double bladWzglednyProcentowy(double x, double x0) {
double d = bladBezwzgledny(x, x0);
return (d / x) * 100.0;
}
// Odpowiednik funkcji round() z Pythona
public static double zaokraglij(double liczba, int dokladnosc) {
return BigDecimal.valueOf(liczba)
.setScale(dokladnosc, RoundingMode.HALF_EVEN)
.doubleValue();
}
public static void main(String[] args) {
double pi = 3.141592653589793;
List<Double> bledyBezwzgledne = new ArrayList<>();
List<Double> bledyWzgledne = new ArrayList<>();
List<Double> bledyProcentowe = new ArrayList<>();
List<Integer> przyblizenia = new ArrayList<>();
String ostatniPoprawnyWynik = "";
// Python: range(15, 1, -1)
for (int dokladnosc = 15; dokladnosc >= 2; dokladnosc--) {
double wartosc = zaokraglij(pi, dokladnosc);
double bladWzgledny = bladWzgledny(pi, wartosc);
double bladBezwzgledny = bladBezwzgledny(pi, wartosc);
double bladProcentowy =
bladWzglednyProcentowy(pi, wartosc);
if (bladProcentowy > 0.01) {
break;
} else {
bledyBezwzgledne.add(bladBezwzgledny);
bledyWzgledne.add(bladWzgledny);
bledyProcentowe.add(bladProcentowy);
ostatniPoprawnyWynik = String.valueOf(wartosc);
przyblizenia.add(dokladnosc);
}
}
// Przygotowanie wartości osi X
List<Integer> x = new ArrayList<>();
for (int i = 0; i < przyblizenia.size(); i++) {
x.add(i);
}
System.out.println(
"Ostatni wynik w założonym błędzie: "
+ ostatniPoprawnyWynik
);
System.out.println(
"Liczby miejsc po przecinku: "
+ przyblizenia
);
// Pierwszy wykres
XYChart pierwszyWykres = new XYChartBuilder()
.width(900)
.height(600)
.title(
"Wartość bazowa pi = " + pi
+ " – ostatni wynik w założonym błędzie = "
+ ostatniPoprawnyWynik
)
.xAxisTitle("Numer przybliżenia")
.yAxisTitle("Wartość błędu")
.build();
pierwszyWykres.addSeries(
"Błąd bezwzględny",
x,
bledyBezwzgledne
)
.setMarker(SeriesMarkers.CIRCLE);
pierwszyWykres.addSeries(
"Błąd względny",
x,
bledyWzgledne
)
.setMarker(SeriesMarkers.DIAMOND);
// Drugi wykres
XYChart drugiWykres = new XYChartBuilder()
.width(900)
.height(600)
.title(
"Wartość bazowa pi = " + pi
+ " – ostatni wynik w założonym błędzie = "
+ ostatniPoprawnyWynik
)
.xAxisTitle("Numer przybliżenia")
.yAxisTitle("Błąd procentowy [%]")
.build();
drugiWykres.addSeries(
"Błąd względny procentowo",
x,
bledyProcentowe
)
.setMarker(SeriesMarkers.CIRCLE);
new SwingWrapper<>(pierwszyWykres).displayChart();
new SwingWrapper<>(drugiWykres).displayChart();
}
}
Wykres pierwszy – błąd względny oraz bezwzględny wartościowo:
RD9KXPUUQA69D
Wykres drugi – błąd względny procentowo:
R8GLJ8DCR2ZXQ
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:
gdzie to wartość dokładna, – wartość zmierzona, a – 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:
gdzie to wartość dokładna, – wartość zmierzona, – błąd bezwzględny, zaś to błąd względny