Uniwersytet Mikołaja Kopernika Wydział Fizyki, Astronomii i Informatyki Stosowanej. Adam Sosnowski



Podobne dokumenty
DYNAMIKA KONSTRUKCJI

ψ przedstawia zależność

LABORATORIUM PODSTAWY ELEKTRONIKI Badanie Bramki X-OR

( ) ( ) ( τ) ( t) = 0

WYKORZYSTANIE STATISTICA DATA MINER DO PROGNOZOWANIA W KRAJOWYM DEPOZYCIE PAPIERÓW WARTOŚCIOWYCH

POMIAR PARAMETRÓW SYGNAŁOW NAPIĘCIOWYCH METODĄ PRÓKOWANIA I CYFROWEGO PRZETWARZANIA SYGNAŁU

Wykład FIZYKA I. 2. Kinematyka punktu materialnego. Dr hab. inż. Władysław Artur Woźniak

Przemieszczeniem ciała nazywamy zmianę jego położenia

Kombinowanie prognoz. - dlaczego należy kombinować prognozy? - obejmowanie prognoz. - podstawowe metody kombinowania prognoz

PROGNOZOWANIE I SYMULACJE. mgr Żaneta Pruska. Ćwiczenia 2 Zadanie 1

Rozdział 4 Instrukcje sekwencyjne

2.1 Zagadnienie Cauchy ego dla równania jednorodnego. = f(x, t) dla x R, t > 0, (2.1)

Całka nieoznaczona Andrzej Musielak Str 1. Całka nieoznaczona

Kinematyka W Y K Ł A D I. Ruch jednowymiarowy. 2-1 Przemieszczenie, prędkość. x = x 2 - x x t

C d u. Po podstawieniu prądu z pierwszego równania do równania drugiego i uporządkowaniu składników lewej strony uzyskuje się:

Praca domowa nr 1. Metodologia Fizyki. Grupa 1. Szacowanie wartości wielkości fizycznych Zad Stoisz na brzegu oceanu, pogoda jest idealna,

PROJEKT nr 1 Projekt spawanego węzła kratownicy. Sporządził: Andrzej Wölk

Politechnika Częstochowska Wydział Inżynierii Mechanicznej i Informatyki. Sprawozdanie #2 z przedmiotu: Prognozowanie w systemach multimedialnych

E k o n o m e t r i a S t r o n a 1. Nieliniowy model ekonometryczny

Ocena płynności wybranymi metodami szacowania osadu 1

WNIOSKOWANIE STATYSTYCZNE

Pobieranie próby. Rozkład χ 2

I. KINEMATYKA I DYNAMIKA

ANALIZA, PROGNOZOWANIE I SYMULACJA / Ćwiczenia 1

Silniki cieplne i rekurencje

ZASTOSOWANIE METODY OBLICZEŃ UPROSZCZONYCH DO WYZNACZANIA CZASU JAZDY POCIĄGU NA SZLAKU

Ruch płaski. Bryła w ruchu płaskim. (płaszczyzna kierująca) Punkty bryły o jednakowych prędkościach i przyspieszeniach. Prof.

ĆWICZENIE 7 WYZNACZANIE LOGARYTMICZNEGO DEKREMENTU TŁUMIENIA ORAZ WSPÓŁCZYNNIKA OPORU OŚRODKA. Wprowadzenie

VII. ZAGADNIENIA DYNAMIKI

Badanie funktorów logicznych TTL - ćwiczenie 1

4.2. Obliczanie przewodów grzejnych metodą dopuszczalnego obciążenia powierzchniowego

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania. Podstawy Automatyki

RÓWNANIA RÓŻNICZKOWE WYKŁAD 13

Analiza rynku projekt

DYNAMICZNE MODELE EKONOMETRYCZNE

ĆWICZENIE 4 Badanie stanów nieustalonych w obwodach RL, RC i RLC przy wymuszeniu stałym

( 3 ) Kondensator o pojemności C naładowany do różnicy potencjałów U posiada ładunek: q = C U. ( 4 ) Eliminując U z równania (3) i (4) otrzymamy: =

PRZEDMIOTOWY SYSTEM OCENIANIA Z FIZYKI WYMAGANIA EDUKACYJNE DLA UCZNIÓW KLAS I

ĆWICZENIE NR 43 U R I (1)

Eksploracja danych. KLASYFIKACJA I REGRESJA cz. 1. Wojciech Waloszek. Teresa Zawadzka.

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

Sformułowanie Schrödingera mechaniki kwantowej. Fizyka II, lato

Zarządzanie Projektami. Wykład 3 Techniki sieciowe (część 1)

PROGNOZOWANIE. Ćwiczenia 2. mgr Dawid Doliński

PROGNOZOWANIE I SYMULACJE EXCEL 2 PROGNOZOWANIE I SYMULACJE EXCEL AUTOR: ŻANETA PRUSKA

Podział metod przeszukiwania

PROGNOZOWANIE I SYMULACJE EXCEL 2 AUTOR: MARTYNA MALAK PROGNOZOWANIE I SYMULACJE EXCEL 2 AUTOR: MARTYNA MALAK

Układy sekwencyjne asynchroniczne Zadania projektowe

specyfikacji i estymacji modelu regresji progowej (ang. threshold regression).

PROPOZYCJA NOWEJ METODY OKREŚLANIA ZUŻYCIA TECHNICZNEGO BUDYNKÓW

Analiza danych DRZEWA DECYZYJNE. Drzewa decyzyjne. Entropia. test 1 dopełnienie testu 1

imei 1. Cel ćwiczenia 2. Zagadnienia do przygotowania 3. Program ćwiczenia

Zasada pędu i popędu, krętu i pokrętu, energii i pracy oraz d Alemberta bryły w ruchu postępowym, obrotowym i płaskim

POMIARY CZĘSTOTLIWOŚCI I PRZESUNIĘCIA FAZOWEGO SYGNAŁÓW OKRESOWYCH. Cel ćwiczenia. Program ćwiczenia

licencjat Pytania teoretyczne:

Równania różniczkowe. Lista nr 2. Literatura: N.M. Matwiejew, Metody całkowania równań różniczkowych zwyczajnych.

ZAJĘCIA 25. Wartość bezwzględna. Interpretacja geometryczna wartości bezwzględnej.

ESTYMACJA KRZYWEJ DOCHODOWOŚCI STÓP PROCENTOWYCH DLA POLSKI

Informatyka I Lab 06, r.a. 2011/2012 prow. Sławomir Czarnecki. Zadania na laboratorium nr. 6

Rys.1. Podstawowa klasyfikacja sygnałów

PODSTAWY PROGRAMOWANIA STEROWNIKÓW PLC

(Plan wynikowy) - zakładane osiągnięcia ucznia Fizyka klasa II

Dynamiczne formy pełzania i relaksacji (odprężenia) górotworu

WyŜsza Szkoła Zarządzania Ochroną Pracy MS EXCEL CZ.2

Dendrochronologia Tworzenie chronologii

POLITECHNIKA ŚLĄSKA W GLIWICACH WYDZIAŁ INŻYNIERII ŚRODOWISKA i ENERGETYKI INSTYTUT MASZYN i URZĄDZEŃ ENERGETYCZNYCH

Harmonogram czyszczenia z osadów sieci wymienników ciepła w trakcie eksploatacji instalacji na przykładzie destylacji rurowo-wieżowej

Analiza i Zarządzanie Portfelem cz. 6 R = Ocena wyników zarządzania portfelem. Pomiar wyników zarządzania portfelem. Dr Katarzyna Kuziak

Wykład 5 Elementy teorii układów liniowych stacjonarnych odpowiedź na dowolne wymuszenie

1.1. Bezpośrednie transformowanie napięć przemiennych

WYBRANE DZIAŁY ANALIZY MATEMATYCZNEJ. Wykład VII Przekształcenie Fouriera.

Modelowanie i obliczenia techniczne. Równania różniczkowe Numeryczne rozwiązywanie równań różniczkowych zwyczajnych

Architektura Systemów Komputerowych. Architektura potokowa Klasyfikacja architektur równoległych

Część I. MECHANIKA. Wykład KINEMATYKA PUNKTU MATERIALNEGO. Ruch jednowymiarowy Ruch na płaszczyźnie i w przestrzeni.

Wojewódzki Konkurs Matematyczny dla uczniów gimnazjów. Etap szkolny 5 listopada 2013 Czas 90 minut

1.2.1 Ogólny algorytm podejmowania decyzji Algorytm postępowania diagnostycznego Analiza decyzyjna... 27

y 1 y 2 = f 2 (t, y 1, y 2,..., y n )... y n = f n (t, y 1, y 2,..., y n ) f 1 (t, y 1, y 2,..., y n ) y = f(t, y),, f(t, y) =

Badania trakcyjne samochodu.

Wyzwania praktyczne w modelowaniu wielowymiarowych procesów GARCH

Stanisław Cichocki Natalia Nehrebecka. Wykład 3

WYKORZYSTANIE RACHUNKU WARIACYJNEGO DO ANALIZY WAHAŃ PRODUKCJI W PRZEDSIĘBIORSTWACH

Przemysław Klęsk. Słowa kluczowe: analiza składowych głównych, rozmaitości algebraiczne

ANALIZA ODPOWIEDZI UKŁADÓW KONSTRUKCYJNYCH NA WYMUSZENIE W POSTACI SIŁY O DOWOLNYM PRZEBIEGU CZASOWYM

Laboratorium II: Modelowanie procesów fizycznych Skrypt do ćwiczeń

E5. KONDENSATOR W OBWODZIE PRĄDU STAŁEGO

II.2 Położenie i prędkość cd. Wektory styczny i normalny do toru. II.3 Przyspieszenie

WYMAGANIA EDUKACYJNE

