W tym rozdziale zajmiemy się ważnymi schematami rozwiązywania tzw. sztywnych układów równań różniczkowych zwyczajnych. Omówimy schematy ze zmiennym krokiem całkowania i metodę strzałów rozwiązywania zadań brzegowych.
Dość trudno jest podać precyzyjnie poprawną matematycznie definicję sztywności dla dowolnego zadania różniczkowego zwyczajnego. My przyjmiemy definicję pragmatyczną za [13]:
Równanie różniczkowe zwyczajne nazywamy sztywnym (ang. stiff), jeśli numeryczne schematy zamknięte, w szczególności metody zamknięte Adamsa, działają zdecydowanie lepiej niż schematy otwarte przybliżonego rozwiązywania zagadnień początkowych.
Oczywiście definicja nie jest do końca precyzyjna. Podamy też inne definicje sztywności (ang. stiffness) np. dla zagadnień liniowych, jakkolwiek powyższa definicja jest dla nas wygodna, ponieważ podkreśla to, że równania sztywne rozwiązujemy przy pomocy schematów zamkniętych. Za chwilę podamy kilka przykładów sztywnych równań różniczkowych, aby przekonać się, że pojawiają się one dość często w realistycznych modelach nauk przyrodniczych, por. rozdział 6.2.
W rozdziale 3.3.1 już zobaczyliśmy, że dla modelowego zadania skalarnego:
rozwiązanie uzyskane przy pomocy otwartego schematu Eulera zachowuje własności rozwiązania
Schemat zamknięty Eulera można zatem uznać za lepszy od schematu otwartego dla tego zagadnienia dla ujemnego
Załóżmy, że rozpatrujemy jednorodne liniowe równanie różniczkowe zwyczajne ze stałymi współczynnikami:
gdzie
z
Załóżmy, że wszystkie
Oznaczmy
dla
Czyli: o ile
czyli jest to warunek ograniczający dopuszczalny zakres wartości
Widzimy zatem, że otwarty schemat Eulera dla takiego równania jest zupełnie niepraktyczny
na dłuższych odcinkach czasu, ponieważ ograniczenie na
Widzimy, że dla tego typu równań schemat otwarty zachowuje się gorzej niż odpowiedni schemat zamknięty, co jest zgodne z naszą oryginalną definicją sztywności. W ogólnym przypadku, gdy wszystkie części rzeczywiste wartości własnych macierzy
Zatem definiujemy zadanie liniowe jednorodne jako sztywne, jeśli:
Tutaj
jest sztywny w obszarze
Wadą powyższej definicji sztywności jest to, że nie obejmuje np. układu skalarnego
W tym rozdziale podamy kilka przykładów równań sztywnych, por. [13].
Równanie Van der Pola opisujące oscylator z nieliniowym tłumieniem:
gdzie
Rozważmy następujące reakcje chemiczne, które symbolicznie opiszemy następująco:
co prowadzi do następującego układu równań różniczkowych zwyczajnych:
Czytelnikowi pozostawiamy sprawdzenie z pomocą octave'a, że np. schematy otwarte nie działają najlepiej dla tego problemu.
Ten przykład jest szczególnym przypadkiem dyskretyzacji równań, których metody dyskretyzacji omawiane są później dokładniej w rozdziale 14.
Rozpatrzmy równanie paraboliczne:
z warunkami brzegowymi
Dyskretyzując je względem zmiennej przestrzennej
otrzymujemy następujący układ równań różniczkowych zwyczajnych:
z
Oczekujemy, że
dla
(6.1) |
Można pokazać, że wartości własne
czyli układ jest sztywny dla dużych
Dla przykładowych dużych
Schematy zamknięte stosujemy dla zadań sztywnych.
Aby obliczyć kolejne przybliżenie
czyli w każdym kroku musimy rozwiązać układ równań:
dla funkcji
W ogólności dla zamkniętego schematu
Analogiczna sytuację widzimy dla zamkniętych schematów jednokrokowych.
Powyższe równanie (układ równań) możemy rozwiązać przy pomocy różnych metod np. metody Newtona, czy jakiejś wersji
metody iteracji prostej, zob. np. [18], [17].
Zauważmy, że w przypadku otwartego schematu Eulera
Z odpowiedniej gładkości pola wektorowego
i stała Lipschitza
Zatem jeśli dla odpowiednio małego
Postawmy kwestię -
jak dobierać startowe przybliżenie
Pierwsza opcja to: wziąć
Zastanówmy się, czy można dobrać
Istnieje możliwość, żeby za
gdzie
Wtedy widzimy, że
W takim przypadku schemat otwarty nazywamy predyktorem,
a schemat zamknięty, który naprawdę stosujemy do rozwiązania zadania początkowego - korektorem.
Podsumowując;
nazwy schemat predyktor-korektor używa się względem schematu zamkniętego rzędu
W praktyce bierze się odpowiednie pary schematów tego samego rzędu: np. otwarty schemat Eulera za predyktor i zamknięty schemat Eulera za korektor, czy ogólniej - schemat otwarty Adamsa-Bashfordsa rzędu fsolve()
:
function [X,t]=predkoreuler(f,t0=0,x0=1,N=100,h=1.0/N) # Parametry funkcji: #f - wskaznik do pola wektorowego - funkcji dwóch argumentów f(x,t) # przy czym x0 - wektor pionowy dlugosc M; # przyklad definicji wskaznika do prostego pola wekt.: f=@(x,t) -x; #t0 - czas początkowy #h - stały krok dla schematu Eulera #N - ilość kroku schematu #Funkcja zwraca macierz X wymiaru (N+1)xM długości N+1 taka ze #X(k,:) jest przybliżeniem rozwiazania w punkcie czasu t0+(k-1)*h #oraz wektor t dlugosci N+1 z dyskretnymi punktami czasowymi global xx hh tt hh=h; M=length(x0); X=zeros(N+1,M); t=zeros(N+1,1); xx=X(1,:)=x0; tt=t(1)=t0; for k=2:N+1, xp=xx+h*f(xx,tt); #predyktor g=@(x) x - hh*f(x,tt) - xx; #funkcja pomocnicza dla zamkniętego schematu Eulera X(k,:)=xx=fsolve(g,xp); #rozwiązujemy równanie - korektor tt+=hh; t(k)=tt; endfor endfunction
Stałe w twierdzeniach o zbieżności schematów są znacznie zawyżone i dobór kroku całkowania w oparciu o szacowania z tych twierdzeń jest niepraktyczny. Czy można jakoś oszacować błąd na bieżąco i zmieniać krok całkowania w zależności od tych oszacowań?
Załóżmy, że chcemy użyć konkretnego schematu jednokrokowego rzędu
dla
Wtedy
Postępując podobnie jak w ekstrapolacji Richardsona, jeśli odejmiemy stronami te równości to otrzymamy:
czyli otrzymujemy:
dla
Otrzymaliśmy w ten sposób estymator błędu.
Jeśli chcemy otrzymać błąd na poziomie
to możemy wyliczyć
otrzymujemy
(6.2) |
Następnie możemy zastosować ten schemat z krokiem
Oczywiście adapatacyjną zmianę kroku całkowania (ang. adaptive step control) można stosować i do zwiększania kroku w celu obniżania kosztu obliczeń.
To znaczy, że jeśli
Oczywiście zamiast połowienia kroku możemy obliczać
Można też, zamiast stosowania tego samego schematu dwa razy z krokiem
Metoda strzałów (ang. shooting method) służy rozwiązywaniu zadań brzegowych. Rozpatrujemy w tym przypadku równanie różniczkowe zwyczajne, w którym
część warunków początkowych zastępujemy liniowymi lub nieliniowymi warunkami brzegowymi, tzn.
szukamy funkcji klasy
(6.3) | |||||
dla
Proszę zauważyć, że ogólnie takie zadanie nie musi mieć rozwiązania nawet w prostym przypadku np.
Rozwiązanie ogólne tego równania to
Jeśli istnieje rozwiązanie zadania brzegowego (6.3), to oczywiście jest to szczególny przypadek rozwiązania zadania początkowego (dla pewnej wartości
(6.4) | |||||
Dodatkowo wiemy, że jeśli
Jeśli istnieje rozwiązanie (6.3), to dla pewnego
Do rozwiązania tego układu możemy zastosować jakąś metodę rozwiązywania układów równań nieliniowych, np. metodę bisekcji (o ile zadanie jest skalarne), czy metodę Newtona lub iteracji prostych, por. np. [18].
Można się spytać: jak obliczyć wartość
Zwykle nie znamy rozwiązań ogólnych tego równania, więc musimy zastosować jakiś schemat rozwiązywania zadania początkowego.
Dla przykładu zastosowaliśmy metodę strzałów do rozwiązania zadania:
Wykorzystaliśmy metodę rozwiązywania równań zwyczajnych w octave lsode()
,
w połączeniu z funkcją octave'a rozwiązywania równań nieliniowych fsolve()
.
Otrzymaliśmy, że
dla
Niestety metoda strzałów w wielu przypadkach może być bardzo niestabilna. Rozpatrzmy bardzo proste liniowe zadanie: lsode()
,
daje rozwiązanie przybliżone, dla którego błąd w
Rozpatrzmy następujące zadanie brzegowe:
dla
Pokaż, że to zadanie ma jednoznaczne rozwiązanie dla stałego współczynnika
Przy założeniu, że współczynnik
Pokaż, że jeśli znamy rozwiązania zadania początkowego
dla różnych
Rozpatrzmy następujące zadanie brzegowe:
dla
Zaimplementuj w octave metodę rozwiązywania zadania brzegowego
metodą strzałów korzystając z rozwiązania poprzedniego zadania.
W szczególności przetestuj dla
Rozwiąż na odcinku lsode()
zadanie początkowe dla tego równania
z dwoma różnymi warunkami początkowym
Bazując na otwartym schemacie Eulera zaimplementuj w octave
schemat z adaptacyjnym krokiem całkowania korzystający ze wzoru (6.2)
w rozdziale 6.4.
Następnie dla równania
Wyprowadź wzór analogiczny do (6.2) w rozdziale 6.4
dla schematu drugiego rzędu obliczając
Udowodnij, że macierz
Nieujemną określoność najprościej udowodnić z twierdzenia Gerszgorina, por. [17]. A nieosobliwość macierzy - wprost zakładając, że istnieje niezerowy wektor w jądrze macierzy i dochodząc do sprzeczności.
Zaimplementuj w octave schemat predyktor-korektor biorąc za korektor
schemat trapezów rzędu dwa, a za predyktor schemat Heuna. Do rozwiązywania nieliniowego układu równań zastosuj
funkcję octave'a fsolve()
. Przetestuj rząd takiego schematu metodą połowionego kroku, jak opisano w rozdziale 5.4, dla równania lsode()
.
Zaimplementuj w octave schemat predyktor-korektor biorąc za korektor zamknięty schemat Eulera, a za predyktor otwarty schemat Eulera. Do rozwiązywania nieliniowego układu równań zastosuj swoje metody rozwiązywania równań nieliniowych tzn.:
metodę iteracji prostych, jak opisano w rozdziale 6.3,
wielowymiarową metodę Newtona.
Przetestuj rząd takiego schematu metodą połowionego kroku, jak opisano w rozdziale 5.4, dla równania lsode()
. Porównaj czas i ilość iteracji potrzebne do wyliczenia
Metoda Newtona rozwiązywania y=A \ b
.
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.