• Nie Znaleziono Wyników

Symulacja ruchów Browna metodą Monte Carlo w języku Python. Wprowadzenie Przeczytaj Gra edukacyjna Sprawdź się Dla nauczyciela

N/A
N/A
Protected

Academic year: 2022

Share "Symulacja ruchów Browna metodą Monte Carlo w języku Python. Wprowadzenie Przeczytaj Gra edukacyjna Sprawdź się Dla nauczyciela"

Copied!
16
0
0

Pełen tekst

(1)

Symulacja ruchów Browna metodą Monte Carlo w języku Python

Wprowadzenie Przeczytaj Gra edukacyjna Sprawdź się Dla nauczyciela

(2)

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

(3)

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 (φ))

(4)

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

(5)

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

(6)

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.

(7)

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

(8)

Gra edukacyjna

(9)

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

(10)

Ć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

(11)

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

(12)

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

(13)

Ć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]

(14)

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.

(15)

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:

(16)

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”.

Cytaty

Powiązane dokumenty

W roku tym ukazały się cztery bardzo ważne prace Alberta Einsteina: dwie kładące podstawy pod szczegól- ną teorię względności, praca wyjaśniająca efekt fotoelektrycz- ny,

DIES IRAE APOKALIPSA ŚW. Szum się wielki stał dokoła,. Kiedy surma archanioła Na ostatni Sąd zawoła. Enoch i Eliasz z

Sztuczne oddychanie może odbywać się przez bezpośrednie wtłaczanie powietrza do dróg oddechowych poszkodowanego oddechem osoby udzielającej pomocy lub przy

Zakładamy, że obiekt którego moment bez- władności chcemy wyznaczyć jest jednorodny tzn.. W sprawozdaniu proszę: a) narysować kontur sześcianu i zaznaczyć na nim osie obrotu,

Celem ćwiczenia jest bezpośrednia obserwacja ruchów Browna mikrokulek lateksowych w wodzie oraz wyznaczenie stałej Boltzmanna i stałej Avogadro na podstawie ilościowej

OnpexejieH CTOxacTnaecKHii aH ajior Bonpoca CTauHOHapHoM TenJionpoBOflHO- cth c H30T epMHaecKHMH KpaeBHMK

Streszczenie. W artykule posługując się metodą Monte Carlo prze- p rowadzono badani a wpływu zbiornika wyrównawczego na rytmiczność produkcji górniczej.

Oficjalna dokumentacja techniczna dla oprogramowania Code::Blocks 16.01 (lub nowszej wersji), Orwell Dev‑C++ 5.11 (lub nowszej wersji) lub Microsoft Visual Studio. Oficjalna