Podstawowe człony dynamiczne

Drgania. W Y K Ł A D X Ruch harmoniczny prosty. k m

CHEMIA KWANTOWA Jacek Korchowiec Wydział Chemii UJ Zakład Chemii Teoretycznej Zespół Chemii Kwantowej Grupa Teorii Reaktywności Chemicznej

Niestacjonarne zmienne czasowe własności i testowanie

Jednofazowe przekształtniki DC AC i AC DC z eliminacją składowej podwójnej częstotliwości po stronie DC

Gr.A, Zad.1. Gr.A, Zad.2 U CC R C1 R C2. U wy T 1 T 2. U we T 3 T 4 U EE

Definicja pochodnej cząstkowej

Krzysztof Piontek Weryfikacja modeli Blacka-Scholesa dla opcji na WIG20

POLITECHNIKA BIAŁOSTOCKA

Fizyka, wykład 2. Janusz Andrzejewski

IMPLEMENTACJA WYBRANYCH METOD ANALIZY STANÓW NIEUSTALONYCH W ŚRODOWISKU MATHCAD

Metody rachunku kosztów Metoda rachunku kosztu działań Podstawowe pojęcia metody ABC Kalkulacja obiektów kosztowych metodą ABC Zasobowy rachunek

Matematyka A, kolokwium, 15 maja 2013 rozwia. ciem rozwia

Transkrypt:

Uniwersye Mikołaja Kopernika Wydział Fizyki, Asronomii i Informayki Sosowanej Adam Sosnowski Implemenacja i porównanie meod numerycznych sosowanych do realisycznych symulacji dynamiki zbioru punków maerialnych. Wizualizacja z uŝyciem grafiki 3D Praca inŝynierska wykonana w Zakładzie Mechaniki Kwanowej Opiekun: dr Jacek Maulewski Toruń 2008

Dziękuję panu dr Jackowi Maulewskiemu za poświęcanie mi czasu oraz udzielenie wielu cennych wskazówek i pomoc, bez kórej a praca nie powsałaby. 2

UMK zasrzega sobie prawo własności niniejszej pracy inŝynierskiej w celu udosępnienia dla porzeb działalności naukowo-badawczej lub dydakycznej 3

Spis reści Srona 1. Wsęp 5 2. Algorymy 6 2.1. Równanie ruchu przedsawienie problemu. 6 2.2. Meoda Eulera 6 2.3. Meoda punku środkowego - MidPoin 7 2.4. Meoda Runge-Kuy czwarego rzędu.. 9 2.5. Reguła Soermera... 11 2.6. Algorym Verlea... 13 3. Implemenacja. 15 3.1. Wekor 15 3.1.1. Iloczyn skalarny.. 16 3.1.2. Iloczyn wekorowy.. 16 3.1.3. Długość wekora. 17 3.1.4. Normowanie 17 3.1.5. Operaory arymeyczne.. 17 3.2. Punk maerialny 19 3.2.1. Meody dosępu do informacji o cząsce. 19 3.2.2. Implemenacja meod numerycznych klasie PkMa 20 3.3. Zbiór punków maerialnych.. 22 3.3.1. Implemenacja meod numerycznych numerycznych klasie ZbPkMa.. 22 3.3.2. Klasy rozszerzające szablon ZbPkMa implemenacje przykładowych modeli. 27 3.3.2.1. Swobodne punky. 27 3.3.2.2. Łańcuch oscylaorów... 28 3.3.2.3. Siaka 30 3.3.2.4. Lina.. 33 3.3.2.5. Cząski oddziałujące ze sobą poencjałem Morse a. 36 4

4. Tesy. 40 4.1. Tesy zbieŝności. 41 4.2. Tesy czasu rwania obliczeń. 46 4.3. Podsumowanie... 50 5. Podsumowanie. 51 6. Lieraura. 52 5

1. Wsęp Zadaniem pierwszych kompuerów było symulowanie rajekorii pocisków. Obecnie symulacje kompuerowe dzięki dynamicznemu rozwojowi echnologii kompuerowych sały się waŝnym narzędziem wielu dziedzin nauki akich jak fizyka, biologia czy chemia. Coraz szerzej wykorzysywane są eŝ w szeroko rozumianej rozrywce. Arakcyjność filmów i gier kompuerowych zwiększa się np. przez realizm dodawany w formie odpowiedniego ruchu obieków w worzonych scenach, ich wzajemną inerakcją. Sprowadza się o do modelowania odpowiednich zjawisk fizycznych. Skueczne zasosowanie symulacji poprzedzone musi być sworzeniem odpowiedniego modelu badanego środowiska. W swojej pracy sworzyłem kilka prosych modeli układów fizycznych w celu symulacji ich zachowania dla róŝnych warunków począkowych. Badanie dynamiki owych modeli moŝliwe jes oczywiście dzięki zasosowaniu meod numerycznych. Symulacja dynamiki przeprowadzona moŝe być wieloma algorymami. Wybór opymalnego jes jednym ze sawianych ej pracy zadań. Moja praca w głównej mierze składa się z opisu i porównania ych meod pod względem dokładności i złoŝoności czasowej. Podsumowaniem całej pracy jes aplikacja prezenująca prakyczne zasosowanie powyŝszych zagadnień. Jej auem jes prezenacja wyników za pomocą grafiki 3D generowanej za pomocą biblioeki OpenGL [5, 6, 10, 12, 13, 14], worząc rójwymiarowe animacje układów symulowanych w czasie rzeczywisym. 6

2. Algorymy 2.1. Równanie ruchu przedsawienie problemu Równanie ruchu [1] dla pojedynczego punku maerialnego w jednym wymiarze o działającej na niego określonej sile wypadkowej przybiera prosą posać równania róŝniczkowego drugiego rzędu: 2 d = 2 d Fw m, (1) gdzie: F w siła wypadkowa, połoŝenie punku na osi X, m masa punku. Najprosszym sposobem rozwiązania równania Newona (1) opisującego przyspieszenie punku maerialnego jes przekszałcenie go do układu dwóch równań sprzęŝonych pierwszego rzędu. d = v (2) d dv d Fw = (3) m W przeprowadzanej symulacji rozwiązywanym zagadnieniem jes połoŝenie punku w zaleŝności od czasu. Znane są połoŝenie i prędkość w chwili począkowej, a akŝe działające na cząskę siły. Znając równania (2) i (3) moŝna uŝyć kórejś z opisanych niŝej meod numerycznych do rozwiązania zadanego problemu i znalezienia prędkości oraz połoŝenia punku maerialnego w kaŝdej chwili czasu. 2.2. Meoda Eulera W swej klasycznej posaci jes o jedna z najprosszych meod numerycznych [7, 15]. SłuŜy ona przede wszyskim do rozwiązywania równań róŝniczkowych pierwszego sopnia. Zakładając znajomość pochodnej () funkcji zmiennej rzeczywisej () i jej warość począkową w punkcie 0, moŝna obliczyć warość ej funkcji w punkcie 0 + i nasępnych. Algorym odpowiada rozwiązaniu za pomocą rozwinięcia w szereg Taylora (4, 5): 7

' ( 0 ) 1 "( 0 ) 2 ( 0 + ) = ( 0 ) + + +... (4) 1! 2! ( ) n n + = ( ) 0 ( 0 ), (5) 0 n=0 n! w kórym zachowano ylko pierwsze pochodne: Co jes równowaŝne: ' ( ) ( 1! 0 1 0 + ) = ( 0 ) + (6) ( 0 + ) = ( 0 ) + '( 0 ) (7) Błąd meody dąŝy do zera dla dąŝącego do zera. Obcięcie rozwiązania do wyrazu w poędze pierwszej oznacza, Ŝe meoda a ma dokładność jedynie pierwszego rzędu względem rozwinięcia w szereg Taylora. Błąd obcięcia wynosi zaem O( 2 ). To powoduje względnie szybką rozbieŝność algorymu. Zasosowanie meody Eulera do rozwiązania równania Newona (1) jes nasępujące: 1. W pierwszej kolejności obliczana jes prędkość na podsawie zadanego przyspieszenia: v 1 = v 0 + dv (8) F dv = w d m (9) 2. Nasępnie korzysając z obliczonej prędkości wyznaczane jes połoŝenie: 1 = 0 + d (10) d = v 1 d (11) 2.3 Meoda punku środkowego - MidPoin Meoda a jes szczególną posacią meody Rungego-Kuy [7, 9, 15]. NaleŜy ona do klasy schemaów dwusopniowych. Oznacza o, Ŝe warość funkcji f(, ) musi być obliczana dwa razy dla kaŝdego wyznaczenia warości funkcji w punkcie 0 +. Idea meody MidPoin moŝe być zapisana w rzech wyraŝeniach: k = f, ) (12) 1 ( 0 0 8

PowyŜsze równanie jes algorymicznym zapisem meody Eulera. Na podsawie warości począkowych i długości inerwału czasowego obliczana jes warość funkcji w punkcie 0 + zapisana jako k 1. k 1 1 = f ( 0 + k 1, 0 + ) (13) 2 2 2 W (13) ponownie wykonywane jes całkowanie w celu znalezienia warości f w punkcie odpowiadającym połowie k 1 wyznaczonej w kroku poprzednim, a nasępnie obliczana jes wielkość k 2. Końcowa warość funkcji w punkcie 0 + wyznaczona jes za pomocą rozwiązania z równania (13) i warości począkowej. ( + + k (14) 0 ) = ( 0 ) 2 Dokładność meody MidPoin jes drugiego rzędu. Uzyskuje się o dzięki podzieleniu przedziału całkowania na dwie części. Nazwa meody pochodzi sąd, Ŝe rozwiązanie wyliczane w (13) wykorzysuje punk środkowy rozwiązania (12). Meodę MidPoin moŝna wykorzysać do rozwiązania równania Newona w sposób opisany w poniŝszych punkach: 1. Na podsawie znajomości połoŝenia, prędkości i przyspieszenia w chwili 0 obliczane są współczynniki k 1 : Fw k1 v = (15) m k1 v 0 = (16) 2. Warość siły wypadkowej akualizowana jes dla połowy rozwiązania orzymanego w punkcie pierwszym, a nasępnie wyliczane są współczynniki k 2 : Fw k2 v = (17) m 1 = (18) 2 k2 k1 v 3. Osaecznie warości prędkości i połoŝenia w punkcie 0 + dane są wzorami: v1 v0 + k 2v = (19) 9

