Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Przypomnienie wiadomości o symulowaniu ruchów Browna metodą Monte Carlo

W e‑materiale Modelowanie ruchów BrownaP14JSHgfzModelowanie ruchów Browna przeprowadziliśmy proste modelowanie, w którym zakładaliśmy, że w każdej jednostce czasu cząsteczka przemieszcza się o określoną z góry odległość. W ramach przypomnienia zrealizujmy identyczny algorytm w środowisku graficznym Javy – bibliotece SwingSwingSwing.

Ten e‑materiał nie dotyczy obsługi bibliotek graficznych w języku Java, dlatego utworzyliśmy prosty szablon do prezentowania wyników naszej symulacji w oknie systemowym:

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka ArrayList średnik. Linia 4. import java kropka util kropka Random średnik. Linia 5. import static java kropka lang kropka Thread kropka sleep średnik. Linia 7. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik punkt przechowujący pozycję cząsteczki. Linia 9. private static ArrayList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new ArrayList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 11. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 12. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał cząsteczkę. Linia 13. prawy ukośnik prawy ukośnik oraz jej trasę. Linia 14. at Override. Linia 15. public void paint otwórz nawias okrągły Graphics grafika zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. prawy ukośnik prawy ukośnik promień cząsteczki. Linia 17. int promien znak równości 5 średnik. Linia 19. Graphics2D grafika2D znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły grafika średnik. Linia 20. super kropka paint otwórz nawias okrągły grafika zamknij nawias okrągły średnik. Linia 22. prawy ukośnik prawy ukośnik rysuj trasę. Linia 23. int i znak równości 1 średnik. Linia 24. for otwórz nawias okrągły średnik i otwórz nawias ostrokątny punkty kropka size otwórz nawias okrągły zamknij nawias okrągły średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 25. grafika2D kropka drawLine otwórz nawias okrągły punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka x przecinek. Linia 26. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka y przecinek. Linia 27. punkty kropka get otwórz nawias okrągły i minus 1 zamknij nawias okrągły kropka x przecinek. Linia 28. punkty kropka get otwórz nawias okrągły i minus 1 zamknij nawias okrągły kropka y zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 30. minus minus i średnik. Linia 32. prawy ukośnik prawy ukośnik rysuj cząsteczkę na ostatniej pozycji. Linia 33. if otwórz nawias okrągły wykrzyknik punkty kropka isEmpty otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 34. grafika2D kropka fillOval otwórz nawias okrągły punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka x minus promien przecinek. Linia 35. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka y minus promien przecinek. Linia 36. 2 asterysk promien przecinek 2 asterysk promien zamknij nawias okrągły średnik. Linia 37. zamknij nawias klamrowy. Linia 38. zamknij nawias klamrowy. Linia 40. prawy ukośnik prawy ukośnik funkcja rysująca cząsteczkę na wybranej pozycji. Linia 41. public void rysujCzasteczke otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 42. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 100 kropka 0 zamknij nawias okrągły plus getSize otwórz nawias okrągły zamknij nawias okrągły kropka width prawy ukośnik 2 średnik. Linia 43. int y0 znak równości getSize otwórz nawias okrągły zamknij nawias okrągły kropka height prawy ukośnik 2 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 100 kropka 0 zamknij nawias okrągły średnik. Linia 44. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 45. repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 46. zamknij nawias klamrowy. Linia 48. prawy ukośnik prawy ukośnik funkcja czekająca na upływ określonego czasu. Linia 49. public static void czekaj otwórz nawias okrągły double czas zamknij nawias okrągły otwórz nawias klamrowy. Linia 50. try otwórz nawias klamrowy. Linia 51. sleep otwórz nawias okrągły otwórz nawias okrągły long zamknij nawias okrągły otwórz nawias okrągły czas asterysk 1000 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 52. zamknij nawias klamrowy catch otwórz nawias okrągły InterruptedException e zamknij nawias okrągły otwórz nawias klamrowy. Linia 53. e kropka printStackTrace otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 54. zamknij nawias klamrowy. Linia 55. zamknij nawias klamrowy. Linia 57. 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 58. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 59. Canvas kanwa znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 60. kanwa kropka setPreferredSize otwórz nawias okrągły new Dimension otwórz nawias okrągły 600 przecinek 600 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 61. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 62. ramka kropka setLayout otwórz nawias okrągły new BorderLayout otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 63. ramka kropka add otwórz nawias okrągły kanwa przecinek BorderLayout kropka CENTER zamknij nawias okrągły średnik. Linia 64. ramka kropka pack otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 65. ramka kropka setTitle otwórz nawias okrągły cudzysłów Symulacja ruchów Browna cudzysłów zamknij nawias okrągły średnik. Linia 66. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 67. ramka kropka setResizable otwórz nawias okrągły false zamknij nawias okrągły średnik. Linia 68. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 70. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 72. prawy ukośnik prawy ukośnik w tym miejscu dodamy interesujący nas kod. Linia 74. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 75. zamknij nawias klamrowy. Linia 76. zamknij nawias klamrowy.

