{"id":"informatyka-2016-maj-matura-rozszerzona/zad/4.3","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"4.3","points":5,"ptype":"open","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nBłąd bezwzględny przybliżonej wartości liczby pi, wyznaczonej z n punktów: εn = |π - pin|.\n\nOblicz εn dla n = 1, 2, 3, …, 1700. Na podstawie powyższego zestawienia utwórz wykres liniowy ilustrujący zmiany dokładności wyznaczanej liczby pi. Zadbaj o czytelność wykresu.\n\nWartości dla ε1000 oraz ε1700 (zaokrąglone do czterech miejsc po przecinku) zapisz do pliku wyniki_4.txt.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**ε₁₀₀₀ = 0,0864**\n\n**ε₁₇₀₀ = 0,0184**\n\nWykres liniowy: oś X = n (1 1700), oś Y = εn. Charakter: szybki spadek na początku, malejąca obwiednia jak ~1/√n, drobne oscylacje. Tytuł: \"Błąd bezwzględny przybliżenia liczby π metodą Monte Carlo\". Osie: \"liczba punktów n\" / \"błąd bezwzględny εn\".\n\n## Sposób 1 - wzór i implementacja Python\n\n**Wzór:**\n- `pi_n = 4 · nk_n / n`, gdzie nk_n = liczba punktów w kole wśród pierwszych n.\n- `εn = |π - pi_n|`.\n\n```python\nimport math\nimport matplotlib.pyplot as plt\n\npunkty = []\nwith open('punkty.txt') as f:\nfor linia in f:\ncz = linia.strip().split()\nif len(cz) == 2:\npunkty.append((int(cz[0]), int(cz[1])))\n\nnk_cumulative = 0\nbledy = []\nfor i in range(1, 1701):\nx, y = punkty[i - 1]\nd2 = (x - 200) ** 2 + (y - 200) ** 2\nif d2 <= 40000:\nnk_cumulative += 1\npi_n = 4 * nk_cumulative / i\nepsilon = abs(math.pi - pi_n)\nbledy.append(epsilon)\n\nprint(f\"ε1000 = {bledy[999]:.4f}\") # 0.0864\nprint(f\"ε1700 = {bledy[1699]:.4f}\") # 0.0184\n\n# Zapis do pliku\nwith open('wyniki_4.txt', 'w') as f:\nf.write(f\"4.3\\n\")\nf.write(f\"ε1000 = {bledy[999]:.4f}\\n\")\nf.write(f\"ε1700 = {bledy[1699]:.4f}\\n\")\n\n# Wykres\nplt.figure(figsize=(12, 5))\nplt.plot(range(1, 1701), bledy, linewidth=0.7)\nplt.title('Błąd bezwzględny przybliżenia liczby π metodą Monte Carlo')\nplt.xlabel('liczba punktów n')\nplt.ylabel('błąd bezwzględny εn = |π - πn|')\nplt.grid(True, alpha=0.3)\nplt.savefig('wykres_blad_pi.png', dpi=120)\n\n## Sposób 2 - arkusz kalkulacyjny\n\n**Konstrukcja:**\n1. Kolumny A, B: x, y (1700 wierszy z pliku punkty.txt).\n2. Kolumna C: `=(A1-200)^2+(B1-200)^2`.\n3. Kolumna D: `=JEŻELI(C1<=40000;1;0)`.\n4. Kolumna E: kumulatywna suma - E1: `=D1`; E2: `=E1+D2`; przeciągnąć w dół.\n5. Kolumna F: `=4*E1/WIERSZ()`.\n6. Kolumna G: `=ABS(PI()-F1)`.\n7. ε1000 = G1000 = **0,0864**; ε1700 = G1700 = **0,0184**.\n8. Wykres: zaznacz zakres G1:G1700, Wstaw → wykres liniowy.\n9. Tytuł wykresu, opisy osi (n, εn).\n\n## Sposób 3 - pseudokod\n\nwczytaj punkty[1 10000] z pliku\nnk ← 0\notwórz wyniki_4.txt do zapisu\ndla i = 1 do 1700 wykonuj:\n(x, y) ← punkty[i]\nd2 ← (x-200)*(x-200) + (y-200)*(y-200)\njeżeli d2 ≤ 40000:\nnk ← nk + 1\npi_n ← 4 * nk / i\neps[i] ← |π - pi_n|\nzapisz \"ε1000 = \" + zaokrąglij(eps[1000], 4) do pliku\nzapisz \"ε1700 = \" + zaokrąglij(eps[1700], 4) do pliku\nzrób wykres liniowy z (i, eps[i]) dla i=1 1700\n\n## Reference informatyczny - Monte Carlo, dokładność\n\n> Reference - Konwergencja metody Monte Carlo:\n> - **Twierdzenie graniczne**: błąd estymatora maleje proporcjonalnie do `1/√n`.\n> - Dla π: błąd ε ≈ 1.642/√n (dla losowego rozkładu w kwadracie).\n> - **n = 100** → ε ≈ 0,16 (ale w zadaniu konkretnie 0,0584 dla danych - punkty nie są idealnie losowe).\n> - **n = 10000** → ε ≈ 0,016.\n> - Krzywa błędu **oscyluje, ale obwiednia maleje** monotonicznie.\n>\n> Reference - Wykresy w matplotlib / Excel:\n> - **Wykres liniowy**: gdy chcemy pokazać trend / przebieg czasowy.\n> - **Kolumnowy**: porównanie kategorii.\n> - **Punktowy (scatter)**: zależność między dwoma zmiennymi.\n> - Tytuł + opis osi = obowiązkowe dla CKE (1 punkt za czytelność).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.3, max 5 pkt):\n> - **3 pkt** za prawidłowe wartości ε:\n> - 1 pkt - wartość ε1000 = 0,0864\n> - 1 pkt - wartość ε1700 = 0,0184\n> - 1 pkt - odpowiednia dokładność (4 miejsca po przecinku)\n> - **1 pkt** - prawidłowy zakres danych i typ wykresu (liniowy)\n> - **1 pkt** - czytelny opis wykresu (tytuł + osie)\n> - **0 pkt** - odpowiedź błędna\n\n## Typowe pułapki\n\n- **Niesumowanie kumulatywne** - niektórzy uczniowie liczą tylko `nk_n` od i-tego punktu, a nie od 1. Wynik byłby chaotyczny.\n- **Pomylenie ε z pi** - zapisanie 3,228 zamiast 0,0864 (różnica między π a 3,228).\n- **Wykres bez tytułu/opisu osi** - strata 1 pkt.\n- **Wykres kolumnowy zamiast liniowego** - strata 1 pkt. Liniowy lepiej oddaje ciągłą zmianę.\n- **Niepoprawna dokładność** - 0,09 lub 0,0863 zamiast 0,0864 (3 vs 4 miejsca po przecinku, zaokrąglenie).\n- **Off-by-one** - czy ε1000 to błąd po 1000 punktach (włącznie z 1000-nym), czy 999-nym? Treść: \"εn dla n=1, 2, , 1700\" oznacza pierwszych n punktów, czyli n włącznie.\n\n## Złożoność obliczeniowa\n\n- Wczytanie 10000 punktów: O(N).\n- Obliczenie 1700 wartości εn: O(1700) z kumulatywną sumą.\n- Wykres: O(1700) renderowanych punktów.\n- **Łącznie: O(N) ≈ 10⁴ operacji.**","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2016 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 4.1.</p>\n<p>Błąd bezwzględny przybliżonej wartości liczby pi, wyznaczonej z n punktów: εn = |π - pin|.</p>\n<p>Oblicz εn dla n = 1, 2, 3, …, 1700. Na podstawie powyższego zestawienia utwórz wykres liniowy ilustrujący zmiany dokładności wyznaczanej liczby pi. Zadbaj o czytelność wykresu.</p>\n<p>Wartości dla ε1000 oraz ε1700 (zaokrąglone do czterech miejsc po przecinku) zapisz do pliku wyniki_4.txt.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>ε₁₀₀₀ = 0,0864</strong></p>\n<p><strong>ε₁₇₀₀ = 0,0184</strong></p>\n<p>Wykres liniowy: oś X = n (1 1700), oś Y = εn. Charakter: szybki spadek na początku, malejąca obwiednia jak ~1/√n, drobne oscylacje. Tytuł: &quot;Błąd bezwzględny przybliżenia liczby π metodą Monte Carlo&quot;. Osie: &quot;liczba punktów n&quot; / &quot;błąd bezwzględny εn&quot;.</p>\n<h4>Sposób 1 - wzór i implementacja Python</h4>\n<p><strong>Wzór:</strong></p>\n<ul><li><code>pi_n = 4 · nk_n / n</code>, gdzie nk_n = liczba punktów w kole wśród pierwszych n.</li><li><code>εn = |π - pi_n|</code>.</li></ul>\n<p>```python<br>import math<br>import matplotlib.pyplot as plt</p>\n<p>punkty = []<br>with open(&#x27;punkty.txt&#x27;) as f:<br>for linia in f:<br>cz = linia.strip().split()<br>if len(cz) == 2:<br>punkty.append((int(cz[0]), int(cz[1])))</p>\n<p>nk_cumulative = 0<br>bledy = []<br>for i in range(1, 1701):<br>x, y = punkty[i - 1]<br>d2 = (x - 200) <strong> 2 + (y - 200) </strong> 2<br>if d2 &lt;= 40000:<br>nk_cumulative += 1<br>pi_n = 4 * nk_cumulative / i<br>epsilon = abs(math.pi - pi_n)<br>bledy.append(epsilon)</p>\n<p>print(f&quot;ε1000 = {bledy[999]:.4f}&quot;) # 0.0864<br>print(f&quot;ε1700 = {bledy[1699]:.4f}&quot;) # 0.0184</p>\n<h3>Zapis do pliku</h3>\n<p>with open(&#x27;wyniki_4.txt&#x27;, &#x27;w&#x27;) as f:<br>f.write(f&quot;4.3\\n&quot;)<br>f.write(f&quot;ε1000 = {bledy[999]:.4f}\\n&quot;)<br>f.write(f&quot;ε1700 = {bledy[1699]:.4f}\\n&quot;)</p>\n<h3>Wykres</h3>\n<p>plt.figure(figsize=(12, 5))<br>plt.plot(range(1, 1701), bledy, linewidth=0.7)<br>plt.title(&#x27;Błąd bezwzględny przybliżenia liczby π metodą Monte Carlo&#x27;)<br>plt.xlabel(&#x27;liczba punktów n&#x27;)<br>plt.ylabel(&#x27;błąd bezwzględny εn = |π - πn|&#x27;)<br>plt.grid(True, alpha=0.3)<br>plt.savefig(&#x27;wykres_blad_pi.png&#x27;, dpi=120)</p>\n<h4>Sposób 2 - arkusz kalkulacyjny</h4>\n<p><strong>Konstrukcja:</strong></p>\n<ol><li>Kolumny A, B: x, y (1700 wierszy z pliku punkty.txt).</li><li>Kolumna C: <code>=(A1-200)^2+(B1-200)^2</code>.</li><li>Kolumna D: <code>=JEŻELI(C1&lt;=40000;1;0)</code>.</li><li>Kolumna E: kumulatywna suma - E1: <code>=D1</code>; E2: <code>=E1+D2</code>; przeciągnąć w dół.</li><li>Kolumna F: <code>=4*E1/WIERSZ()</code>.</li><li>Kolumna G: <code>=ABS(PI()-F1)</code>.</li><li>ε1000 = G1000 = <strong>0,0864</strong>; ε1700 = G1700 = <strong>0,0184</strong>.</li><li>Wykres: zaznacz zakres G1:G1700, Wstaw → wykres liniowy.</li><li>Tytuł wykresu, opisy osi (n, εn).</li></ol>\n<h4>Sposób 3 - pseudokod</h4>\n<p>wczytaj punkty[1 10000] z pliku<br>nk ← 0<br>otwórz wyniki_4.txt do zapisu<br>dla i = 1 do 1700 wykonuj:<br>(x, y) ← punkty[i]<br>d2 ← (x-200)<em>(x-200) + (y-200)</em>(y-200)<br>jeżeli d2 ≤ 40000:<br>nk ← nk + 1<br>pi_n ← 4 * nk / i<br>eps[i] ← |π - pi_n|<br>zapisz &quot;ε1000 = &quot; + zaokrąglij(eps[1000], 4) do pliku<br>zapisz &quot;ε1700 = &quot; + zaokrąglij(eps[1700], 4) do pliku<br>zrób wykres liniowy z (i, eps[i]) dla i=1 1700</p>\n<h4>Reference informatyczny - Monte Carlo, dokładność</h4>\n<blockquote>Reference - Konwergencja metody Monte Carlo:<br>- <strong>Twierdzenie graniczne</strong>: błąd estymatora maleje proporcjonalnie do <code>1/√n</code>.<br>- Dla π: błąd ε ≈ 1.642/√n (dla losowego rozkładu w kwadracie).<br>- <strong>n = 100</strong> → ε ≈ 0,16 (ale w zadaniu konkretnie 0,0584 dla danych - punkty nie są idealnie losowe).<br>- <strong>n = 10000</strong> → ε ≈ 0,016.<br>- Krzywa błędu <strong>oscyluje, ale obwiednia maleje</strong> monotonicznie.<br><br>Reference - Wykresy w matplotlib / Excel:<br>- <strong>Wykres liniowy</strong>: gdy chcemy pokazać trend / przebieg czasowy.<br>- <strong>Kolumnowy</strong>: porównanie kategorii.<br>- <strong>Punktowy (scatter)</strong>: zależność między dwoma zmiennymi.<br>- Tytuł + opis osi = obowiązkowe dla CKE (1 punkt za czytelność).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.3, max 5 pkt):<br>- <strong>3 pkt</strong> za prawidłowe wartości ε:<br>- 1 pkt - wartość ε1000 = 0,0864<br>- 1 pkt - wartość ε1700 = 0,0184<br>- 1 pkt - odpowiednia dokładność (4 miejsca po przecinku)<br>- <strong>1 pkt</strong> - prawidłowy zakres danych i typ wykresu (liniowy)<br>- <strong>1 pkt</strong> - czytelny opis wykresu (tytuł + osie)<br>- <strong>0 pkt</strong> - odpowiedź błędna</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Niesumowanie kumulatywne</strong> - niektórzy uczniowie liczą tylko <code>nk_n</code> od i-tego punktu, a nie od 1. Wynik byłby chaotyczny.</li><li><strong>Pomylenie ε z pi</strong> - zapisanie 3,228 zamiast 0,0864 (różnica między π a 3,228).</li><li><strong>Wykres bez tytułu/opisu osi</strong> - strata 1 pkt.</li><li><strong>Wykres kolumnowy zamiast liniowego</strong> - strata 1 pkt. Liniowy lepiej oddaje ciągłą zmianę.</li><li><strong>Niepoprawna dokładność</strong> - 0,09 lub 0,0863 zamiast 0,0864 (3 vs 4 miejsca po przecinku, zaokrąglenie).</li><li><strong>Off-by-one</strong> - czy ε1000 to błąd po 1000 punktach (włącznie z 1000-nym), czy 999-nym? Treść: &quot;εn dla n=1, 2, , 1700&quot; oznacza pierwszych n punktów, czyli n włącznie.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie 10000 punktów: O(N).</li><li>Obliczenie 1700 wartości εn: O(1700) z kumulatywną sumą.</li><li>Wykres: O(1700) renderowanych punktów.</li><li><strong>Łącznie: O(N) ≈ 10⁴ operacji.</strong></li></ul>"}]}