1 0 + k2 = (20) 2.4. Meoda Runge-Kuy czwarego rzędu Meoda Runge-Kuy czwarego rzędu (RK4) [7, 9, 15] jes rozszerzeniem meody punku środkowego o kolejne dwa kroki. Aby obliczyć warość funkcji w punkcie 0 + naleŝy obliczyć warość funkcji f(, ) czerokronie. Kompleny algorym RK4 jes podobny do meody MidPoin, kóra w isocie jes meodą Runge-Kuy drugiego rzędu, przy czym zwiększona zosaje ilość dodakowych obliczeń. Schema jes nasępujący: k k 1 ( 0 0 = f, ) (21) 1 1 = f ( 0 + k1, 0 + ) (22) 2 2 2 Pierwsze dwa kroki są idenyczne jak w meodzie punku środkowego. k 1 1 = f ( 0 + k2, 0 + ) (23) 2 2 3 W kolejnym kroku analogicznie do poprzedniego wyznaczana jes warość funkcji f, z ą róŝnicą, Ŝe przedział całkowania określa połowa warości obliczonej w kroku poprzednim k 2. k 4 ( 0 3 0 = f + k, + ) (24) Osani krok meody o znalezienie osaniego współczynnika k 4 całkowaniem meodą prosokąów. Warość funkcji w punkcie 0 + obliczana jes na podsawie znajomości warości począkowej ( 0 ) oraz wyznaczonych w czerech krokach współczynników k 1, k 2, k 3 i k 4 : 1 ( 0 + ) = ( 0 ) + ( k1 + 2 k2 + 2 k3 + k4 ) (25) 6 Meoda RK4 przewyŝsza meodę MidPoin dwukronie pod względem dokładności. Oznacza o, Ŝe dla dwukronie większego inerwału czasowego moŝe uzyskać wyniki równie wiarygodne. Równanie Newona rozwiązuje się meodą RK4 zgodnie z nasępującym algorymem: 1. Na podsawie znajomości połoŝenia, prędkości i przyspieszenia w chwili 0 obliczane są współczynniki k 1 : Fw k1 v = (26) m 10

k1 v 0 = (27) 2. Warość siły wypadkowej akualizowana jes dla połowy rozwiązania orzymanego w punkcie pierwszym, a nasępnie wyliczane są współczynniki k 2 : Fw k2 v = (28) m 1 = (29) 2 k2 k1 v 3. Siła wypadkowa jes ponownie akualizowana w punkcie wyznaczonym przez połowę rozwiązania z punku drugiego: Fw k3 v = (30) m 1 = (31) 2 k3 k2v 4. Osanie współczynniki porzebne do wyznaczenia prędkości i połoŝenia w chwili nasępnej obliczane są po osaniej akualizacji siły wypadkowej w punkcie wyznaczonym przez rozwiązanie z punku poprzedniego: Fw k4 v = (32) m k4 k3v = (33) 5. Prędkość i połoŝenie w chwili nasępnej obliczane są na podsawie prędkości i połoŝenia począkowego i sumy współczynników zsumowanych z odpowiednimi wagami: 1 1 = 0 + ( k1 + 2 k2 + 2 k3 + k4 ) 6 (34) 1 v 1 = v0 + ( k1 v + 2 k 2v + 2 k3v + k4v ) 6 (35) 11

2.5. Reguła Soermera Reguła Soermera [9] jes daowana na rok 1907. Jes popularnym sposobem dyskreyzacji równań róŝniczkowych drugiego rzędu przedsawionych jako układ dwóch równań pierwszego rzędu. Układ en składa się z równań, w kórych pochodna nie wysępuje po ich prawej sronie. Równanie: " = f ( ) (36) Warości począkowe: ( = (37) 0 ) 0 '( = v (38) 0 ) 0 W celu zwiększenia precyzji obliczeń inerwał czasowy dzielony jes na kilka lub kilkanaście kroków. Długość kroku definiowana jes nasępująco: h =, (39) m gdzie: h długość kroku, m ilość kroków, długość inerwału czasowego dla meody. Algorym en jes meodą wielopunkową, co oznacza, Ŝe nie saruje z jednego punku. Wymagana ilość warości począkowych uzyskiwana jes po wykonaniu pierwszej, sarowej fazy algorymu. Odpowiada ona rozwinięciu w szereg Taylora (5) wokół do drugiego rzędu wielkości: 1 ( 2 1 2 0 + ) = ( 0 ) + ' ( 0 ) + "( 0 ), (40) co po podsawieniu warości h za wyraz, zasosowaniu równań (36, 37, 38) oraz kilku prosych przekszałceniach daje: 1 1 = 0 + h [ v0 + h f ( 0 )] (41) 2 12

Druga faza meody polega wykonaniu w pęli obliczeń wyznaczających warość funkcji w chwili nasępnej (+ ). Ilość ieracji pęli jes określona ilością kroków minus dwa(kroki od drugiego do przedosaniego). KaŜde wyliczenie jes poprzedzane akualizacją warości drugiej pochodnej danej funkcji f( 0 +kh). 2 k+ 1 2 k + k 1 = h f ( 0 + k h) k=1,, m-1 (42) Po przekszałceniu ze względu na k+1 : 2 k + 1 = 2 k k 1 + h f ( 0 + k h) k=1,, m-1 (43) W rzeciej, osaniej fazie, na podsawie wcześniej wyznaczonych warości (43) obliczana jes warość pierwszej pochodnej rozwaŝnej funkcji. Wzór en uzyskuje się z rozwinięcia w szereg Taylora (5) dla funkcji () do drugiego rzędu warości (40) i przekszałceniu orzymanego równania ze względu na drugi wyraz ego rozwinięcia (44). ( ) ( 0 ) 1 ' ( 0 ) = + "( 0 ) (44) 2 Co po zasosowaniu równań (36, 37, 38) oraz zaleŝności (39) daje: ( m m 1) 1 ' ( + ) = + h f ( 0 h 2 + ) 0 (45) nasępująco: Zasada Soermera w rozwiązaniu zagadnienia punku maerialnego przedsawia się 1. Krok czasowy meody dzielony jes na kilka części: d h =, (46) z gdzie: z ilość kroków, h długość kroku. 2. Pierwszy krok oblicza kolejne połoŝenie porzebne do wysarowania generalnej części meody: 1 Fw 1 = 0 + h ( v 0 + h ) (47) 2 m 13