Szablon zapisujemy jako plik o nazwie CanvascanvasCanvas z rozszerzeniem .java. Dodatkowo zwróć uwagę, aby w projekcie nie znajdowały się żadne inne pliki, w których występuje funkcja public static void main(String[] args).

Za pomocą przedstawionego polecenia możemy wywołać w szablonie rysowanie cząsteczki w oknie, a także przebytą przez nią drogę:

Linia 1. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik.

W szablonie dodatkowo dostępna jest metoda czekaj(double czas), która powoduje zatrzymanie działania programu na określony czas podany w sekundach.

Przypomnijmy kod, zgodnie z którym w e‑materiale Modelowanie ruchów Browna w języku JavaPuEZy5A5QModelowanie ruchów Browna w języku Java symulowaliśmy poruszanie się cząsteczek:

Linia 1. public class Main otwórz nawias klamrowy. Linia 2. 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 3. prawy ukośnik prawy ukośnik liczba kolizji. Linia 4. double n znak równości 100 średnik. Linia 5. prawy ukośnik prawy ukośnik początkowe położenie cząsteczki. Linia 6. double x znak równości 0 kropka 0 średnik. Linia 7. double y znak równości 0 kropka 0 średnik. Linia 8. prawy ukośnik prawy ukośnik długość wektora przesunięcia. Linia 9. double r znak równości 0 kropka 1 średnik. Linia 11. prawy ukośnik prawy ukośnik wypisz początkową pozycję. Linia 12. System kropka out kropka println otwórz nawias okrągły x plus apostrof apostrof plus y zamknij nawias okrągły średnik. Linia 14. prawy ukośnik prawy ukośnik wykonuj kolejne kolizje. Linia 15. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. prawy ukośnik prawy ukośnik losowy kąt z przedziału otwórz nawias ostrokątny 0 przecinek 2pi zamknij nawias okrągły. Linia 17. double kat znak równości Math kropka random otwórz nawias okrągły zamknij nawias okrągły asterysk 2 asterysk Math kropka PI średnik. Linia 18. prawy ukośnik prawy ukośnik składowe wektora przesunięcia. Linia 19. double dx znak równości r asterysk Math kropka cos otwórz nawias okrągły kat zamknij nawias okrągły średnik. Linia 20. double dy znak równości r asterysk Math kropka sin otwórz nawias okrągły kat zamknij nawias okrągły średnik. Linia 22. prawy ukośnik prawy ukośnik przemieść cząsteczkę. Linia 23. x plus znak równości dx średnik. Linia 24. y plus znak równości dy średnik. Linia 26. prawy ukośnik prawy ukośnik wypisz aktualną pozycję. Linia 27. System kropka out kropka println otwórz nawias okrągły x plus apostrof apostrof plus y zamknij nawias okrągły średnik. Linia 28. zamknij nawias klamrowy. Linia 29. zamknij nawias klamrowy. Linia 30. zamknij nawias klamrowy.

