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.
Rozpatrzmy następujące zagadnienie brzegowe:
![]() |
![]() |
![]() |
(7.1) | ||
![]() |
![]() |
![]() |
|||
![]() |
![]() |
![]() |
dla nieujemnej stałej , ustalonego odcinka
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) :
![]() |
(7.2) | ||||
![]() |
dla . Będziemy często opuszczali dolny indeks
, jeśli
będzie ustalone.
Dla ustalonego kroku rozważmy następującą aproksymację drugiej pochodnej:
![]() |
(7.3) |
Nietrudno zauważyć, że jeśli funkcja jest klasy
w otoczeniu
to:
![]() |
(7.4) |
co pozostawiamy jako zadanie, zob. ćwiczenie 7.1.
Wprowadzając siatkę (ang. mesh), czyli zbiór dyskretny dla :
![]() |
z
i
,
możemy zdefiniować następujące zadanie dyskretne:
znaleźć
funkcję określoną na siatce
taką, że
![]() |
(7.5) | ||||
![]() |
(7.6) |
Przyjmujemy, że przyjmuje wartości
i
.
Możemy przypuszczać, że będzie aproksymowało w jakimś sensie
rozwiązanie zadania wyjściowego w punktach siatki.
Jak porównać określone na zbiorze dyskretnym z
określonym
na całym domknięciu obszaru?
Możemy porównać te funkcje w punktach siatki licząc błąd:
![]() |
dla funkcji obcięcia (ang. restriction) określonej na siatce, przyjmującej wartości
w punktach siatki,
ale możemy też badać dyskretną normę Euklidesową
, czyli pierwiastek z sumy kwadratów błędów w punktach siatki przeskalowanych przez
:
![]() |
dla .
Popatrzmy na wykres rozwiązania zadania dyskretnego dla
i
,
dla którego rozwiązaniem jest
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 i
dla połowionych kroków, tzn. dla
dla ustalonego
. Wyniki w tabeli 7.1 sugerują, że błędy dyskretne w obu normach są rzędu dwa, tzn. że
i
. W kolejnych rozdziałach wyjaśnimy dlaczego tak jest.
Jak się okaże wyniki eksperymentu są zgodne z oszacowaniami otrzymanymi teoretycznie.
![]() |
Przyjmując oznaczenie otrzymujemy następujący układ równań liniowych:
![]() |
Wstawiając i
do układu równań otrzymujemy następujący układ równań:
![]() |
(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
dla
, czy nawet większych
(w zależności od dostępnego komputera).
W tym rozdziale rozpatrzymy modelowe zadanie eliptyczne dwuwymiarowe na kwadracie jednostkowym
.
Zadanie polega na
znalezieniu
takiego, że
![]() |
![]() |
![]() |
(7.8) | ||
![]() |
gdzie ,
jest ustaloną nieujemną stałą,
- to funkcja ciągła na
, a
- to funkcja ciągła na
. Zakładamy, że istnieje jednoznaczne rozwiązanie (7.8).
Dla ustalonego kroku rozważmy następującą aproksymację drugiej pochodnej cząstkowej (por. (7.3)):
![]() |
(7.9) |
gdzie jest
-tym wersorem.
Wprowadzamy siatkę (zbiór dyskretny) dla :
![]() |
(7.10) |
i jej odpowiednie podzbiory
i
.
Definiujemy następujące zadanie dyskretne: chcemy
znaleźć funkcję określoną na siatce
taką, że
![]() |
(7.11) |
Tak, jak w przypadku jednowymiarowym, możemy porównywać błąd w punktach siatki w dyskretnej normie maksimum:
![]() |
dla zdefiniowanego analogicznie, tzn. funkcji określonej na siatce przyjmującej wartości
w punktach siatki lub
w dyskretnej normie
:
![]() |
dla .
![]() |
W Tabeli 7.2 podane są wyniki obliczeń dla dyskretyzacji (7.11)
zadania (7.8) z ze znanym rozwiązaniem
i odpowiednio dobranymi
i
dla
na brzegu kwadratu.
Stosunki norm dyskretnych dla danego
względem błędu dla
sugerują, że w tym przypadku widzimy
rząd zbieżności kwadratowej w obu normach, tzn.
że
i
, 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
czyli
, otrzymujemy układ równań liniowych z
niewiadomymi i z macierzą o
elementach. Jednak macierz jest pasmowa - o paśmie szerokości
i o około
, czyli ma
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
, 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
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ę z różnymi rozmiarami
względem obu osi tzn.:
![]() |
dla i
i jej odpowiednie podzbiory
i
.
Wtedy oczywiście otrzymalibyśmy trochę inny układ równań, ale generalnie o tych samych właściwościach.
Zauważmy, że dla obszaru 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
postaci
dla
ustalonego punktu i
dodatnich kroków.
Dla
i naszego operatora różnicowego
definiujemy otoczenie siatkowe (ang. mesh neighborhood) punktu
jako podzbiór
taki, aby
było zdefiniowane poprzez wartości
w
,
czyli w tym przypadku otoczenie siatkowe
zawiera dany punkt
i
cztery sąsiednie punkty leżące na pionowej i poziomej prostej przechodzącej przez
tzn.
,
por. rysunek 7.4.
Wtedy definiujemy , a
![]() |
czyli
złożoną z takich punktów , że ten punkt i sąsiednie punkty na osiach siatki należą do
.
Wtedy
,
por. rysunek 7.3.
(W przypadku bardziej skomplikowanych operatorów definicja
może być inna, a zatem i definicja
może być inna).
Następnie będziemy szukali funkcji zdefiniowanej na tej siatce tj. w .
Zauważmy, że wtedy dla każdego
![]() |
jest poprawnie zdefiniowany.
Pojawia się natomiast pytanie, jak postawić
warunek brzegowy Dirichleta w punktach , które nie leżą na
.
Najprostszym rozwiązaniem dla
, który leży w
, jest postawienie w takim punkcie warunku:
![]() |
gdzie taki, że
odległość od
jest nie większa niż
.
Dalej postępujemy jak w przypadku obszaru prostokątnego.
Rozwiązanie wyjściowego zadania jest określone we wszystkich punktach
, ponieważ
. Operator obcięcia definiujemy tak samo, tzn.:
![]() |
Dla dostatecznie gładkiego otrzymujemy:
![]() |
dla i tylko:
![]() |
jeśli .
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 leżące wewnątrz
.
Udowodnij, (7.4).
Rozpatrzmy zadanie różniczkowe jednowymiarowe:
![]() |
czyli równanie
(7.5), ale z warunkiem brzegowym Neumanna :
tzn. z i
.
Pokaż, że jeśli
to zadanie ma jednoznaczne rozwiązanie.
Rozważmy następującą dyskretyzację na siatce
z
i
:
![]() |
||||
![]() |
Sprawdź, czy to zadanie dyskretne ma jednoznaczne rozwiązanie. Sformułuj je jako układ równań liniowych:
![]() |
dla ,
znajdując macierz
i wektor prawej strony
. 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?
Rozpatrzmy zadanie i schemat z poprzedniego zadania. Zbadaj, dla jakiego możliwie dużego lokalny błąd schematu posiada rząd
, czyli
![]() |
Zakładamy dowolnie wysoką regularność rozwiązania zadania wyjściowego.
Rozpatrzmy zadanie różniczkowe i schemat z ćwiczenia 7.2, ale z . Pokaż, że zadanie nie ma jednoznacznego rozwiązania w ogólności, ale ma z dokładnością do stałej, o ile
. Jaki warunek musi spełniać
, 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
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
.
Analogicznie do przypadku jednowymiarowego, biorąc ,
![]() |
i możemy zapisać zadanie dyskretne (7.11), jako układ równań liniowych
z macierzą
i wektorem prawej strony
. 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
dla
macierzy dolnotrójkątnej w wersji dla macierzy pasmowych.
Stwórz w octavie macierz z poprzedniego zadania dla , 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 dla
.
Korzystając z narzędzi octave'a tic()
i toc()
sprawdź czas rozwiązywania dla różnych np.
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 (np. używając funkcji octave'a
norm(x,2)
) między rozwiązaniem dokładnym , a rozwiązaniem dyskretnym dla
.
Czy eksperyment potwierdza teorię, tzn. czy dla podwojonych
(czyli połowionych
) błąd maleje czterokrotnie?
Rozwiąż równanie z warunkami brzegowymi
na
przy pomocy metody różnic skończonych, tzn. rozwiąż zadanie (7.1) dla
i
za pomocą schematu (7.5) dla
. Policz normę maksimum w punktach siatki między dokładnymi wartościami rozwiązania
a rozwiązaniem dyskretnym
zadania (7.5),
Porównaj z wynikami metody strzałów zastosowanej do tego zadania tj. z ćwiczeniem 6.2.
Rozpatrzmy przeskalowaną macierz z (7.7) (dla ):
![]() |
Pokaż, że jej wartości własne to dla
z odpowiednimi wektorami własnymi:
dla
.
Oszacuj uwarunkowanie macierzy tzn.
dla
.
Porównaj z wynikami otrzymanymi przy pomocy funkcji octave'a eig()
i cond()
.
Korzystamy z wzorów trygonometrycznych: oraz
.
Zauważmy, że biorąc otrzymujemy, że
. Zatem wystarczy sprawdzić, czy zachodzą równania
dla
.
Biorąc otrzymujemy:
![]() |
![]() |
![]() |
||
![]() |
![]() |
|||
![]() |
![]() |
|||
![]() |
![]() |
Uwarunkowanie dla dużych
dąży do
nieskończoności jak
.
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.