14 3. Główna część bazująca na obliczeniach z poprzedniego punku: m F h w k k k + = + 2 1 1 2, k=1,, z-1 (48) Dla kaŝdego k akualizowana jes warość siły wypadkowej F w. 4. Osania czynność polega na wyliczeniu prędkości bazującym na znajomości dwóch osanich połoŝeń i siły wypadkowej: m F h h v w k k + = 2 1 1 (49) 2.6. Algorym Verlea Algorym Verlea [2, 8, 11, 15] moŝna określić jako uproszczoną wersję meody Soermera. Tak jak ona algorym en jes meodą wielopunkową, jednak w przeciwieńswie do pierwowzoru nie przewiduje samodzielnego obliczania wymaganej ilości warości począkowych. W ym celu naleŝy posłuŝyć się jedną z meod jednopunkowych, np. meodą Eulera. Algorym Verlea jes meodą ruynowo wykorzysywaną w symulacjach biofizycznych (dynamice molekularnej). Znana jes akŝe pod nazwą jawnej meody róŝnic cenralnych. SłuŜy do numerycznego rozwiązywania układów równań róŝniczkowych zwyczajnych drugiego rzędu. Zosała opracowana w 1967 r. przez francuskiego fizyka Loupe a Verlea. Podsawowa idea algorymu polega na dwóch rozwinięciach w szereg Taylora (5) wyraŝenia () do rzeciego rzędu wielkości. Pierwsze równanie jes rozwinięciem do przodu w czasie 0 + : ) ( ) '"( 6 1 ) "( 2 1 ) '( ) ( ) ( 4 0 2 0 0 0 0 O + + + + = +, (50) a drugie do yłu 0 - : ) ( ) '"( 6 1 ) "( 2 1 ) '( ) ( ) ( 4 0 2 0 0 0 0 O + + = (51) Dodając sronami powyŝsze wyraŝenia uzyskuje się: ) "( ) "( ) ( ' 2 ) ( ) ( 4 2 0 0 0 0 O + + = + + (52) Rozwiązując ze względu na (+ ), w celu znalezienia warości funkcji w chwili nasępnej:

2 4 ( + ) = 2 ( ) ( ) + "( ) + O"( ) (53) 0 Błąd obcięcia w przypadku algorymu Verlea rozwijanego warościami jes rzędu 4, nawe, jeśli rzecie pochodne nie są jawne. Jego zaleą jes o, Ŝe jes ławy do zaimplemenowania, dokładny i sabilny. Problem z algorymem Verlea jes aki, Ŝe pierwsze pochodne nie są generowane wpros. Jes o poŝyeczne, kiedy nie są one porzebne, bo nie zabierają czasu procesora porzebnego do ich obliczania. Jeśli jednak ich znajomość jes konieczna, wyprowadza się je odejmując sronami rozwinięcia (50) i (51): ( + ) ( ) = 2 '( 0 ) (54) Po prosym przekszałceniu wyraŝenia (54) moŝna uzyskać pochodną funkcji (): 1 ' ( ) = 0 ( ( + ) ( )) 2 (55) Wadą meody jes o, Ŝe znajomość warości funkcji wyprzedza o jeden krok znajomość pochodnej ej funkcji. Wynika o ze sposobu jej obliczania oparym na znajomości warości funkcji w kroku poprzednim i nasępnym. Błąd związany z wyznaczaniem pierwszej pochodnej jes rzędu 2. MoŜna ławo zauwaŝyć, Ŝe warość funkcji w punkcie 0 + zarówno w Verlecie jak i Soermerze jes wyraŝona w aki sam sposób. RóŜnica polega na ym, Ŝe zasada Soermera dzieli inerwał czasowy na kilka mniejszych kroków i wykonuje obliczenia dla kaŝdego z nich, za kaŝdym razem uwzględniając zmiany drugiej pochodnej. Algorym Verlea wykonuje ę czynność jednokronie, dla warości drugiej pochodnej zadanej jako warość począkowa. Schema zasosowania meody Verlea do rozwiązania równania Newona składa się z dwóch części: inicjalizacyjnej, wykonanej np. meodą Eulera oraz właściwej, w kórej obliczenia wykonywane są juŝ przy uŝyciu algorymu Verlea. 1. PołoŜenie wyznaczane na podsawie dwóch poprzednich połoŝeń: F 2 2 d m 2 = 1 w 0 + (56) 2. WyraŜenie na prędkość w danej chwili opiera się na znajomości połoŝenia w chwili poprzedniej i nasępnej: 2 0 v1 = (57) 2 d 15

3. Implemenacja Klasy zaprojekowane na porzeby programu są szablonami C++ [4, 5]. Oznacza o, Ŝe definicja danej klasy jes przygoowana ylko raz, ale moŝe być uŝya dla róŝnych ypów danych (w naszym przypadku dla liczb zmiennoprzecinkowych pojedynczej i podwójnej precyzji). 3.1 Wekor Zjawiska fizyczne symulowane w programie w znacznej mierze opierają się na rachunku wekorowym. Z ego powodu przygoowanie zwarej srukury danych opisującej wekor jes bardzo wygodne. Wekor w przesrzeni rójwymiarowej, w układzie karezjańskim reprezenowany jes przez rzy współrzędne:, y i z. Rys. 1. Wekor w karezjańskim układzie współrzędnych Konsrukor obieku przyjmuje jako argumeny wywołania rzy liczby ypu określonego przez paramer szablonu, na podsawie kórego kompilaor worzy klasę opisującą wekor. Są o warości inicjujące współrzędne worzonego w en sposób wekora: Wekor<floa> (1.0f, 2.0f, 3.0f); Alernaywny konsrukor przyjmuje akŝe rójelemenową ablicę ych samych warości. Kolejne elemeny oznaczają odpowiednio składowe:, y, z. PowyŜszy zapis jes zaem równowaŝny z: floa ablica[] = 1.0f, 2.0f, 3.0f; Wekor<floa> (ablica); Konsrukor domyślny worzy obiek o składowych zerowych. 16

Składowe wekora moŝna modyfikować wykorzysując funkcję składową klasy Wekor: Se. Jej argumeny są akie jak w przypadku konsrukora obieku: rzy liczby ypu określonego przez paramer szablonu:.se(5.0f, 6.0f, 7.0f); lub rójelemenowa ablica akich liczb: floa ablica[] = 5.0f, 6.0f, 7.0f;.Se(ablica); Odczyu składowych wekora moŝna dokonać na dwa sposoby. Pierwszy: poprzez funkcję składową Ge jako argumen wywołania przyjmującą ablicę rójelemenową, do kórej zosaną zwrócone współrzędne wekora. floa ablica[3];.ge(ablica); Drugi sposób o uŝycie operaora[] zwracającego poszczególne składowe w zaleŝności od wywołania funkcji. Argumen 1 oznacza składową, analogicznie 2 y i 3 z. skladowa_ = [1]; skladowa_y = [2]; skladowa_z = [3]; 3.1.1 Iloczyn skalarny W rójwymiarowej przesrzeni euklidesowej iloczyn skalarny dwóch wekorów: a=(a, a y, a z ) i b=(b, b y, b z ) oznaczany jes przez: a b i definiowany jako suma iloczynów składowych obu wekorów. r a b r = a b + a y b y + a z b z (58) Wynikiem iloczynu skalarnego jes liczba. W programie iloczyn skalarny dwóch wekorów moŝna obliczyć korzysając z funkcji ScalarProduc. Wekor<floa> a(1.0f, 2.0f, 3.0f), b(3.0f, 2.0f, 1.0f); floa iloczyn = ScalarProduc(a, b); 3.1.2. Iloczyn wekorowy Iloczyn wekorowy dwóch wekorów zapisywany jes jako a b. Daje on w wyniku wekor. Wzór na wyraŝenie iloczynu wekorowego poprzez składowe obu wekorów moŝna zapisać w posaci quasi wyznacznika macierzy: 17

r a b r = ˆ a b yˆ a b y y zˆ a b z z = ( a y b z a z b ) ˆ + ( a y z b a b ) yˆ + ( a z b y a y b ) zˆ (59) Iloczyn wekorowy moŝna obliczyć za pomocą funkcji VecorProduc zaimplemenowanej, ak jak iloczyn skalarny, dla obieków klasy Wekor. Wekor<floa> a(1.0f, 2.0f, 3.0f), b(3.0f, 2.0f, 1.0f); Wekor<floa> iloczyn = VecorProduc(a, b); 3.1.3. Długość wekora Długość wekora w przesrzeni zdefiniowana jes jako pierwiasek kwadraowy z iloczynu skalarnego wekora z samym sobą. Normę z wekora zapisuje się nasępująco: r r r 2 2 a = ( a a) = ( a + a + a y 2 z ) (60) W programie do obliczania długości wekora słuŝy funkcja składowa Lengh zdefiniowana w klasie Wekor. Wekor<floa> (1.0f, 2.0f, 3.0f); floa dlugosc =.Lengh(); 3.1.4. Normowanie W programie częso wysępuje konieczność uŝycia wersora (wekor o jednoskowej długości) wskazującego kierunek w przesrzeni. W akich przypadkach sosuje się operację normowania. Zachowuje ona zwro i kierunek wekora, a jego długość sprowadza do jednoski. Wekor jednoskowy definiowany jes nasępująco: a r aˆ = r (61) a Wekor normalny równy jes ilorazowi danego wekora i jego długości. UŜycie normowania w programie moŝliwe jes dzięki funkcji składowej Uni: Wekor<floa> (1.0f, 2.0f, 3.0f); Wekor<floa> jednoskowy =.Uni(); 3.1.5. Operaory arymeyczne Poza powyŝszymi operacjami klasa Wekor udosępnia akŝe operaory arymeyczne akie jak suma i róŝnica dwóch wekorów. Wekor powsały w wyniku operacji dodawania równa się sumie poszczególnych składowych. 18

Rys. 2. Suma dwóch wekorów w dwóch wymiarach. Składowa z równa jes zeru Analogicznie jes w przypadku róŝnicy. Rys. 3. RóŜnica dwóch wekorów. Składowa z jes równa zeru Dodakowo zaimplemenowane są operaory mnoŝenia i dzielenia wekora przez skalar. Odpowiadają one odpowiednio jego wydłuŝeniu i skróceniu odpowiednią ilość razy. KaŜda składowa jes mnoŝona lub dzielona przez liczbę. UŜycie powyŝszych operaorów przedsawia się nasępująco: Wekor<floa> a(1.0f, 2.0f, 3.0f), b(3.0f, 2.0f, 1.0f); Wekor<floa> suma = a + b; Wekor<floa> roznica = a b; Wekor<floa> powiekszony = 3 * a; Wekor<floa> pomniejszony = a / 3; Ponado w klasie Wekor isnieje w specyficzny sposób przeciąŝony operaor mnoŝenia działający na dwa wekory. Zosał napisany na porzeby implemenacji meod numerycznych opisanych w poprzednim rozdziale. Wynikiem jes wekor, kórego składowe odpowiadają iloczynowi poszczególnych składowych mnoŝonych wekorów. Dla macierzy operaor aki nazywa się iloczynem Hadamarda znany akŝe pod nazwą iloczynu Schura lub po prosu iloczynu po współrzędnych ( A B) = a b. (62) ij ij ij Jego uŝycie pokazane jes poniŝej. Wekor<floa> nowy_wekor = a * b; 19

3.2. Punk maerialny Podsawowy elemen, z kórego budowane będą opisane niŝej modele rójwymiarowych układów fizycznych o punk maerialny. Do opisu cząski porzebne są informacje akie jak: masa, prędkość, czy połoŝenie. Ruch akiej cząski moŝe być ograniczony przez pewne więzy. Kolejną informacją przydaną do opisu punku maerialnego jes określenie czy cząska oddziałuje z innymi, sąsiednimi. Szablon klasy PkMa (punk maerialny) zawiera wszyskie e dane oraz meody słuŝące do ich usawiania i pobierania informacji o reprezenowanej cząsce. Uworzenie obieku danej klasy wymaga podania jego połoŝenia, prędkości masy i określenia czy na punk nałoŝone są więzy uniemoŝliwiające mu swobodne poruszanie się. Klasa PkMa do reprezenacji pierwszych dwóch z powyŝej przedsawionych danych uŝywa obieków wcześniej opisanej klasy Wekor. Masa jes liczbą ypu określonego przez paramer szablonu, a więzy są zmienną logiczną (false oznacza punk o ruchu nieograniczonym, rue z nałoŝonymi więzami): Wekor<floa> polozenie(1.0f, 2.0f, 3.0f); Wekor<floa> predkosc(3.0f, 2.0f, 1.0f); floa masa = 5.0f; bool wiezy = rue; PkMa<floa> czaska(polozenie, predkosc, masa, wiezy); Jes o równowaŝne zapisowi: A akŝe: PkMa<floa> czaska(1.0f, 2.0f, 3.0f, 3.0f, 2.0f, 1.0f, 5.0f, rue); floa ablica1[] = 1.0f, 2.0f, 3.0f; floa ablica2[] = 3.0f, 2.0f, 1.0f; PkMa<floa> czaska(ablica1, ablica2, 5.0f, rue); Domyślny konsrukor worzy cząskę znajdującą się w począku układu współrzędnych, spoczywającą, o jednoskowej masie i bez Ŝadnych więzów. 3.2.1. Meody dosępu do informacji o cząsce Zmiana paramerów opisujących punk maerialny moŝliwa jes przez uŝycie funkcji składowej Se. Jej pierwszy argumen jes sałą idenyfikującą paramer punku maerialnego, kóry chcemy zmodyfikować. Globalne sałe idenyfikujące zmieniane paramery o: CURR_POS, kóry oznacza akualne połoŝenie, PREV_POS połoŝenie w 20

chwili poprzedniej, VEL prędkość cząski, MASS jej masę, CONS informacja o więzach. Drugim argumenem jes nowa warość przypisywana modyfikowanemu paramerowi. PkMa<floa> czaska; czaska.se(curr_pos, 1.0f, 2.0f, 3.0f); czaska.se(prev_pos, 0.0f, 1.0f, 2.0f); czaska.se(mass, 2.0f); czaska.se(cons, false); W przypadku jednoczesnego usalania połoŝenia i prędkości, ak jak w konsrukorze obieku, zamias rzech liczb moŝna uŝyć rójelemenowej ablicy lub insancji klasy Wekor. Informację o sanie poszczególnych paramerów moŝna uzyskać korzysając z funkcji składowej Ge. Podobnie jak w przypadku funkcji Se jej pierwszym paramerem jes sała idenyfikująca paramer, kórego warość ma być pobrana. PołoŜenie i prędkość mogą zosać zwrócone jako wekory lub ablice współrzędnych. Wekor<floa> polozenie = czaska.ge(curr_pos); floa ablica[3]; czaska.ge(vel, ablica); Do pozyskania masy lub informacji o więzach naleŝy uŝyć innych funkcji. Są nimi GeMass zwracająca masę molekuły i IsHanged informująca czy jes ona nieruchoma względem układu odniesienia. floa masa = czaska.gemass(); bool wiezy = czaska.ishanged(); 3.2.2. Implemenacja meod numerycznych w klasie punku maerialnego W klasie PkMa zosały zaimplemenowane dwie prose meody numeryczne. Są o meoda Eulera i Verlea. Ich opis znajduje się w rozdziale drugim. Algorymy e zosały wykorzysane w funkcjach: SepForwardEuler i SepForwardVerle. Obliczają one połoŝenie cząski, po upływie czasu podawanego jako argumen funkcji. Dodakowo jako argumen wywołania funkcja przyjmuje wekor przyspieszenia działającego na punk maerialny. Wekor<floa> przyspieszenie(1.0f, 1.0f, 1.0f); czaska.sepforwardeuler(przyspieszenie, 0.1f); czaska.sepforwardverle(przyspieszenie, 0.1f); PoniŜej znajdują się lisingi przedsawiające poszczególne meody numeryczne. Lising 1 prezenuje meodę SepForwardEuler odpowiedzialną za realizację kroku czasowego w meodzie Eulera. 21

Lising 1. Meoda realizująca krok czasowy w meodzie Eulera emplae<class ype> void PkMa<ype>::SepForwardEuler(cons Wekor<ype> &a, ype d) prev_pos = curr_pos; Wekor<ype> mp = velociy + a * d; velociy = mp; mp = curr_pos + velociy * d; curr_pos = mp; W pierwszym eapie działania funkcji w zmiennej przechowującej poprzednie połoŝenie cząski zapisywana jes bieŝąca pozycja (w chwili wywołania meody). Nasępnie korzysając ze wzoru (8) na podsawie prędkości począkowej, przyspieszenia i kroku czasowego obliczana jes warość prędkości. Nasępnie analogicznie, na podsawie połoŝenia począkowego, obliczonej w poprzedniej linii kodu prędkości i inerwału czasowego uakualniana jes warość połoŝenia zgodnie ze wzorem (7). Meoda widoczna w lisingu 2 o implemenacja algorymu Verlea. Jes o algorym rójpunkowym, dlaego w pierwszym kroku symulacji zmuszeni jeseśmy do korzysania ze zwykłego algorymy Eulera. Lising 2. Meoda realizująca krok czasowy w meodzie Verlea emplae<class ype> void PkMa<ype>::SepForwardVerle(cons Wekor<ype> &a, ype d) ype dwa = 2.0; if(curr_pos == prev_pos) SepForwardEuler(a, d); else Wekor<ype> mp = (curr_pos*dwa) - prev_pos + (a*d*d); prev_pos = curr_pos; curr_pos = mp; velociy = curr_pos - prev_pos * (1/(2*d)); Informacja o poprzednim połoŝeniu (prev_pos) punku, kórą w meodzie SepForwardEuler zapisywaliśmy w polach klasy PkMa przygoowana zosała właśnie na porzeby powyŝszej implemenacji meody Verlea. Jeśli wynik porównania połoŝenia poprzedniego i akualnego jes prawdziwy, wywoływana jes funkcja odpowiadająca meodzie Eulera. W en sposób obliczane są porzebne warości sarowe meody Verlea. Kolejne insrukcje implemenują wzory (53) i (55). PowyŜsze meody są algorymami jednokrokowymi. Znajomość przyspieszenia działającego na cząskę w chwili wywołania funkcji jes wysarczająca do wyznaczenia połoŝenia punku w chwili nasępnej: ( 0 + ). Pozosałe meody opisane w rozdziale drugim: Rungego-Kuy drugiego i czwarego rzędu oraz Soermera, są meodami wielokrokowymi. 22

Do obliczenia kolejnego połoŝenia wymagają kilkukronego wyznaczania przyspieszenia działającego na daną cząskę. Z ego powodu implemenacje ych meod znajdują się pozosałych klasie ZbPkMa. Dokładniejsze wyjaśnienie znajduje się w części 3.3.1. 3.3. Zbiór punków maerialnych ZbPkMa (zbiór punków maerialnych) jes kolejnym szablonem klasy absrakcyjnej. Oznacza o, Ŝe nie moŝna uworzyć obieku będącego insancją konkreyzacji ej klasy. Jej zadaniem jes sworzenie fundamenu dla klas pochodnych implemenujących konkrene symulowane modele. Definiuje ona zbiór punków maerialnych reprezenowanych przez obieky klasy PkMa. Przechowuje akŝe informacje o przyspieszeniach i siłach działających na kaŝdą z cząsek z ego zbioru. Dodakową informacją przechowywaną w klasie jes nazwa akualnie uŝywanego algorymu numerycznego, za pomocą kórego wyznaczane jes połoŝenie molekuły wszyskich punków nasępnej kolejnej chwili czasu. Meody dosępu do informacji opisujących kaŝdą z cząsek zbioru są akie same jak w przypadku obieków klasy PkMa. Jedyną róŝnicą w wywołaniu ych funkcji jes ich dodakowy argumen będący liczbą całkowią, określający numer cząski w zbiorze. Dla przykładowej klasy dziedziczącej przyklad składającej się z pięciu punków maerialnych uŝycie ych funkcji moŝe być nasępujące: przyklad<floa> (RK4);.Se(VEL, 2, 1.0f, 1.0f, 1.0f); wekor<floa> pozycja4czaski =.Ge(CURR_POS, 3); bool wiezy4czaski = IsHanged(3);//cząski są numerowane od zera 3.3.1. Implemenacja meod numerycznych w klasie ZbPkMa W klasie zaimplemenowane zosały wszyskie meody numeryczne opisane w rozdziale drugim. NaleŜą do nich algorymy: Eulera, Verlea, Soermera, Rungego-Kuy drugiego i czwarego rzędu. Podczas worzenia obieku klasy dziedziczącej obowiązkowym argumenem konsrukora jes sała idenyfikująca meodę uŝywaną do rozwiązywania równań ruchu układu. Meodę ę wybiera się podając jako argumen jeden z elemenów ypu wyliczeniowego: EULER, VERLET, STOERM, RK2, RK4. Po uworzeniu obieku moŝna zmienić meodę przydzieloną układowi podczas konsrukcji. SłuŜy do ego funkcja Se wywoływana z argumenami ALG, oznaczającym zmianę algorymu i elemenem powyŝej wymienionego ypu określającym dany algorym..se(alg, RK4); 23

Powoduje o jednak znaczny skok rozbieŝności obliczeń, a w rezulacie załamanie się symulacji. Funkcja SepForward dokonująca obliczeń wywoływana jes ylko z jednym argumenem: krokiem czasowym meody określonej w powyŝszy sposób, np..sepforward(0.1f); Implemenacja algorymów Eulera i Verlea w klasie zbioru punków maerialnych sprowadza się do wywołania odpowiednich meod w obiekach kaŝdego punku maerialnego zbioru wchodzącego w skład modelu (lising 3). Lising 3. Funkcje realizujące krok czasowy meodami Eulera i Verlea dla wszyskich cząsek ze zbioru emplae<class ype> void ZbPkMa<ype>::SepForwardEuler(ype d) CalculaeForces(); for(in i=0; i<size; i++) collecion[i].sepforwardeuler(acceleraions[i], d); emplae<class ype> void ZbPkMa<ype>::SepForwardVerle(ype d) CalculaeForces(); for(in i=0; i<size; i++) collecion[i].sepforwardverle(acceleraions[i], d); Pozosałe meody nie mogły być zaimplemenowane w en sposób. Ograniczenie polegało na ym, Ŝe przyspieszenie działające na cząskę nie mogło być podane jako argumen wywołania funkcji meody numerycznej. Pozosałe rzy meody numeryczne wymagają więcej niŝ jednego wyznaczenia sił działających na punky maerialne. Zadanie o realizowane jes przy pomocy funkcji CalculaeForces, kóra musi być zaimplemenowana w kaŝdej klasie pochodnej. Innym rozwiązaniem mogłoby być zamieszczenie wszyskich meod numerycznych w klasie PkMa, ak jak w przypadku algorymów Eulera i Verlea, a funkcja obliczająca przyspieszenia przekazywana była by przez wskaźnik. Rodzi o jednak problem z akualizacją ablicy przyspieszeń będącą częścią klasy ZbPkMa. Spowodowałoby o zazębienie się klas PkMa i ZbPkMa, podczas gdy załoŝenie wsępne polegało na uworzeniu zbioru punków z elemenów klasy PkMa i zachowaniu pewnej hierarchii(plików programu i klas). UŜye rozwiązanie zachowuje przejrzysą, czyelną i ławą do zrozumienia srukurę programu jak i prosą implemenację meod numerycznych. Funkcja dla niekórych algorymów jes wywoływana więcej niŝ raz w ciągu kroku czasowego. Kod poszczególnych meod zosał zamieszczony poniŝej. Lising 4. Funkcja realizująca krok czasowy meodą Soermera 24

emplae<class ype> void ZbPkMa<ype>::SepForwardSoerm(ype d) in subseps = 10; ype h = d / subseps; ype halfh = 0.5 * h; ype wo = 2.0; CalculaeForces(); for(in i = 0; i < Coun(); i++) Wekor<ype> nowposiion = Ge(CURR_POS, i); Se(PREV_POS, i, nowposiion); Wekor<ype> mp = nowposiion + h * (Ge(VEL, i) + halfh * acceleraions[i]); Se(CURR_POS, i, mp); CalculaeForces(); for(in j = 1; j < subseps - 1; j++) for(in i = 0; i < Coun(); i++) Wekor<ype> nowposiion = Ge(CURR_POS, i); Wekor<ype> mp = wo * nowposiion - Ge(PREV_POS, i) + h * h * acceleraions[i]; Se(PREV_POS, i, nowposiion); Se(CURR_POS, i, mp); CalculaeForces(); for(in i =0; i <Coun(); i++) Wekor<ype> nowposiion = Ge(CURR_POS, i); Wekor<ype> mp = wo * nowposiion - Ge(PREV_POS, i) + h * h * acceleraions[i]; Se(PREV_POS, i, nowposiion); Se(CURR_POS, i, mp); mp = (Ge(CURR_POS, i) - Ge(PREV_POS, i)) / h + halfh * acceleraions[i]; Se(VEL, i, mp); Funkcja CalculaeForces, obliczająca siły wypadkowe działające na poszczególne cząski układu jes wywoływana na począku meody oraz po kaŝdej zmianie połoŝeń w rakcie jej działania, j. po kaŝdym przebiegu pęli odpowiadającym kolejnym krokom meody (implemenacja wzorów 43 i 45). Lising 4. Funkcja realizująca krok czasowy meodą Rungego-Kuy drugiego rzędu emplae<class ype> void ZbPkMa<ype>::SepForwardRK2(ype d) Wekor<ype>* prev_vel = new Wekor<ype>[Coun()]; ype half = 0.5; CalculaeForces(); for(in i = 0; i < Coun(); i++)//k1 Wekor<ype> PosiionNow = Ge(CURR_POS, i); Se(PREV_POS, i, PosiionNow); Wekor<ype> VelociyNow = Ge(VEL, i); 25

prev_vel[i] = VelociyNow; Wekor<ype> k1 = d * VelociyNow; Wekor<ype> mp = PosiionNow + half * k1; Se(CURR_POS, i, mp); k1 = d * acceleraions[i]; mp = VelociyNow + half * k1; Se(VEL, i, mp); CalculaeForces(); for(in i = 0; i < Coun(); i++) Wekor<ype> k2 = d * Ge(VEL, i); Wekor<ype> mp = Ge(PREV_POS, i) + k2; Se(CURR_POS, i, mp); k2= d * acceleraions[i]; mp = prev_vel[i] + k2; Se(VEL, i, mp); delee [] prev_vel; W implemenacji algorymu Runge-Kuy drugiego rzędu (lising 4) CalculaeForces wywoływana jes dwa razy. SłuŜy, zgodnie z algorymem opisanym w rozdziale drugim, do obliczania współczynników wyznaczających warości połoŝenia i prędkości po upływie określonego czasu. Dynamicznie uworzona ablica prev_vel jes odpowiednikiem warości prev_pos z klasy PkMa, słuŝy bowiem do przechowywania prędkości cząsek z poprzedniej fazy obliczeń meody. Lising 5. Funkcja realizująca krok czasowy meodą Rungego-Kuy czwarego rzędu emplae<class ype> void ZbPkMa<ype>::SepForwardRK4(ype d) ype half = 0.5; ype wo = 2.0; ype one_by_si = 1.0 / 6.0; Wekor<ype>* sum_kv = new Wekor<ype>[Coun()]; Wekor<ype>* sum_kr = new Wekor<ype>[Coun()]; Wekor<ype>* prev_vel = new Wekor<ype>[Coun()]; CalculaeForces(); for(in i = 0; i < Coun(); i++) Wekor<ype> mp = Ge(CURR_POS, i); Se(PREV_POS, i, mp); mp = Ge(VEL, i); prev_vel[i] = mp; Wekor<ype> k1 = d * Ge(VEL, i); sum_kr[i] = k1; mp = Ge(PREV_POS, i) + half * k1; Se(CURR_POS, i, mp); k1 = d * acceleraions[i]; sum_kv[i] = k1; mp = prev_vel[i] + half * k1; 26

Se(VEL, i, mp); CalculaeForces(); //dla yn + k1/2 for(in i =0; i < Coun(); i++) Wekor<ype> k2 = d * Ge(VEL, i); sum_kr[i] += (wo * k2); Wekor<ype> mp = Ge(PREV_POS, i) + half * k2; Se(CURR_POS, i, mp); k2 = d * acceleraions[i]; sum_kv[i] += (wo * k2); mp = prev_vel[i] + half * k2; Se(VEL, i, mp); CalculaeForces();//oblicza f(yn + k2/2) for(in i =0; i < Coun(); i++) Wekor<ype> k3 = d * Ge(VEL, i);//h * f(yn + k2/2) sum_kr[i] += (wo * k3); Wekor<ype> mp = Ge(PREV_POS, i) + k3; Se(CURR_POS, i, mp); k3 = d * acceleraions[i]; sum_kv[i] += (wo * k3); mp = prev_vel[i] + k3; Se(VEL, i, mp); CalculaeForces(); for(in i = 0; i < Coun(); i++) Wekor<ype> k4 = d * Ge(VEL, i); sum_kr[i] += k4; Wekor<ype> mp = Ge(PREV_POS, i) + one_by_si * sum_kr[i]; Se(CURR_POS, i, mp); k4 = d * acceleraions[i]; sum_kv[i] += k4; mp = prev_vel[i] + one_by_si * sum_kv[i]; Se(VEL, i, mp); delee [] sum_kv; delee [] sum_kr; delee [] prev_vel; W przypadku meody Runge-Kuy czwarego rzędu liczba wywołań funkcji CalculaeForces rośnie do czerech, analogicznie do meody MidPoin. Dynamicznie uworzone na począku funkcji ablice sum_kr i sum_kv słuŝą do przechowywania sum poszczególnych współczynników k dla połoŝenia i prędkości (zob. wzór 25). 27

3.3.2. Klasy rozszerzające szablon ZbPkMa implemenacje przykładowych modeli W ramach projeku zosało uworzonych kilka klas pochodnych względem ZbPkMa (ich opis znajduje się poniŝej). Projek jes owary i umoŝliwia worzenie własnych klas implemenujących róŝnego ypu układy fizyczne. 3.3.2.1. Swobodne punky UnboundedPions (swobodne punky) jes najprosszą klasą dziedziczącą z klasy ZbPkMa. Modelowany przez nią układ składa się z określonej w momencie worzenia obieku ilości punków maerialnych o jednoskowej masie ułoŝonych w rzędzie wzdłuŝ osi. Rys. 4. Punky maerialne z działającymi na nie siłami proporcjonalnymi do ich połoŝenia w szeregu Klasa a pozwoliła na przeprowadzenie podsawowych esów implemenacji meod numerycznych i ich ocenę za pomocą wizualizacji przygoowanej w OpenGL. Symulacja pokazuje nauralnie, Ŝe cząski o większym przyspieszeniu spadają szybciej. Kod klasy realizujący powyŝszy układ przedsawiony jes na lisingu 6. 28

Lising 6. Konsrukor klasy UnboundedPoins i funkcja CalculaeForces ej klasy emplae<class ype> UnboundedPoins<ype>::UnboundedPoins(algorihms alg, in size) : ZbPkMa<ype>(size) Se(ALG, alg); for(in i=1; i<coun(); i++) Se(CURR_POS, i, i, 0.0, 0.0); Se(PREV_POS, i, i, 0.0, 0.0); Se(VEL, i, 0.0, 0.0, 0.0); emplae<class ype> void UnboundedPoins<ype>::CalculaeForces() for(in i = 0; i < Coun(); i++) acceleraions[i].se(0.0, -0.1*i, 0.0); KaŜda cząska ma sałe przyspieszenie proporcjonalne do numeru jej indeksu w zbiorze punków maerialnych. 3.3.2.2. Łańcuch oscylaorów Kolejną klasą rozszerzającą ZbPkMa jes klasa Oscilaors. Podobnie, jak w poprzednim modelu cząski ułoŝone są w rzędzie wzdłuŝ osi. Jednak ym razem kaŝda cząska układu oddziałuje z dwoma sąsiednimi siłą harmoniczną, j. wpros proporcjonalną do wychylenia z połoŝenia równowagi o współczynniku proporcjonalności zadanym przez sałą spręŝysości k: F = k (63) Na poniŝszych rysunkach przedsawione zosały wyniki symulacji, w kórej osaniej cząsce nadawana zosała począkowa prędkość 2.0. Zmieniana była sała spręŝysości. W pierwszym przypadku równa 1.0, a w drugim 0.1. 29

Rys. 5. Łańcuch oscylaorów w połoŝeniu równowagi i w ruchu. Sała spręŝysości wynosi 1.0 Rys. 6. Łańcuch oscylaorów w ruchu. Sała spręŝysości 0.1 Zmiana sałej spręŝysości na mniejszą powoduje rozluźnienie się wiązań między punkami. W konsekwencji później reagują one na zmianę pozycji swoich sąsiadów. Cały łańcuch oscylaorów rozciąga się i ściska w większej skali niŝ w przypadku duŝej sałej spręŝysości. Konsrukor obieku klasy Oscilaors jes podobny do konsrukora klasy UnboundedPoins: Lising 7. Konsrukor klasy modelującej zbiór oscylaorów emplae<class ype> Oscilaors<ype>::Oscilaors(algorihms alg, in size, ype inc, ype els, ype, ype y, ype z) : ZbPkMa<ype>(size) Se(ALG, alg); incremen = inc; elasiciy = els; for(in i=0; i<coun(); i++) Se(CURR_POS, i, incremen*i+, y, z); Se(PREV_POS, i, incremen*i+, y, z); Se(VEL, i, 0.0, 0.0, 0.0); Se(MASS, i, 1.0); Se(CONS, 0, rue); 30

Przyjmuje jednak kilka nowych argumenów. MoŜna określić odległości między oscylującymi punkami (domyślnie warość 2.0), zdefiniować sałą spręŝysości (domyślnie 1.0) i począkowe połoŝenie pierwszej cząski modelu (domyślnie środek układu współrzędnych). Rzeczywisą róŝnicę sanowi jednak funkcja składowa wyznaczająca siły działające na cząski (lising 8). Lising 8. Funkcja wyznaczająca siły działające na cząski w klasie Oscilaors emplae<class ype> void Oscilaors<ype>::CalculaeForces() //cons ype aenuaionconsan=0.1; cons ype springconsan = elasiciy; cons ype equilibriumpoin = incremen; for(in i=0;i<coun();i++) if (IsHanged(i)) coninue; forces[i].se(0.0, 0.0, 0.0); Wekor<ype> mp = Ge(CURR_POS, i); if (i>0)//do lewego Wekor<ype> disance = mp - Ge(CURR_POS, i-1); forces[i] += -disance.uni() * (disance.lengh() - equilibriumpoin) * springconsan; if (i<coun()-1)//do prawego Wekor<ype> disance = mp - Ge(CURR_POS, i+1); forces[i] += -disance.uni() * (disance.lengh() - equilibriumpoin) * springconsan; //forces[i] += Ge(VEL, i) * -aenuaionconsan; acceleraions[i] = forces[i] / GeMass(i); Obliczana w ej meodzie siła jes wypadkową oddziaływania z dwoma sąsiadami z lewej i prawej srony, oczywiście o ile acy isnieją. MoŜemy nałoŝyć na poszczególne cząski więzy naleŝy polu klasy PkMa o nazwie consrains nadać warość rue wówczas siły działające na ą cząskę nie są wyznaczane. Zakomenowany w lisingu 8 fragmen kodu odpowiedzialny jes za łumienie drgań. 3.3.2.3. Siaka Klasą podobną do łańcucha oscylaorów jes klasa Mesh implemenuje dwuwymiarową siakę drgających punków. Konsruując obiek poza wyborem algorymu moŝna zmienić domyślną warość 10 cząsek w jednym rzędzie kwadraowej siaki, a akŝe odległość między punkami. Cząski oddziałują z punkami sąsiednimi zarówno z lewej i prawej srony jak i góry, dołu, a akŝe znajdujących się po przekąnych. Oddziaływanie o jes 31

akie samo jak w przypadku opisanym wcześniej j. cząski związane są siłami harmonicznymi. Rys. 7. Siaka nieruchoma w rzucie z góry Zaburzenie w siace generowane jes przez nadanie prędkości począkowej jednemu lub kilku punkom, z kórych składa się model. W przypadkach pokazanych na poniŝszych rysunkach prędkość nadawana poszczególnym punkom wynosiła 1.0 i skierowana pionowo w górę. Rys. 8. Zaburzenie rozchodzące się od lewego rogu. Sała spręŝysości równa 1.0 Zmiana sałej spręŝysości w sile, z jaką oddziałują z sobą cząski układu powoduje inną prędkość rozchodzenia się zaburzenia w siace, a akŝe ampliudę drgań. Zmniejszenie ej warości o połowę powoduje znaczne zmiany w przebiegu symulacji. 32

Rys. 9. Zaburzenie rozchodzące się z cenralnego punku modelu. Sała spręŝysości wynosi 0.5 Konsrukor działa podobnie jak w klasach opisanych poprzednio. Określany jes zaem algorym numeryczny, wymiar siaki, współczynnik spręŝysości oraz połoŝenie pierwszego punku układu. Konsrukor z podanej wcześniej ilości punków formuje siakę w kszałcie kwadrau. Lising 9. Konsrukor worzący siakę dwuwymiarową oscylaorów emplae<class ype> Mesh<ype>::Mesh(algorihms alg, in dim, ype inc, ype els, ype, ype y, ype z) : ZbPkMa<ype>(dim*dim) Se(ALG, alg); dimension = dim; incremen = inc; elasiciy = els; in inde = 0; for(in i=0; i<dimension; i++) for(in j=0; j<dimension; j++) Se(CURR_POS, inde, incremen*j+, 0.0+y, - incremen*i+z); Se(PREV_POS, inde, incremen*j+, 0.0+y, - incremen*i+z); Se(VEL, inde, 0.0, 0.0, 0.0); Se(MASS, inde, 1); if(i==0 i==(dimension-1) j==0 j==(dimension- 1)) Se(CONS, inde, rue); inde++; Siła działająca na cząskę, podobnie jak w przypadku oscylaorów, wyznaczana jes dla wszyskich punków poza ymi, na kóre nałoŝone są więzy połoŝenia. RóŜnica w sosunku do oscylaorów jes aka, Ŝe oddziaływanie liczone jes ze wszyskimi punkami bezpośrednio powiązanymi z daną cząską, a nie ylko dwoma sąsiadami. 33

3.3.2.4. Lina Klasa Rope (Lina) jes modelem składającym się z punków maerialnych połączonych ze sobą siłami spręŝysymi. Na wszyskie cząski poza pierwszą, kóra jes punkem zaczepienia liny, poza siłą wypadkową pochodzącą od sąsiadów działa akŝe siła grawiacji skierowana równolegle do warości ujemnych osi y. Podobnie jak w poprzednich klasach rozszerzających klasę ZbPkMa za pomocą argumenów konsrukora zmienić moŝna ilość punków, z kórych zbudowany jes układ (domyślnie 10) włączając w o punk zaczepienia. Rys. 10. Począkowe połoŝenie liny Począek symulacji o lina ułoŝona poziomo (rys. 10). Wszyskie cząski znajdują się w połoŝeniach równowagi wobec swoich sąsiadów. Masa kaŝdej cząski wynosi 0.1, a odległość między nimi o 0.5. Sała spręŝysości k oddziaływania cząsek na siebie jes równa 200, a sała łumienności drgań spręŝysych 0.3. Na wszyskie punky liny działa siła grawiacji, a właściwie przyspieszenie ziemskie równe 9.81. Podczas opadania liny widać jak grawiacja działa na wszyskie cząski, a akŝe jak powiązanie z punkem zaczepienia zakrzywia or opadających punków składających się na linę (por. rys. 11). Widać drgania spowodowane siłami harmonicznymi. 34

Rys. 11. Fazy opadania liny Po słumieniu oscylacji napięcie liny (odległości pomiędzy poszczególnymi punkami) zaleŝy od odległości od punku zaczepienia. Punky blisko punku zaczepienia są bardziej oddalone ze względu na cięŝar punków podczepionych do nich (rys. 12). Lina rozciąga się pod własnym cięŝarem. Rys. 12. Wisząca lina Konsrukor klasy Rope jes podobny do ych, z opisanych wyŝej klas. Jego argumeny są idenyczny, jak w przypadku klasy implemenującej model sprzęŝonych oscylaorów (lising 10). Lising 10. Konsrukor liny emplae<class ype> Rope<ype>::Rope(algorihms alg, in size, ype, ype y, ype z) : ZbPkMa<ype>(size) Se(ALG, alg); incremen = 0.5; ype d = incremen; for(in i=0; i<coun(); i++) Se(CURR_POS, i, +d*i, y, z); 35

Se(PREV_POS, i, +d*i, y, z); Se(VEL, i, 0.0, 0.0, 0.0); Se(MASS, i, 0.3); Se(CONS, 0, rue); RównieŜ meoda CalculaeForces jes podobna do ej, z klasy oscylaorów, z ym, Ŝe oprócz sił spręŝysych i łumienia dodana zosała siła grawiacji (lising 11). Lising 11. Meoda obliczająca siły działające na kaŝdą cząskę liny emplae<class ype> void Rope<ype>::CalculaeForces() //sale fizyczne cons ype springconsan=200.0; cons ype aenuaionconsan=0.3; cons ype equilibriumpoin=incremen; cons Wekor<ype> graviaionalconsan(0.0, -9.81, 0.0); //obliczanie sil for(in i=0;i<coun();i++) if (IsHanged(i)) coninue; forces[i].se(0.0, 0.0, 0.0); Wekor<ype> disance(0.0, 0.0, 0.0); Wekor<ype> mp = Ge(CURR_POS, i); if (i > 0)//oddzialywanie z lewym sasiadem disance = mp - Ge(CURR_POS, i-1); forces[i] += -disance.uni() * (disance.lengh() - equilibriumpoin) * GeMass(i) * springconsan; if (i < Coun() - 1)//oddzialywanie z prawym sasiadem disance = mp - Ge(CURR_POS, i+1); forces[i] += -disance.uni() * (disance.lengh() - equilibriumpoin) * GeMass(i) * springconsan; forces[i] += Ge(VEL, i) * -aenuaionconsan; acceleraions[i] = forces[i] / GeMass(i); acceleraions[i] += graviaionalconsan; Lina jes pierwszym modelem, w kórym przygoowany przeze mnie kod zosał uŝyy do nierywialnego obieku mającego symulować rzeczywisy układ. Efek jes bardzo zadowalający wynik symulacji dobrze oddaje ruch prawdziwej liny w ośrodku. Bez rudu moŝna powyŝszą klasę zmodyfikować ak, aby modelowała ruch włosów lub rawy o sandardowe juŝ problemy symulowane na przykład przy produkcji filmów animowanych kompuerowo. Po raz pierwszy szerokiej publiczności podobny efek pokazany zosał bodajŝe w filmach Shrek 2 i Epoka Lodowcowa 2, czyli całkiem niedawno. Oczywiście am 36

symulowany był nie jeden włos, a ysiące. Jednak przy produkcji filmów symulacja nie odbywa się w czasie rzeczywisym jedna klaka moŝe być renderowana godzinami. 3.3.2.5. Cząski oddziałujące na siebie poencjałem Morse a. W osanim zagadnieniu uczyniłem ukłon w sronę dynamiki molekularnej, kóra była jedną z inspiracji do przygoowania omawianego projeku. Klasa Morse implemenuje model, w kórym cząski oddziałują na siebie zgodnie z poencjałem Morse a [15, 16] sandardowy model oddziaływania cząsek odpychających się, gdy są bardzo blisko i przyciągających się, gdy są dalej. Oddziaływanie dąŝy do zera przy odległości zwiększającej się do nieskończoności. Poencjał Morse a zadany jes wzorem: zaem siła dana jes przez: 2 V ( ) = D 1 ep[ b ( )] 1, (64) 0 F ) = V '( ) = 2 b D ep[ b ( )] 1 ep[ b ( )], (65) ( 0 0 gdzie: D oznacza głębokość sudni poencjału, odległość między cząskami, 0 punk równowagi, a b jes zdefiniowane jako: k b =, (66) 2 D gdzie k sała siłowa wiązania. Wyk. 1. Wykres poencjału Morse a. Dane do wykresu: D=1, k=1, 0 =2, b=0.7 37