Aby wstawić ten kod do szablonu, wystarczy zamienić linijki, w których wypisujemy pozycję (12. oraz 27.) na szablonową funkcję rysującą cząsteczkę. Dodatkowo przed narysowaniem kolejnych pozycji cząsteczki, możemy poczekać wybraną jednostkę czasu, aby zwizualizować przemieszczanie się cząsteczki w czasie.

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka ArrayList średnik. Linia 4. import java kropka util kropka Random średnik. Linia 5. import static java kropka lang kropka Thread kropka sleep średnik. Linia 7. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik punkt przechowujący pozycję cząsteczki. Linia 9. private static ArrayList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new ArrayList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 11. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 12. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał cząsteczkę oraz jej trasę. Linia 13. at Override. Linia 14. public void paint otwórz nawias okrągły Graphics grafika zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. prawy ukośnik prawy ukośnik promień cząsteczki. Linia 16. int promien znak równości 5 średnik. Linia 18. Graphics2D grafika2D znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły grafika średnik. Linia 19. super kropka paint otwórz nawias okrągły grafika zamknij nawias okrągły średnik. Linia 21. prawy ukośnik prawy ukośnik rysuj trasę. Linia 22. int i znak równości 1 średnik. Linia 23. for otwórz nawias okrągły średnik i otwórz nawias ostrokątny punkty kropka size otwórz nawias okrągły zamknij nawias okrągły średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 24. grafika2D kropka drawLine otwórz nawias okrągły punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka x przecinek. Linia 25. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka y przecinek. Linia 26. punkty kropka get otwórz nawias okrągły i minus 1 zamknij nawias okrągły kropka x przecinek. Linia 27. punkty kropka get otwórz nawias okrągły i minus 1 zamknij nawias okrągły kropka y zamknij nawias okrągły średnik. Linia 28. zamknij nawias klamrowy. Linia 29. minus minus i średnik. Linia 31. prawy ukośnik prawy ukośnik rysuj cząsteczkę na ostatniej pozycji. Linia 32. if otwórz nawias okrągły wykrzyknik punkty kropka isEmpty otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 33. grafika2D kropka fillOval otwórz nawias okrągły punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka x minus promien przecinek. Linia 34. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka y minus promien przecinek. Linia 35. 2 asterysk promien przecinek 2 asterysk promien zamknij nawias okrągły średnik. Linia 36. zamknij nawias klamrowy. Linia 37. zamknij nawias klamrowy. Linia 39. prawy ukośnik prawy ukośnik funkcja rysująca cząsteczkę na wybranej pozycji. Linia 40. public void rysujCzasteczke otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 41. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 100 kropka 0 zamknij nawias okrągły plus getSize otwórz nawias okrągły zamknij nawias okrągły kropka width prawy ukośnik 2 średnik. Linia 42. int y0 znak równości getSize otwórz nawias okrągły zamknij nawias okrągły kropka height prawy ukośnik 2 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 100 kropka 0 zamknij nawias okrągły średnik. Linia 43. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 44. repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 45. zamknij nawias klamrowy. Linia 47. prawy ukośnik prawy ukośnik funkcja czekająca na upływ określonego czasu. Linia 48. public static void czekaj otwórz nawias okrągły double czas zamknij nawias okrągły otwórz nawias klamrowy. Linia 49. try otwórz nawias klamrowy. Linia 50. sleep otwórz nawias okrągły otwórz nawias okrągły long zamknij nawias okrągły otwórz nawias okrągły czas asterysk 1000 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 51. zamknij nawias klamrowy catch otwórz nawias okrągły InterruptedException e zamknij nawias okrągły otwórz nawias klamrowy. Linia 52. e kropka printStackTrace otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 53. zamknij nawias klamrowy. Linia 54. zamknij nawias klamrowy. Linia 56. 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 57. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 58. Canvas kanwa znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 59. kanwa kropka setPreferredSize otwórz nawias okrągły new Dimension otwórz nawias okrągły 600 przecinek 600 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 60. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 61. ramka kropka setLayout otwórz nawias okrągły new BorderLayout otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 62. ramka kropka add otwórz nawias okrągły kanwa przecinek BorderLayout kropka CENTER zamknij nawias okrągły średnik. Linia 63. ramka kropka pack otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 64. ramka kropka setTitle otwórz nawias okrągły cudzysłów Symulacja ruchów Browna cudzysłów zamknij nawias okrągły średnik. Linia 65. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 66. ramka kropka setResizable otwórz nawias okrągły false zamknij nawias okrągły średnik. Linia 67. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 69. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 71. prawy ukośnik prawy ukośnik liczba kolizji. Linia 72. double n znak równości 100 średnik. Linia 73. prawy ukośnik prawy ukośnik początkowe położenie cząsteczki. Linia 74. double x znak równości 0 kropka 0 średnik. Linia 75. double y znak równości 0 kropka 0 średnik. Linia 76. prawy ukośnik prawy ukośnik długość wektora przesunięcia. Linia 77. double r znak równości 0 kropka 1 średnik. Linia 79. prawy ukośnik prawy ukośnik wypisz początkową pozycję. Linia 80. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 82. prawy ukośnik prawy ukośnik wykonuj kolejne kolizje. Linia 83. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 84. prawy ukośnik prawy ukośnik losowy kąt z przedziału otwórz nawias ostrokątny 0 przecinek 2pi zamknij nawias okrągły. Linia 85. double kat znak równości Math kropka random otwórz nawias okrągły zamknij nawias okrągły asterysk 2 asterysk Math kropka PI średnik. Linia 86. prawy ukośnik prawy ukośnik składowe wektora przesunięcia. Linia 87. double dx znak równości r asterysk Math kropka cos otwórz nawias okrągły kat zamknij nawias okrągły średnik. Linia 88. double dy znak równości r asterysk Math kropka sin otwórz nawias okrągły kat zamknij nawias okrągły średnik. Linia 90. prawy ukośnik prawy ukośnik przemieść cząsteczkę. Linia 91. x plus znak równości dx średnik. Linia 92. y plus znak równości dy średnik. Linia 94. prawy ukośnik prawy ukośnik czekaj 0 kropka 05 sekundy. Linia 95. wait otwórz nawias okrągły 0 kropka 05 zamknij nawias okrągły średnik. Linia 97. prawy ukośnik prawy ukośnik wypisz aktualną pozycję. Linia 98. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 99. zamknij nawias klamrowy. Linia 101. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 102. zamknij nawias klamrowy. Linia 103. zamknij nawias klamrowy.

