W tym rozdziale przedstawimy idee metody różnic skończonych na dwóch modelowych przykładach. Ze wszystkich metod przybliżonego rozwiązywania równań różniczkowych cząstkowych metoda ta wydaje się najbardziej intuicyjna w konstrukcji.
W klasycznym sformułowaniu danego równania różniczkowego zamiast pochodnych rozpatrujemy ich przybliżenia. Na zadanej siatce rozpatrujemy przybliżenia pochodnych za pomocą różnic skończonych, czyli ilorazów różnicowych.
7.1. Modelowe zadanie jednowymiarowe
Rozpatrzmy następujące zagadnienie brzegowe:
|
Lux=-u′′x+cux | = | fxx∈Ω=a,b, |
| (7.1) |
|
ua | = | α, |
|
|
ub | = | β |
|
dla nieujemnej stałej c, ustalonego odcinka a,b i znanych wartości α,β.
Na podstawie tego modelowego zadania opiszemy ideę metody różnic skończonych (MRS).
Przyjmijmy następujące oznaczenia na różnicę skończoną w przód (ang. forward finite difference)
i różnicę skończoną w tył (ang. backward finite difference) :
|
∂hux=h-1ux+h-ux, | | |
| (7.2) |
|
∂¯hux=h-1ux-ux-h. | | |
|
dla h>0. Będziemy często opuszczali dolny indeks h, jeśli h będzie ustalone.
Dla ustalonego kroku h>0 rozważmy następującą aproksymację drugiej pochodnej:
|
∂∂¯hux=∂∂¯ux=∂¯∂ux=ux-h-2ux+ux+hh2. |
| (7.3) |
Nietrudno zauważyć, że jeśli funkcja u jest klasy C4 w otoczeniu x to:
|
u′′x=∂∂¯ux+Oh2. |
| (7.4) |
co pozostawiamy jako zadanie, zob. ćwiczenie 7.1.
Wprowadzając siatkę (ang. mesh), czyli zbiór dyskretny dla h=b-a/N :
z Ωh=a+k*hk=1N-1
i ∂Ωh=a+k*hk=0,N=a,b,
możemy zdefiniować następujące zadanie dyskretne:
znaleźć uh funkcję określoną na siatce Ω¯h taką, że
|
-∂∂¯uhx+cuhx=fxx∈Ωh | | |
| (7.5) |
|
ux=gxx∈∂Ωh | | |
| (7.6) |
Przyjmujemy, że g:∂Ω→R przyjmuje wartości ga=α i gb=β.
Możemy przypuszczać, że uh będzie aproksymowało w jakimś sensie u rozwiązanie zadania wyjściowego w punktach siatki.
Jak porównać uh określone na zbiorze dyskretnym z u określonym
na całym domknięciu obszaru?
Możemy porównać te funkcje w punktach siatki licząc błąd:
|
uh-rhu∞,h=maxx∈Ω¯huhx-ux |
|
dla rhu funkcji obcięcia (ang. restriction) określonej na siatce, przyjmującej wartości u w punktach siatki,
ale możemy też badać dyskretną normę Euklidesową Lh2, czyli pierwiastek z sumy kwadratów błędów w punktach siatki przeskalowanych przez h:
|
uh-rhu0,h=h∑k=0Nuhxk-uxk2 |
|
dla xk=a+k*h.
Popatrzmy na wykres rozwiązania zadania dyskretnego dla c=0,a=0,b=π i fx=sinx,
dla którego rozwiązaniem jest ux=sinx
dla sześciu punktów i dla dwudziestu punktów, por. rysunki 7.1 i 7.2.
Widać, że dla dwudziestu punktów siatki rozwiązanie przybliżone pokrywa się
z rozwiązaniem dokładnym w punktach siatki.
Będziemy badać błąd w normach ∥⋅∥∞,h i
∥⋅∥0,h dla połowionych kroków, tzn. dla 2-kh0
dla ustalonego h0=π/10. Wyniki w tabeli 7.1 sugerują, że błędy dyskretne w obu normach są rzędu dwa, tzn. że rhu-uh∞,h=Oh2 i rhu-uh0,h=Oh2. W kolejnych rozdziałach wyjaśnimy dlaczego tak jest.
Jak się okaże wyniki eksperymentu są zgodne z oszacowaniami otrzymanymi teoretycznie.
|
Neh∞,heh∞,h/e2h∞,2heh0,heh0,h/e2h0,2h108.265e-031.036e-02202.059e-034.01e+002.580e-034.01e+00405.142e-044.00e+006.445e-044.00e+00801.285e-044.00e+001.611e-044.00e+001603.213e-054.00e+004.027e-054.00e+003208.032e-064.00e+001.007e-054.00e+006402.008e-064.00e+002.517e-064.00e+0012805.020e-074.00e+006.292e-074.00e+0025601.255e-074.00e+001.573e-074.00e+0051203.138e-084.00e+003.933e-084.00e+00 |
|
Tabela 7.1.
Badanie błędu dyskretnego dla dyskretyzacji różnicami skończonymi zadania -u′′=sinx dla x∈0,π z u0=uπ=0 dla którego znamy rozwiązanie ux=sinx.
W kolumnie drugiej podajemy normę błędu eh=rhu-uh w dyskretnej normie maksimum, a w kolumnie czwartej w dyskretnej normie L2. W kolumnach
trzeciej i piątej podajemy stosunek odpowiedniej normy błędu dla danego h względem normy błędu dla 2*h.
Przyjmując oznaczenie uk=uhxk=uha+k*h otrzymujemy następujący układ równań liniowych:
|
u0=ga,1h2-uk-1+2*uk-uk-1+c*uk=fxk=fkk=1,…,N-1,uN=gb. |
|
Wstawiając u0=ga i uN=gb do układu równań otrzymujemy następujący układ równań:
|
1h22+c*h2-10⋯0-12+c*h2-1⋮0⋱⋱⋱⋮-12+c*h2-10⋯0-12+c*h2u1u2⋮uN-2uN-1=f1+1h2gau2⋮uN-2uN-1+1h2gb, |
| (7.7) |
czyli układ z macierzą trójdiagonalną, który można rozwiązać np. metodą przeganiania
(wersja rozkładu LU dla macierzy trójdiagonalnej) kosztem
ON dla N≤106, czy nawet większych N (w zależności od dostępnego komputera).
7.2. Modelowe zadanie dwuwymiarowe
W tym rozdziale rozpatrzymy modelowe zadanie eliptyczne dwuwymiarowe na kwadracie jednostkowym
Ω¯=0,12.
Zadanie polega na
znalezieniu u∈C2Ω∩CΩ¯ takiego, że
|
Lux=-△ux+cux | = | fxx∈Ω |
| (7.8) |
|
us=gss∈∂Ω, | | |
|
gdzie △u=∑k=12∂2u∂xk2, c jest ustaloną nieujemną stałą, f - to funkcja ciągła na Ω, a g - to funkcja ciągła na ∂Ω. Zakładamy, że istnieje jednoznaczne rozwiązanie (7.8).
Dla ustalonego kroku h>0 rozważmy następującą aproksymację drugiej pochodnej cząstkowej (por. (7.3)):
|
∂∂¯k,hux=∂∂¯kux=∂¯∂kux=ux-he→k-2ux+ux+he→kh2.k=1,2, |
| (7.9) |
gdzie e→k jest k-tym wersorem.
Wprowadzamy siatkę (zbiór dyskretny) dla h=1/N:
i jej odpowiednie podzbiory
Ωh=k*h,l*hk,l=1N-1⊂Ω
i ∂Ωh=k*h,l*hk,l=0,N⊂∂Ω.
Definiujemy następujące zadanie dyskretne: chcemy
znaleźć uh funkcję określoną na siatce Ω¯h taką, że
|
-∑k=1,2∂∂¯kuhx+cuhx=fxx∈Ωh,ux=gxx∈∂Ωh |
| (7.11) |
Tak, jak w przypadku jednowymiarowym, możemy porównywać błąd w punktach siatki w dyskretnej normie maksimum:
|
uh-rhu∞,h=maxx∈Ω¯huhx-ux |
|
dla rhu zdefiniowanego analogicznie, tzn. funkcji określonej na siatce przyjmującej wartości u w punktach siatki lub
w dyskretnej normie Lh2:
|
uh-rhu0,h=h2∑k,l=0Nuhxk,l-uxk,l2 |
|
dla xk,l=k*h,l*h.
|
Nzh∞,hzh∞,h/zh∞,2hzh0,hzh0,h/zh0,2h105.211e-052.789e-05201.317e-053.96e+007.011e-063.98e+00403.298e-063.99e+001.755e-063.99e+00808.254e-074.00e+004.389e-074.00e+001602.064e-074.00e+001.097e-074.00e+00 |
|
Tabela 7.2.
Badanie błędu dyskretnego dla dyskretyzacji różnicami skończonymi dwuwymiarowego zadania -△u=2*sinx*cosx na x∈0,12, dla którego znamy rozwiązanie ux=sinxcosx z odpowiednim warunkiem brzegowym Dirichleta na ∂Ω.
W kolumnie drugiej podajemy normę błędu zh=rhu-uh w dyskretnej normie maksimum, a w kolumnie czwartej w dyskretnej normie L2. W kolumnach
trzeciej i piątej podajemy stosunek odpowiednich norm dla danego h względem normy błędu dla 2*h.
W Tabeli 7.2 podane są wyniki obliczeń dla dyskretyzacji (7.11)
zadania (7.8) z c=0 ze znanym rozwiązaniem ux=sinxcosx i odpowiednio dobranymi fx,y=2sinxcosx i gx,y=ux,y dla x na brzegu kwadratu.
Stosunki norm dyskretnych dla danego h względem błędu dla 2*h sugerują, że w tym przypadku widzimy
rząd zbieżności kwadratowej w obu normach, tzn.
że rhu-uh∞,h=Oh2 i rhu-uh0,h=Oh2, tak samo jak w przypadku jednowymiarowym. Oczywiście obliczenia czyli rozwiązywanie odpowiedniego układu równań liniowych
jest teraz bardziej kosztowne, jako że np. dla N=160 czyli h=1/160, otrzymujemy układ równań liniowych z
M=1592=25281 niewiadomymi i z macierzą o M2=6.3912*108 elementach. Jednak macierz jest pasmowa - o paśmie szerokości N-1 i o około 4*M, czyli ma 105 niezerowych elementów.
Zatem możemy jeszcze zastosować specjalne, bezpośrednie metody rozwiązywania układów równań liniowych, takie jak
odpowiednia wersja rozkładu LU, por. np. [9], czy - jeśli trzymamy tę macierz w formacie rzadkim, np. spakowanych kolumn, czy wierszy - to możemy zastosować jakąś bezpośrednią metodę dla macierzy rzadkich, np. metodę frontalną, por. [8].
Warto zauważyć, że w tym szczególnym przypadku obszaru Ω=0,12 znamy wartości i wektory własne tej macierzy i możemy zastosować specjalne metody rozwiązywania tego układu równań z wykorzystaniem algorytmu szybkiej transformaty Fouriera (FFT) (ang. Fast Fourier Transform), por. [10].
Moglibyśmy też rozważyć siatkę Ω¯h z różnymi rozmiarami hk k=1,2 względem obu osi tzn.:
|
Ω¯h=k*h1,l*h2k=0,…,N;l=0,…,M |
|
dla h1=1/N i h2=1/M
i jej odpowiednie podzbiory
Ωh=Ω¯h∩Ω
i ∂Ωh=Ω¯h∩∂Ω.
Wtedy oczywiście otrzymalibyśmy trochę inny układ równań, ale generalnie o tych samych właściwościach.
7.2.1. Warunki brzegowe dla obszaru o skomplikowanej geometrii
Zauważmy, że dla obszaru Ω¯=0,12 możemy tak dobrać kroki siatki, aby
otrzymać w sposób naturalny punkty siatki leżące na ∂Ω. W przypadku obszarów o bardziej skomplikowanej geometrii, które nie są prostokątami, czy sumami prostokątów, często nie ma takiej możliwości. Taka sytuacja ma miejsce np. gdy Ω jest kołem.
Dla dowolnego Ω i naszej aproksymacji różnicowej Laplasjanu wprowadzamy pomocniczą siatkę na R2 postaci
Sh=x→0+k*h1,l*h2k,l∈Z dla x0 ustalonego punktu i h1,h2 dodatnich kroków.
Dla x∈Sh i naszego operatora różnicowego Lhuhx=-∑k=1,2∂∂¯kuhx+cuhx
definiujemy otoczenie siatkowe (ang. mesh neighborhood) punktu x jako podzbiór Sh
taki, aby Lhuhx było zdefiniowane poprzez wartości uh w Nhx,
czyli w tym przypadku otoczenie siatkowe Nhx zawiera dany punkt x i
cztery sąsiednie punkty leżące na pionowej i poziomej prostej przechodzącej przez
x tzn.
Nh(x)={x,x+h1*e→1,x-h1*e→1,x+h2*e→2,x-h2*e→2,},
por. rysunek 7.4.
Wtedy definiujemy Ω¯h=Sh∩Ω¯, a
czyli
złożoną z takich punktów Ω, że ten punkt i sąsiednie punkty na osiach siatki należą do Ω.
Wtedy
∂Ωh=Ω¯h∖Ωh,
por. rysunek 7.3.
(W przypadku bardziej skomplikowanych operatorów definicja Nhx
może być inna, a zatem i definicja Ωh może być inna).
Następnie będziemy szukali funkcji zdefiniowanej na tej siatce tj. w Ω¯h=Ωh∪∂Ωh.
Zauważmy, że wtedy dla każdego x∈Ωh
|
Lhuhx=-∑k=1,2∂∂¯kuhx+cuhx=fhx=fx |
|
jest poprawnie zdefiniowany.
Pojawia się natomiast pytanie, jak postawić
warunek brzegowy Dirichleta w punktach ∂Ωh, które nie leżą na ∂Ω.
Najprostszym rozwiązaniem dla x∈∂Ωh, który leży w
Ω, jest postawienie w takim punkcie warunku:
gdzie xs∈∂Ω taki, że
odległość od x jest nie większa niż h.
Dalej postępujemy jak w przypadku obszaru prostokątnego.
Rozwiązanie wyjściowego zadania u jest określone we wszystkich punktach Ω¯h, ponieważ ∂Ωh⊂Ω¯. Operator obcięcia definiujemy tak samo, tzn.:
Dla u dostatecznie gładkiego otrzymujemy:
|
Lhrhu-fh∞,h,Ωh:=maxx∈ΩhLhrhux-fhx=Oh2 |
|
dla h=maxh1,h2 i tylko:
|
lhrhu-ghx∞,h,∂Ωh:=maxx∈∂Ωhlhrhux-ghx=Oh. |
|
jeśli ∂Ωh⊄∂Ω.
Pokazanie tego pozostawiamy jako zadanie.
Oznacza to, że dokładność schematu na rozwiązaniu wyjściowego zagadnienia różniczkowego, czyli rząd aproksymacji schematu (który formalnie zostanie zdefiniowany w kolejnym rozdziale, por. definicja 8.4) wynosi jeden.
Istnieją oczywiście metody podwyższania rzędu aproksymacji w tym przypadku poprzez odpowiednią interpolację warunków brzegowych
z brzegu obszaru na punkty siatki ∂Ωh leżące wewnątrz Ω.
7.3. Zadania
Ćwiczenie 7.1
Udowodnij, (7.4).
Ćwiczenie 7.2
Rozpatrzmy zadanie różniczkowe jednowymiarowe:
czyli równanie
(7.5), ale z warunkiem brzegowym Neumanna :
tzn. z u′a=ga i u′b=gb.
Pokaż, że jeśli cx≥c0>0
to zadanie ma jednoznaczne rozwiązanie.
Rozważmy następującą dyskretyzację na siatce Ω¯h=xkk=0,…,N
z h=b-a/N i xk=k*h:
|
Lhuhx:=-∂∂¯uhx+cuhx=fxx∈Ωh | | |
|
|
lh,auh:=∂hua=galh,buh=∂¯hub=gb | | |
|
Sprawdź, czy to zadanie dyskretne ma jednoznaczne rozwiązanie. Sformułuj je jako układ równań liniowych:
dla u→=u0,…,uNT,
znajdując macierz A i wektor prawej strony F→. Czy ta macierz jest symetryczna, czy jest nieosobliwa?
Czy jest trój-diagonalna? Jak rozwiązać powyższy układ możliwie małym kosztem?
Ćwiczenie 7.3
Rozpatrzmy zadanie i schemat z poprzedniego zadania. Zbadaj, dla jakiego możliwie dużego p lokalny błąd schematu posiada rząd p, czyli
|
maxmaxx∈ΩhLhrhux-fx,maxs∈a,blh,srhus-gs=Ohp |
|
Zakładamy dowolnie wysoką regularność rozwiązania zadania wyjściowego.
Ćwiczenie 7.4
Rozpatrzmy zadanie różniczkowe i schemat z ćwiczenia 7.2, ale z c=α=β=0. Pokaż, że zadanie nie ma jednoznacznego rozwiązania w ogólności, ale ma z dokładnością do stałej, o ile
∫abf=0. Jaki warunek musi spełniać fh, aby
zadanie dyskretne miało rozwiązanie?
Sformułuj ten schemat jako układ równań liniowych, jak w ćwiczeniu 7.2. Pokaż, że jądro macierzy A jest jednowymiarowe. Znajdź bazę jądra tej macierzy. Wykorzystując tę informację zaproponuj tanią (w sensie ilości operacji arytmetycznych) metodę znalezienia rozwiązania dyskretnego z dodatkowym warunkiem uha=0.
Ćwiczenie 7.5
Analogicznie do przypadku jednowymiarowego, biorąc xkl=k*h,l*h,
i u→=uk-1+l-1*N-1k,l=1N-1 możemy zapisać zadanie dyskretne (7.11), jako układ równań liniowych
Ahu→=f→ z macierzą Ah i wektorem prawej strony f→. Wyznacz tę macierz i ten wektor (por. (7.7) dla przypadku jednowymiarowego).
Oblicz, ile elementów różnych od zera ma ta macierz. Policz, ile operacji arytmetycznych jest potrzebnych do rozwiązania tego układu równań liniowych z zastosowaniem metody Choleskiego, czyli rozkładu A=LTL dla L macierzy dolnotrójkątnej w wersji dla macierzy pasmowych.
Ćwiczenie 7.6 (laboratoryjne)
Stwórz w octavie macierz z poprzedniego zadania dla c=0, tzn. macierz układu równań powstałego z (7.11), jako macierz pełną i rzadką (można wykorzystać funkcję octave'a sparse()
). Następnie rozwiąż ten układ dla wektora prawej strony odpowiadającego funkcji f=-△u* dla u*=x1-xy1-y.
-
Korzystając z narzędzi octave'a tic()
i toc()
sprawdź czas rozwiązywania dla różnych N np. N=20,80,320 itp. dla obu typów macierzy. Czy różnica jest znacząca?
-
Zbadaj błąd dyskretny w normie maksimum (funkcja octave'a norm(wektor,'inf')
) i w dyskretnej normie L2 (np. używając funkcji octave'a norm(x,2)
) między rozwiązaniem dokładnym u*, a rozwiązaniem dyskretnym dla N=10,20,40,80,160.
Czy eksperyment potwierdza teorię, tzn. czy dla podwojonych N (czyli połowionych h) błąd maleje czterokrotnie?
Ćwiczenie 7.7 (laboratoryjne)
Rozwiąż równanie -d2udx2+u=0 z warunkami brzegowymi u0=u20=1 na 0,20 przy pomocy metody różnic skończonych, tzn. rozwiąż zadanie (7.1) dla a=0,b=20 i cx=1 za pomocą schematu (7.5) dla N=100,200. Policz normę maksimum w punktach siatki między dokładnymi wartościami rozwiązania u*x=et-20+e-t/1+e-20
a rozwiązaniem dyskretnym uh zadania (7.5),
Porównaj z wynikami metody strzałów zastosowanej do tego zadania tj. z ćwiczeniem 6.2.
Ćwiczenie 7.8 (częściowo laboratoryjne)
Rozpatrzmy przeskalowaną macierz z (7.7) (dla c=0):
|
AN-1=2-1-12-1⋱⋱⋱-12-1-12∈RN-1,N-1 |
|
Pokaż, że jej wartości własne to λk=4*sin2k*π2*N dla k=1,…,N-1
z odpowiednimi wektorami własnymi:
x→k=sink*π*jNn=1N-1 dla k=1,…,N-1.
Oszacuj uwarunkowanie macierzy tzn. maxkλkminkλk dla N≫1.
Porównaj z wynikami otrzymanymi przy pomocy funkcji octave'a eig()
i cond()
.
Wskazówka:
Korzystamy z wzorów trygonometrycznych: sina+sinb=2*sina+b/2*cosa-b/2 oraz
cos2*a=1-2*sin2a.
Rozwiązanie:
Zauważmy, że biorąc vj,k=vkj=sink*π*jN otrzymujemy, że
v0,k=vN,k=0. Zatem wystarczy sprawdzić, czy zachodzą równania
-vj-1,k+2vj,k-vj+1,k=λkvj,k dla j=1,…,N-1.
Biorąc αk=k*π/N otrzymujemy:
|
-vj-1,k+2vj,k-vj+1,k | = | -(sin((j-1)αk)-sin((j+1)αk)+2*sin(j*αk) |
|
|
| = | -2*sinj*αk*cosαk+2*sinj*αk |
|
|
| = | 21-cosαksinj*αk=4sin2αk/2sinj*αk |
|
|
| = | 4*sin2αk/2*vj,k=4*sin2k*π2*N*vj,k=λk*vj,k. |
|
Uwarunkowanie sin2((N-1)*π)/2*N)sin2π/2*N dla dużych N dąży do
nieskończoności jak N2.