Wyk. 2. Wykres siły. Dane jak w wyk. 1 Począkowo cząski w modelu ułoŝone są w sześcian. Po chwili siły, z jakimi na siebie działają formują je w pulsującą kulę. Powsały wór moŝna próbować bombardować cząską i esować czy da się w en sposób wybić jedną z molekuł układu. Syuacja aka symulowana jes za pomocą obieku klasy Morse. Na lisingu 12 przedsawiony jes konsrukor klasy modelującej powyŝej opisany układ. Lising 12. Konsrukor klasy Morse. emplae<class ype> Morse<ype>::Morse(algorihms alg, ype D, ype k, ype 0) : ZbPkMa<ype>(28) Se(ALG, alg); DephWellConsan = D; BondForceConsan = k; EquilibriumBondConsan = 0; ype inc = 0.5; in inde = 0; for(in k = 0; k < 3; k++) for(in i = 0; i < 3; i++) for(in j = 0; j < 3; j++) Se(CURR_POS, inde, inc*j, inc*i, inc*k); Se(PREV_POS, inde, inc*j, inc*i, inc*k); Se(MASS, inde, 1.0); inde++; //cube //bulle Se(CURR_POS, Coun()-1, -10, 0.0, 0.0); Se(PREV_POS, Coun()-1, -10, 0.0, 0.0); Se(MASS, Coun()-1, 1.0); Argumenami konsrukora poza określeniem meody numerycznej, są akie wielkości jak głębokość sudni poencjału (domyślnie usawiona na warość 1.0), sała wiązania międzycząseczkowego (domyślnie 0.5) oraz odległość między punkami, dla kórej poencjał 38