Po uruchomieniu przedstawionego programu uzyskamy przemieszczającą się cząsteczkę oraz rysowaną na bieżąco przebytą trasę. Prześledźmy przykładowe etapy końcowe symulacji.

Symulacja trasy cząsteczki dla n = 100:

Rc6PVoC3botcn
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Symulacja trasy cząsteczki dla n = 1000:

RJqVmQks5izsc
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Polecenie 1

Zmień zaprezentowany kod w taki sposób, aby przemieszczenie cząsteczki mogło nastąpić wyłącznie pod kątem, który będzie losową wielokrotnością 45 stopni.

Symulacja ruchów Browna metodą Monte Carlo z wykorzystaniem procesu Wienera

Przypomnijmy uproszczoną definicję procesu Wienera:

W ( 0 ) = 0
W ( t + d t ) = W ( t ) + k N ( 0 ,   d t )

gdzie N ( μ , σ 2 ) jest zmienną losową zgodną z rozkładem normalnym Gaussa z parametrami wartość oczekiwana  μ oraz odchyleniem standardowym  σ , przy czym k jest współczynnikiem długości wykonywanych kroków.

Jak możemy wywnioskować z tej definicji, jest to proces uzależniony nie od liczby iteracji, a od czasu. Odległość cząsteczki od położenia początkowego po wykonaniu 100 kroków z parametrem d t = 0.1 jest uzależniona od prawdopodobieństwa w taki sam sposób, co odległość po wykonaniu 1 kroku z parametrem d t = 10. Innymi słowy, wynik końcowy 100 kroków z parametrem d t = 0.1 jest statystycznie równy wynikowi końcowemu 1 kroku z parametrem d t = 10.

Aby zamienić symulację z poprzedniej części e‑materiału na wykorzystującą proces Wienera, musimy zastanowić się nad warunkami początkowymi symulacji. Na początku umieszczamy cząsteczkę w punkcie ( 0, 0 ) . Ponieważ w poprzedniej symulacji przed narysowaniem kolejnej iteracji czekaliśmy 0,05 sekundy, niech przyrost czasu wynosi dt = 0.05. Dla tak dobranego parametru dt dobierzmy parametr k = 0.2, aby skala przemieszczenia w każdym ruchu przypominała tę z poprzedniej symulacji.

Zastanówmy się, w jaki sposób możemy uzyskać losową liczbę zgodną z rozkładem normalnym. W języku Java w klasie Random dostępna jest metoda nextGaussian(). Funkcja ta zwraca losową liczbę zgodną z rozkładem normalnym dla wartości oczekiwanej 0 oraz z odchyleniem standardowym 1. Liczbę otrzymaną w wyniku wywołania tej funkcji możemy zatem traktować jako N0,1. W jaki sposób możemy uzyskać N ( 0 ,   d t ) ? Skorzystamy z własności wynikającej ze wzoru funkcji rozkładu normalnego, mianowicie:

N ( μ , σ 2 ) = 1 σ N ( 0 ,   1 )   +   μ

Wyznaczenie N ( 0 ,   d t ) może się odbyć za pomocą kodu:

