UWAGA! Używamy plików cookies, by ułatwić korzystanie z naszego serwisu. Jeśli nie chcesz, by pliki cookies były zapisywane na Twoim dysku zmień ustawienia swojej przeglądarki. Co to są pliki cookies?

Mathematica
Obliczenia równoległe

Przykłady bardziej zaawansowane Pierwiastki równania nieliniowego.

W przykładzie tym pokazane zostanie jak można równolegle liczyć pierwiastki równania. Rozwiązywane będzie rónanie nieliniowe metodą iteracyjną.

Na wstępie ważna uwaga.
Do obliczeń wykorzystywana jest funkcja FindRoot[...], która w istocie swego algorytmu ma zapisaną pracę sekwencyjną. Ilgorytmy iteracyjne wykorzystują wynik w danym kroku jako dane wejściowe w kroku następnym. Dlatego polecenie ParallelEvaluate[FindRoot[...]] zakończy się komunikatem, że praca procedury FindRoot[...] nie może być zrównoleglona i obliczenia wykonane zostaną sekwencyjnie.

W przykładzie tym nie chodzi o zrównoleglanie pracy procedury FindRoot[...], ale o równoległe obliczanie setek wywołań tej procedury dla róznych punktów startowych.

Równanie ma postać:



Poniżej zamieszczono wykres obu funkcji, aby pokazać, że problem nie sprowadza się do pojedynczego zastosowania funkcji FindRoot[...], ale do jej wielokrotnego użycia.



Pierwszym argumentem funkcji FindRoot[...] jest odpowiedni zapis równania, które ma być rozwiązywane, drugi punkt startowy iteracji.



Do znalezienia wszystkich miejsc zerowych w określonym przedziale zastosowana została funkcja Map[...], która jak podano na wsześniejszej stronie stosuje określony przepis postępowania do elementów listy. W naszym przypadku listą jest wykaz punktów startowych a operacją, która ma być zastosowana do elementów tej listy jest realizacja obliczeń za pomocą funkcji FindRoot[...]. Punkty startowe zostały wygenerowane w przedziale od 0 do 5Pi z krokiem 0.01. Trochę zbyt gęsto, ale chodziło o to aby wymusić dużą liczbę obliczeń. W wyniku rozwiązania będą się powielać dla różnych punktów startowych, ale nie o to chodzi w tym miejscu. Struktura Map[FindRoot[...]] wyznacza wszystkie rozwiazania w zadanym przedziale. Dzięki funkcji Map[...] następuje wielokrotne wywiołanie procedury iteracyjnego poszukiwania rozwiazania. Tak postawiony problem jest idealnym dla algorytmu obliczeń równoległych. Wystarczy Map[...] zamienić na ParallelMap[...].



Wykres z zaznaczonymi puntami, których wspęłrzędne x są rozwiązaniami rozpatrywanego równania pokazano poniżej.



W przykładzie tym ponad 1500 razy była wywoływana procedura FindRoot[...]. Nie został tutaj pokazany przepis jak zrównoleglić pracę algorytmu iteracyjnego, bo już w samym tym określeniu tkwi sprzeczość, ale pokazano jak równolegle policzyć ponad 1500 procesów iteracyjnych, każdy będący niepodzielnym algorytmem sekwencyjnym.

Wyświetlony czas obliczeń pokazuje korzyść z zastosowania obliczeń równoległych, gdyż uległ on skróceniu z ok.3.36 sekundy do 2.39.