przyjmuje warość minimalną (domyślnie 0.5). Siła działająca na kaŝdą z cząsek układu obliczana jes na podsawie wzoru (65) przez funkcję z lisingu 13. Lising 13. Funkcja obliczająca siły działające na cząski w klasie Morse emplae<class ype> void Morse<ype>::CalculaeForces() cons ype D = DephWellConsan; cons ype b = sqr(bondforceconsan / (2.0*DephWellConsan)); cons ype r0 = EquilibriumBondConsan; cons ype dwa = 2; for(in i = 0; i < Coun(); i++) if(ishanged(i)) acceleraions[i].se(0.0, 0.0, 0.0); else forces[i].se(0.0, 0.0, 0.0); for(in j = 0; j < Coun(); j++) Ge(CURR_POS, j); if( i == j) coninue; Wekor<ype> mp=ge(curr_pos, i)- ype disance = mp.lengh(); ype wyr1 = ep(-b*(disance-r0)); ype wyr2 = -1 + ep(-b*(disance-r0)); forces[i] += mp.uni()*dwa*b*d*wyr1*wyr2; acceleraions[i] = forces[i] / GeMass(i); Rys. 13. Cząski oddziałujące na siebie poencjałem Morse a bombardowane pojedynczą cząską KaŜda symulacja rozpoczyna się akim samym sanem układu. Dwadzieścia siedem cząsek ułoŝonych począkowo w sześcian (po rzy cząski w linii worzącej krawędź figury) i oddalonych od siebie o 0.3 jednoski długości, jes bombardowane przez molekułę znajdującą się po lewej sronie w odległości 10 jednosek długości. Masy wszyskich punków są jednoskowe. Badana jes reakcja układu na uderzenie punkem o róŝnych prędkościach począkowych. Podczas symulacji udało się zauwaŝyć ylko dwa zachowania układu. 39