Linia 1. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych średnik. Linia 2. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 3. prawy ukośnik prawy ukośnik N otwórz nawias okrągły 0 przecinek dt zamknij nawias okrągły. Linia 4. double N podkreślnik 0 podkreślnik dt znak równości 1 prawy ukośnik Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik.

Wykorzystując tę metodę, możemy wyznaczyć kolejne położenia cząsteczek zgodnie z:

Linia 1. prawy ukośnik prawy ukośnik kolejna pozycja. Linia 2. x plus znak równości k asterysk Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 3. y plus znak równości k asterysk Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik.

Ten krok powtórzymy zatem określoną liczbę razy:

Linia 1. prawy ukośnik prawy ukośnik liczba kroków. Linia 2. double n znak równości 100 średnik. Linia 3. prawy ukośnik prawy ukośnik parametry symulacji. Linia 4. double k znak równości 0 kropka 2 średnik. Linia 5. double dt znak równości 0 kropka 05 średnik. Linia 6. prawy ukośnik prawy ukośnik początkowe położenie cząsteczki. Linia 7. double x znak równości 0 kropka 0 średnik. Linia 8. double y znak równości 0 kropka 0 średnik. Linia 10. prawy ukośnik prawy ukośnik rysuj początkową pozycję. Linia 11. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 13. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych średnik. Linia 14. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 16. prawy ukośnik prawy ukośnik wykonuj kolejne kolizje. Linia 17. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. prawy ukośnik prawy ukośnik kolejna pozycja. Linia 19. x plus znak równości k asterysk Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 20. y plus znak równości k asterysk Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 22. czekaj otwórz nawias okrągły dt zamknij nawias okrągły średnik. Linia 24. prawy ukośnik prawy ukośnik rysuj aktualną pozycję. Linia 25. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 26. zamknij nawias klamrowy.

Tak utworzoną symulację umieśćmy w szablonie:

