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

Mathematica-Wolfram Language
Wolfram System Modeler
Informacje
Serwis