Pierwsze polegało na wciągnięciu pocisku do układu, a drugie na przepuszczeniu go z spowolnieniem lub przyspieszeniem. Wszyskie zachowania zachodziły dla akich samych domyślnych warunków brzegowych modelu, a zmieniana była ylko prędkość cząseczki bombardującej. Rys. 14. Przyspieszenie cząski i odchylenie jej oru ruchu Dla małej prędkości pocisku - 0.5 wraz z jego zbliŝaniem się do układu jes on coraz bardziej przyspieszany przez oddziaływanie z pozosałymi cząskami, nasępnie przebija się przez kulę i ucieka. Zjawisko o zachodzi akŝe dla duŝych prędkości (np. 2.0), ale wedy przyspieszanie pocisku nie jes dosrzegalne jak w powyŝszym przypadku. Dla niekórych prędkości np. 1.0 pocisk po przebiciu układu zosaje wyhamowany i zawrócony. Tworzy z pulsującą kulą układ pewnego oscylaora. Zosaje ściągany do środka obieku, prędkość nadana ym sposobem pozwala na przeunelowanie na drugą sronę i syuacja się powarza. Bombardująca cząska przenika przez układ z lewej srony na prawą i odwronie. Im dalej jes od niego prędkość saje się coraz mniejsza, aŝ do zerowej a nasępnie zawraca. 40