Linia 1. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 2. prawy ukośnik prawy ukośnik punkt przechowujący pozycję cząsteczki. Linia 3. private static ArrayList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new ArrayList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 5. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 6. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał cząsteczkę oraz jej trasę. Linia 7. at Override. Linia 8. public void paint otwórz nawias okrągły Graphics grafika zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. prawy ukośnik prawy ukośnik promień cząsteczki. Linia 10. int promien znak równości 5 średnik. Linia 12. Graphics2D grafika2D znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły grafika średnik. Linia 13. super kropka paint otwórz nawias okrągły grafika zamknij nawias okrągły średnik. Linia 15. prawy ukośnik prawy ukośnik rysuj trasę. Linia 16. int i znak równości 1 średnik. Linia 17. for otwórz nawias okrągły średnik i otwórz nawias ostrokątny punkty kropka size otwórz nawias okrągły zamknij nawias okrągły średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. grafika2D kropka drawLine otwórz nawias okrągły. Linia 19. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka x przecinek. Linia 20. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka y przecinek. Linia 21. punkty kropka get otwórz nawias okrągły i minus 1 zamknij nawias okrągły kropka x przecinek. Linia 22. punkty kropka get otwórz nawias okrągły i minus 1 zamknij nawias okrągły kropka y zamknij nawias okrągły średnik. Linia 23. zamknij nawias klamrowy. Linia 24. minus minus i średnik. Linia 26. prawy ukośnik prawy ukośnik rysuj cząsteczkę na ostatniej pozycji. Linia 27. if otwórz nawias okrągły wykrzyknik punkty kropka isEmpty otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. grafika2D kropka fillOval otwórz nawias okrągły. Linia 29. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka x minus promien przecinek. Linia 30. punkty kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka y minus promien przecinek. Linia 31. 2 asterysk promien przecinek 2 asterysk promien zamknij nawias okrągły średnik. Linia 32. zamknij nawias klamrowy. Linia 33. zamknij nawias klamrowy. Linia 35. prawy ukośnik prawy ukośnik funkcja rysująca cząsteczkę na wybranej pozycji. Linia 36. public void rysujCzasteczke otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 37. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 100 kropka 0 zamknij nawias okrągły plus getSize otwórz nawias okrągły zamknij nawias okrągły kropka width prawy ukośnik 2 średnik. Linia 38. int y0 znak równości getSize otwórz nawias okrągły zamknij nawias okrągły kropka height prawy ukośnik 2 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 100 kropka 0 zamknij nawias okrągły średnik. Linia 39. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 40. repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 41. zamknij nawias klamrowy. Linia 43. prawy ukośnik prawy ukośnik funkcja czekająca na upływ określonego czasu. Linia 44. public static void czekaj otwórz nawias okrągły double czas zamknij nawias okrągły otwórz nawias klamrowy. Linia 45. try otwórz nawias klamrowy. Linia 46. sleep otwórz nawias okrągły otwórz nawias okrągły long zamknij nawias okrągły otwórz nawias okrągły czas asterysk 1000 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 47. zamknij nawias klamrowy catch otwórz nawias okrągły InterruptedException e zamknij nawias okrągły otwórz nawias klamrowy. Linia 48. e kropka printStackTrace otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 49. zamknij nawias klamrowy. Linia 50. zamknij nawias klamrowy. Linia 52. 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 53. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 54. Canvas kanwa znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 55. kanwa kropka setPreferredSize otwórz nawias okrągły new Dimension otwórz nawias okrągły 600 przecinek 600 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 56. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 57. ramka kropka setLayout otwórz nawias okrągły new BorderLayout otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 58. ramka kropka add otwórz nawias okrągły kanwa przecinek BorderLayout kropka CENTER zamknij nawias okrągły średnik. Linia 59. ramka kropka pack otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 60. ramka kropka setTitle otwórz nawias okrągły cudzysłów Symulacja ruchów Browna cudzysłów zamknij nawias okrągły średnik. Linia 61. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 62. ramka kropka setResizable otwórz nawias okrągły false zamknij nawias okrągły średnik. Linia 63. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 65. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 67. prawy ukośnik prawy ukośnik liczba kroków. Linia 68. double n znak równości 100 średnik. Linia 69. prawy ukośnik prawy ukośnik początkowe położenie cząsteczki. Linia 70. double x znak równości 0 kropka 0 średnik. Linia 71. double y znak równości 0 kropka 0 średnik. Linia 72. prawy ukośnik prawy ukośnik parametry symulacji. Linia 73. double k znak równości 0 kropka 2 średnik. Linia 74. double dt znak równości 0 kropka 05 średnik. Linia 76. prawy ukośnik prawy ukośnik rysuj początkową pozycję. Linia 77. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 79. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych średnik. Linia 80. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 82. prawy ukośnik prawy ukośnik wykonuj kolejne kolizje. Linia 83. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 84. prawy ukośnik prawy ukośnik kolejna pozycja. Linia 85. x plus znak równości k asterysk Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 86. y plus znak równości k asterysk Math kropka sqrt otwórz nawias okrągły dt zamknij nawias okrągły asterysk generator kropka nextGaussian otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 88. czekaj otwórz nawias okrągły dt zamknij nawias okrągły średnik. Linia 90. prawy ukośnik prawy ukośnik rysuj aktualną pozycję. Linia 91. kanwa kropka rysujCzasteczke otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 92. zamknij nawias klamrowy. Linia 94. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 95. zamknij nawias klamrowy. Linia 96. zamknij nawias klamrowy.

Prześledźmy przykładowe końcowe wyniki symulacji, po uruchomieniu przedstawionego kodu z wybranymi parametrami.

Końcowy wynik symulacji ruchu cząsteczki dla parametrów n = 100, dt = 0.05, k = 0.2:

R26XKn0w6tP2Z
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Wizualizacja ruchu cząsteczki dla parametrów n = 10, dt = 0.5, k = 0.2:

Rzr1VY77Nkaym
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Rezultat symulacji przeprowadzonej dla danych n = 1000, dt = 0.005, k = 0.2:

RKYDZMR9jrO8F
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Zwróć uwagę, że wszystkie przedstawione wyniki nie różnią się czasem symulacji, a jedynie jej dokładnością.

Słownik

canvas
canvas

(z ang. płótno) określenie oznaczające element programu na ekranie, służący do wyświetlania rysowanych w programie kształtów

rozkład normalny Gaussa
rozkład normalny Gaussa

ciągły rozkład prawdopodobieństwa, zdefiniowany następującą funkcją gęstości prawdopodobieństwa:

f μ , σ ( x ) = 1 σ 2 π exp ( ( x μ ) 2 2 σ 2 )

gdzie μ to wartość oczekiwana zmiennej losowej x, a σ to odchylenie standardowe zmiennej losowej x

Swing
Swing

dostarczana wraz z językiem Java biblioteka graficzna, która stanowi nowszą, rozszerzoną wersję biblioteki AWT