W tym artykule rozwiązuję zadanie 4 Liczba PI z arkusza maturalnego z informatyki. Trudność zadania polega na przełożeniu podejścia matematycznego na kod.
Arkusz z zadaniem można znaleźć tutaj, a odpowiedzi tutaj.
W kartezjańskim układzie współrzędnych na płaszczyźnie narysowano kwadrat o boku
długości 400 i środku symetrii w punkcie (200;200). Boki kwadratu są równoległe do osi
układu współrzędnych. W kwadrat wpisano koło. Następnie wylosowano 10 000 punktów
należących do kwadratu. Współrzędne (x,y) punktów zostały zapisane w pliku
punkty.txt, każdy punkt w osobnym wierszu. Wiersz ma postać dwóch liczb całkowitych
z zakresu <0;400>, rozdzielonych pojedynczym znakiem odstępu.
Jako, że zawsze będziemy operować na 2 współrzędnych warto dane popakować w klasę Point dla spójności oraz czytelności kodu.
Funkcja getPoints() interpretuje dane do postacii obiektu. Po wywołaniu funkcji otrzymujemy globalną zmienną dostępną później w kodzie.
Wypisz współrzędne tych punktów, które należą do brzegu koła (okręgu), oraz podaj liczbę
punktów należących do wnętrza koła (brzeg koła nie należy do wnętrza koła).
Wskazówka:
Równanie okręgu o środku w punkcie `S = (a, b)` promieniu `r > 0` ma postać:
`(x - a)^2 + (y - b)^2 = r^2`
Pierwsze zadanie jest po prostu przełożeniem wzoru na kod. Jeżeli współrzędne spełniają równanie, a wnioskująć z treści wiemy, że promień wynosi 200 to zostają one wypisane.
Mamy też dodatkowo sprawdzić, które punkty należą do koła. Działanie jest właściwie analogiczne z tym, że znak równości zamieniamy na znak mniejszości.
Przy założeniu równomiernego rozkładu punktów w kwadracie, stosunek liczby punktów `n_k`
należących do koła do liczby punktów `n` należących do kwadratu jest w przybliżeniu równy
stosunkowi pola koła `P_k` do pola kwadratu `P`:
`n_k/n \approx P_k / P`
W odpowiedzi mamy podać wyniki dla pierwszych 1000, 5000 oraz 10000 punktów z zakrągleniem do 4 miejsc po przecinku.
Funkcja powyżej mimo, iż wydaje się podobna to jednak posiada parametr amount, który określa dla jakiej próbki ma zostać zwrócona liczba punktów.
Zmienna ratio określa stosunek ilości punktów koła do punktów kwadratu.
Pole koła otrzymujemy poprze iloczyn pola kwadratu i stosunku.
Mając pole koła możemy łatwo otrzymać `pi` za pomocą dzielenia przez `r^2`, a później przez rozmiar próbki.
Błąd bezwzględny przybliżonej wartości liczby pi, wyznaczonej z n punktów, definiujemy
następująco:
`E_n = \abs{pi–pi_n}`
gdzie:
π – wartość liczby pi, będąca wynikiem standardowej funkcji z narzędzia
informatycznego, z którego korzystasz;
`pi_n` – przybliżona wartość liczby pi wyznaczona z n kolejnych punktów,
poczynając od pierwszego punktu z pliku punkty.txt,
np. pi1000 – liczba wyznaczona z pierwszego tysiąca punktów.
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.
Wykorzystując już napisaną funkcję countPI obliczamy błąd bezwzględny i zapisujemy do pliku w celu utworzenia wykresu.
Python wartości typu float zapisze z kropką. Niestety excel preferuje przecinki, dla tego podmieniamy je i zapisujemy plik z parametrem `a` czyli dodawania, a nie nadpisywania pliku.
Otrzymane wyniki wkleiłem do excel'a i na ich podstawie narysowałem wykres. Na sam koniec zostało już tylko uruchomić funkcje i porównać wyniki z odpowiedziami.
Dziękuję Ci za przeczytanie tego artykułu :). Zachęcam do sprawdzenia innych moich postów na blogu.
Zachęcam cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.