4. Tesy Meody numeryczne opisane w rozdziale drugim zosały przeesowane pod względem szybkości i dokładności. Pierwszym modelem uŝyym w esach były dwa punky maerialne oddziaływujące na siebie siłami harmonicznymi (sprzęŝone oscylaory). Drugim modelem było dziesięć akich punków usawionych w rzędzie (rys. 18 i 19). Rys. 18. Dwa punky maerialne połączone siłami spręŝysymi. PołoŜenie równowagi zaznaczone jes pionową kreską Rys. 19. Dziesięć punków oddziaływujących na swoich sąsiadów siłami harmonicznymi (po lewej w połoŝeniu równowagi, po prawej w ruchu) Wszyskie esy rozpoczynały się od wprawienia w ruch osaniego punku poprzez nadanie mu prędkości począkowej. W próbie kaŝdego algorymu wykonane zosało 1000 kroków czasowych o ej samej długości. Obserwowanymi wielkościami były rzeczywisy czas rwania obliczeń (ang. wall ime) oraz połoŝenie kaŝdego punku w funkcji czasu (wychylenie z połoŝenia równowagi). Wykresy ych osanich były porównywane w celu oceny zbieŝności numerycznej algorymów. Opisane powyŝej esy zosały wykonane dla dwóch ypów danych zmiennoprzecinkowych: pojedynczej i podwójnej precyzji (floa i double). Konkreny 41