Symulacja ruchów Browna metodą Monte Carlo w języku Python
Wprowadzenie Przeczytaj Gra edukacyjna Sprawdź się Dla nauczyciela
Szkocki biolog Robert Brown stwierdził w 1827 roku, że obserwowane przez mikroskop pyłki kwiatowe w zawiesinie wodnej wykonują nieustannie chaotyczne ruchy. Takie właśnie przypadkowe i na pozór samorzutne ruchy niewielkich cząsteczek (na przykład pyłków znajdujących się w gazie lub w cieczy) noszą nazwę ruchów Browna.
Opisane zjawisko można modelować w sposób matematyczny z wykorzystaniem tzw. metody Monte Carlo. W czasie bieżącej lekcji zastosujemy tę metodę w praktyce.
Twoje cele
Przygotujesz program, który będzie obliczał współrzędne (x, y) punktów symulujących ruchy Browna.
Przeprowadzisz analizę ruchów Browna bazując na wykresie.
Zastosujesz moduł matplotlib do generowania wykresów.
Źródło: Adrien Converse, licencja: CC 0.
Symulacja ruchów Browna metodą Monte Carlo
w języku Python
Przeczytaj
Metoda Monte Carlo polega na modelowaniu procesów fizycznych poprzez losowanie wielkości charakteryzujących proces i szacowanie wyniku na podstawie tak otrzymanych danych. Pomysłodawcą takiej właśnie techniki był polski matematyk Stanisław Ulam. Dzięki metodzie Monte Carlo możemy np. symulować obserwowane w przyrodzie ruchy Browna.
Chaotyczne i pozornie samorzutne ruchy Browna są wynikiem zderzeń drobin pyłku z cząsteczkami cieczy lub gazu. Spróbujemy symulować ruchy jednej cząsteczki pyłku obliczając jej kolejne współrzędne. Później wykreślimy trasę, jaką pokonała cząsteczka.
Symulacja będzie polegała na losowym wyznaczeniu kilkuset kolejnych punktów
o współrzędnych (x, y). Aby wykreślić ruchy Browna, musimy przyjąć pewne założenia:
cząsteczka na początku będzie znajdować się w środku układu współrzędnych (0, 0), w każdym ruchu cząsteczka będzie przemieszczała się o wektor o stałym module
(długości) r,
kierunek ruchu będzie wyznaczony losowym kątem fi,
kolejne współrzędne (x, y) cząstki będą określone następującymi wzorami:
Wartości obliczone w symulacji to tablice (listy) współrzędnych X oraz Y. Liczba ich elementów równa jest liczbie kroków symulacji.
Przykład 1
Napiszmy program obliczający losowe współrzędne cząsteczki. W tym celu skorzystamy z funkcji sqrt(), sin(), cos() oraz ze zmiennej pi, należących do modułu math. Po zaimportowaniu go będziemy mogli obliczyć kolejne wartości współrzędnych (x, y) losowanych punktów.
Aby móc uzyskać te same wyniki (identyczne zestawy liczb pseudolosowych) użyjemy funkcji seed() z modułu random. Wprowadzimy parametr seed_start, który pozwoli inicjować wartość początkową generatora liczb pseudolosowych.
Dzięki funkcji randint() będziemy losować wartości całkowite. Uzyskamy dwie listy o tej samej długości, zawierające kolejne punkty w układzie współrzędnych. Funkcja będzie zwracać te listy (brown_X, brown_Y), abyśmy mogli analizować poszczególne punkty (x, y).
φ ∈ (0, 2π)
X
n= X
n−1+ (r⋅ cos (φ))
Y
n= Y
n−1+ (r⋅ sin (φ))
W celu zobrazowania obliczeń posłużymy się biblioteką matplotlib. Wykorzystamy ją pisząc program, który będzie rysował na płaszczyźnie punkty, bazując na danych dostarczonych przez poprzednią funkcję.
def ruchy_browna(pozycja_poczatkowa: tuple, ile_krokow: int, wektor from math import sqrt, sin, cos, pi, radians
from random import randint, seed
seed(seed_start)
brown_X: list = [pozycja_poczatkowa[0]]
brown_Y: list = [pozycja_poczatkowa[1]]
for krok in range(1, ile_krokow):
# wylosowany kąt musi być podany w radianach; wymagają tego fi: float = radians(float(randint(0, 360)))
brown_X.append(brown_X[krok - 1] + (wektor_r * cos(fi))) brown_Y.append(brown_Y[krok - 1] + (wektor_r * sin(fi))) return (brown_X, brown_Y)
# przykład uruchomienia
punkty = ruchy_browna((0, 0), 10, 0.84)
print(punkty[0]) [0,
0.8379538022182524, 1.2954505916308752, 0.5280724072110906, 1.3313 0.5163199921482032, 0.45772455420313773, 1.236558992039239, 2.0683 1.5746445578564807]
print(punkty[1]) [0,
-0.0585954379450648, 0.6458878391290912, 0.9875466193127636, 1.233 1.0299244589761418, 0.1919706567578895, -0.12269888171147686, -0.2 0.43996998875702364]
def wizualizuj_ruchy_browna(wspolrzedne: tuple) -> None:
import matplotlib.pyplot as plt
X: list = wspolrzedne[0]
Y: list = wspolrzedne[1]
plt.plot(X, Y, 'o:', color='red', linewidth=2) 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
1 2 3 4 5 6
Wynikiem działania przedstawionego programu będzie wykres reprezentujący kolejne współrzędne położenia cząsteczki.
Ważne!
Nietypowym sposobem zapisu definicji funkcji są tzw. type hints, omówione
w dokumencie PEP‑484 języka Python. Pomagają one programistom, ale nie wpływają na działanie programów – nie są więc wymagane.
W przedstawiony wyżej sposób możemy symulować ruchy Browna. Podczas uruchamiania programu zwracajmy uwagę na wartości poszczególnych parametrów - wpływają one na dane końcowe.
plt.xlabel('Współrzędne X') plt.ylabel('Współrzędne Y') plt.title('Ruchy Browna') plt.grid(True)
plt.show()
# wywołanie z danymi poprzedniej funkcji punkty = ruchy_browna((0, 0), 10, 0.84) wizualizuj_ruchy_browna(punkty)
7 8 9 10 11 12 13 14 15
Już wiesz
Podsumujmy najważniejsze elementy tej lekcji:
metoda Monte Carlo może być przydatna przy szacowaniu wyników na podstawie dużej liczby zmiennych losowych
w języku Python możemy stosować tzw. type hints
funkcja seed() pozwala ustawić wartość początkową (ziarno) dla generatora liczb pseudolosowych
Słownik
zmienna losowa
zmienna, której wartość pozostaje nieznana do momentu losowania; w języku Python można uzyskać ją m.in. dzięki funkcjom należącym do modułu random:
randint(z, b) – zwraca liczbę całkowitą z zakresu [a, b]
randrange(a, b, c) – zwraca liczbę całkowitą z zakresu [a, b + 1] z krokiem c
random() – zwraca liczbę rzeczywistą z zakresu [0.0, 1.0) importowanie
operacja pozwalająca w programie (funkcji) używać dodatkowych funkcji lub obiektów, dostępnych w zewnętrznych bibliotekach
matplotlib
biblioteka służąca do przedstawienia obrazów złożonych z punktów o współrzędnych x oraz y (wykresów, histogramów, rozkładów itp.); moduł matplotlib nie jest dostępny w standardowej instalacji Pythona; należy zainstalować go korzystając z mechanizmu pip type hints
informacja o typie danego obiektu zapisana literalnie w kodzie programu; z uwagi na dynamiczną naturę języka Python pomaga w zrozumieniu kodu programu i pozwala na sprawdzanie kodu przez różne środowiska IDE (np. PyCharm, SublimeText lub Atom);
przykład użycia: zmienna: int = 10; type hints są dokładnie opisane Polecenie 1
Bazując na poprzednich przykładach spróbuj tak wywołać program, aby uzyskać na wykresie tylko punkty początkowy i końcowy podczas wykonywania 300 kolejnych kroków. Jako wektor_r przyjmij wartość 0,73, a seed_start niech wynosi 432432.
w dokumencie PEP 484 – ich inna nazwa to annotations (opisane w dokumencie PEP 3107)
seed(x)
(z ang. seed – ziarno) funkcja pozwalająca ustalić punkt początkowy obliczeń, których rezultatem jest wygenerowanie liczby pseudolosowej przez funkcje takie jak random(), randint() i podobne; po określeniu wartości zmiennej x wyniki działania funkcji
losowych są powtarzalne; jeśli nie podano wartości x lub ustalono ją jako None, za wartość x przyjmuje się aktualny czas
Gra edukacyjna
Sprawdź się
Ćwiczenie 1
Zaznacz wszystkie poprawne stwierdzenia
funkcja seed(x) służy do ustawienia tzw. "ziarna" generatora liczb pseudolosowych w języku Python
Ruchy Browna wzięły swą nazwę od biologa ze Szkocji
Metoda Monte Carlo, to modelowanie procesów matematycznych poprzez wielokrotne powtarzanie tych samych obliczeń
Ruchy Browna wzięły swą nazwę od angielskiego lekarza
funkcja seed(x) służy do ustawienia kolejnej wylosowanej liczby funkcją ranidnt()
Metoda Monte Carlo, to modelowanie procesów matematycznych poprzez losowanie dużej ilości danych
醙
Ćwiczenie 2
Przeanalizuj zawartość poniższego wykresu i wskaż poprawny kod, który został użyty do jego wygenerowania:
# kod 1
def obliczenia(start: int = 0, koniec: int = 301):
from math import sin, pi, radians import matplotlib.pyplot as plt
def r(i):
return sin(radians(float(i)))
X = [x for x in range(start, koniec)]
Y = [r(q) for q in X]
Z = [sin(q) for q in X]
plt.scatter(X, Y) plt.scatter(X, Z) plt.grid(True) plt.show()
# wykonanie
obliczenia(1, 310) 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Wskaż, który z powyższych kodów został użyty.
# kod 2
def obliczenia(start: int = 0, koniec: int = 301):
from math import sin, pi, radians import matplotlib.pyplot as plt
def r(i):
return sin(radians(float(i)))
X = [x for x in range(start, koniec)]
Y = [r(q) for q in X]
Z = [sin(q) for q in X]
plt.scatter(X, Y) plt.scatter(X, Z) plt.grid(True) plt.show()
# wykonanie
obliczenia(0, 301)
# kod 3
def obliczenia(start: int = 0, koniec: int = 301):
from math import sin, pi, radians import matplotlib.pyplot as plt
def r(i):
return sin(float(i))
X = [x for x in range(start, koniec)]
Y = [r(q) for q in X]
Z = [sin(q) for q in X]
plt.scatter(X, Y) plt.scatter(X, Z) plt.grid(True) plt.show()
# wykonanie
obliczenia(0, 301) 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Uzasadnij swoją odpowiedź.
kod nr 2
żaden z powyższych - te kody generują błąd: ZeroDivisionError: float division by zero
kod nr 1
kod nr 3
Uzupełnij
Ćwiczenie 3
Zdefiniuj funkcję
testowa(seed_start: int, ile_krok: int, wektor_r: float), która obliczy wartości 30 kolejnych pozycji ruchów Browna hipotetycznej cząsteczki (x, y) od
(-1.456, 1.834), a następnie dokona obliczeń średnich arytmetycznych tych ruchów, osobno dla wartości x oraz dla wartości y; wektor przesunięcia r powinien wynosić 0.0485.
Parametr seed_start powinien mieć wartość 4095037966.
Funkcja powinna zwrócić obiekt typu tuple o postaci:
(punkty_X, punkty_Y, srednia_x, srednia_y)
punkty_X - lista obiektów float
punkty_Y - lista obiektów float
srednia_x - obiekt float - średnia arytmetyczna punkty_X
srednia_y - obiekt float - średnia arytmetyczna punkty_Y
輸
Ćwiczenie 4
Zdefiniuj funkcję
testowa(seed_start: int, ile_krok: int, wektor_r: float), która obliczy metodą Monte Carlo 30 kolejnych pozycji ruchów Browna hipotetycznej cząsteczki (x, y) od (1.65, -1.42); wektor przesunięcia r powinien wynosić 0.85. Parametr seed_start powinien mieć wartość 4050396.
Funkcja powinna zwrócić obiekt typu tuple o wartości:
(odleglosc_X, odleglosc_Y) - wartość bezwzględna odległości pomiędzy punktem końcowym a początkowym, liczona w następujący sposób:
odleglosc_X = X ∣∣[ostatni] − X
[pierwszy]
odleglosc_Y = Y ∣∣[ostatni] − Y
[pierwszy] 醙
Dla nauczyciela
Autor: Michał Zagrobelny Przedmiot: Informatyka
Temat: Symulacja ruchów Browna metodą Monte Carlo w języku Python Grupa docelowa:
III etap edukacyjny, liceum ogólnokształcące, technikum Podstawa programowa:
Zakres podstawowy i rozszerzony Cele kształcenia – wymagania ogólne
1) Rozumienie, analizowanie i rozwiązywanie problemów na bazie logicznego i abstrakcyjnego myślenia, myślenia algorytmicznego i sposobów reprezentowania informacji.
2) Programowanie i rozwiązywanie problemów z wykorzystaniem komputera oraz innych urządzeń cyfrowych: układanie i programowanie algorytmów, organizowanie, wyszukiwanie i udostępnianie informacji, posługiwanie się aplikacjami komputerowymi.
Kształtowane kompetencje kluczowe:
kompetencje obywatelskie;
kompetencje cyfrowe;
kompetencje osobiste, społeczne i w zakresie umiejętności uczenia się;
kompetencje matematyczne oraz kompetencje w zakresie nauk przyrodniczych, technologii i inżynierii.
Cele operacyjne ( językiem ucznia):
Przygotujesz program, który będzie obliczał współrzędne (x, y) punktów symulujących ruchy Browna.
Przeprowadzisz analizę ruchów Browna bazując na wykresie.
Zastosujesz moduł matplotlib do generowania wykresów.
Strategie nauczania:
konstruktywizm;
konektywizm.
Metody i techniki nauczania:
dyskusja;
rozmowa nauczająca z wykorzystaniem multimedium i ćwiczeń interaktywnych.
Formy pracy:
praca indywidualna;
praca w parach;
praca w grupach;
praca całego zespołu klasowego.
Środki dydaktyczne:
komputery z głośnikami, słuchawkami i dostępem do internetu;
zasoby multimedialne zawarte w e‐materiale;
tablica interaktywna/tablica, pisak/kreda;
oprogramowanie dla języka Python 3 (lub nowszej wersji), w tym PyCharm lub IDLE.
Przebieg lekcji Przed lekcją:
1. Przygotowanie do zajęć. Nauczyciel loguje się na platformie i udostępnia e‐materiał:
„Symulacja ruchów Browna metodą Monte Carlo w języku Python”. Nauczyciel prosi uczniów o zapoznanie się z treściami w sekcji „Przeczytaj”.
Faza wstępna:
1. Wyświetlenie przez nauczyciela tematu i celów zajęć, przejście do wspólnego ustalenia kryteriów sukcesu.
2. Rozpoznanie wiedzy uczniów. Nauczyciel zadaje uczniom pytania dotyczące ich aktualnego stanu wiedzy w obszarze poruszanego tematu, np.
– jakie zjawisko nosi nazwę ruchów Browna?
– co to jest zmienna losowa?
– na czym polega modelowanie z wykorzystaniem tzw. metody Monte Carlo?
Chętni lub wybrani uczniowie udzielają na nie odpowiedzi.
Faza realizacyjna:
1. Uczniowie analizują przykład z sekcji „Przeczytaj” i powtarzają zaprezentowane rozwiązanie na swoim komputerze.
2. Praca z multimedium. Uczniowie w zespołach dwuosobowych zapoznają się z treścią polecenia nr 1: „Przeanalizuj interaktywną symulację ruchów Browna dla cząsteczek w zależności od temperatury. Zapisz swoje spostrzeżenia.” z sekcji „Gra edukacyjna”
i wspólnie analizują kolejne kroki rozwiązania postawionego problemu.
3. Ćwiczenie umiejętności. Uczniowie wykonują ćwiczenia nr 1‐3 z sekcji „Sprawdź się”.
Nauczyciel sprawdza poprawność wykonanych zadań, omawiając je wraz z uczniami.
Faza podsumowująca:
1. Nauczyciel wyświetla na tablicy temat lekcji i cele zawarte w sekcji „Wprowadzenie”.
W kontekście ich realizacji podsumowuje przebieg zajęć, a także wskazuje mocne i słabe strony pracy uczniów.
Praca domowa:
1. Uczniowie wykonują ćwiczenie 4 z sekcji „Sprawdź się”.
Materiały pomocnicze:
Oficjalna dokumentacja techniczna dla języka Python 3 (lub nowszej wersji).
Oficjalna dokumentacja techniczna dla oprogramowania PyCharm lub IDLE.
Wskazówki metodyczne:
Nauczyciel może wykorzystać multimedium w sekcji „Przeczytaj” do pracy przed lekcją.
Uczniowie zapoznają się z jego treścią i przygotowują do pracy na zajęciach w ten sposób, żeby móc samodzielnie rozwiązać zadania w temacie „Symulacja ruchów Browna metodą Monte Carlo w języku Python”.