Teoria, ważna i potrzebna

Transkrypt

Teoria, ważna i potrzebna
Metody numeryczne
Laboratorium 10 – Rozwiązywanie układów równań nieliniowych
Metody rozwiązywania układów równań nieliniowych
Rozważamy układ równań postaci:
f 1( x1, x 2, ... , x m )=0
f 2 (x1, x 2, ... , x m )=0
⋮
f m ( x 1, x 2, ... , x m )=0
gdzie funkcje f i :ℝm →ℝ dla i=1,2 ,3 ,…, m są funkcjami o wartościach rzeczywistych. Mamy
więc m funkcji, z których każda zawiera m zmiennych (z przestrzeni m-wymiarowej). Funkcjom
przyporządkowane są wartości rzeczywiste.
Zapis układu w postaci macierzowej: F(X)=0 gdzie:
[] [ ]
x1
X = x2 ,
⋮
xm
f 1( X )
F( X)= f 2 ( X ) , czyli
⋮
f m (X )
[
] []
f 1 ( x 1, x 2, ... , x m )
F( X)= f 2 ( x 1, x 2, ... , x m ) ,
⋮
f m (x 1, x 2, ... , xm )
0
0= 0
⋮
0
Metoda Newtona
Metoda Newtona jest metodą iteracyjną. Będziemy liczyć kolejne przybliżenia wektora X.
k-te przybliżenie wektora X oznaczymy:
[]
x k1
k
k
X = x2
⋮
x km
Zakładamy, że znamy pierwsze przybliżenie (k=0) czyli znamy X0.
X0 jest intuicyjnie przyjętym przybliżeniem początkowym.
Wektor niewiadomych dla kolejnego przybliżenia Xk+1 wynosi: X k +1=X k + Δ X k
Xk jest znane, z wcześniejszej iteracji, pierwsze Xk jest przyjętym przybliżeniem początkowym.
ΔXk wynosi:
k
k −1
k
Δ X =−W ( X ) ⋅F ( X ) , gdzie W(Xk) to macierz Jacobiego obliczona w k-tym kroku:
[ ]
δf1
δ x1
δf2
W ( X)= δ x 1
...
δfm
δ x1
δf1
δ x2
δf2
δ x2
...
δfm
δ x2
δf1
δ xm
δf2
...
δ xm
... ...
δfm
...
δ xm
...
Jest to macierz pochodnych cząstkowych. Pierwszy wiersz to pochodne cząstkowe pierwszej dla
funkcji, drugie wiersz to pochodne cząstkowe drugiej funkcji … Poszczególne kolumny macierzy
W(X) to pochodne po kolejnych zmiennych.
Przykład
Rozwiązać metodą Newtona następujący układ równań:
2xy 2−3x2 y=2
x 2 y 3 +2xy=12
Definiujemy funkcje:
2
2
f 1 ( x , y)=2xy −3x y=2
f 2( x , y )=x 2 y 3 +2xy=12
Obliczmy pochodne cząstkowe:
δf1
δf1
=2y 2−6xy ,
=4xy−3x 2
δx
δy
δf2
δf2
=2xy 3 +2y ,
=3x 2 y 2 +2x
δx
δy
Tworzymy macierz Jacobiego:
[
W ( X)=
2y 2−6xy 4xy −3x2
2xy 3 +2y 3x 2 y 2 +2x
]
Przyjmujemy przybliżenie początkowe:
X0= 2
3
na podstawie którego obliczamy F(X0) i W(X0).
[]
[
][ ]
[
f 1 (2, 3)
= −2 ,
W ( X 0 )= −18 12
114 112
f 2 (2, 3) 108
Tak więc dla k=0 otrzymujemy:
F( X 0 )=
][ ] [ ]
[
−18 12 ⋅ Δ x 1 = −2
114 112 Δ x 2 108
⇒
]
[ ][
−1
][ ][
Δ x1 −18 12
=
⋅ −2 = −0.4456
114 112
108 −0.5017
Δ x2
]
Pozwala nam to obliczyć rozwiązanie dla pierwszego kroku (k=1):
1
X=
[
x10+ Δ x10
][
= 1.5543
2.4982
x +Δ x
0
2
0
2
]
Podczas kolejnej iteracji obliczamy F(X1) oraz W(X1):
[
F( X 1)=
][
]
f 1 (1.5543 ,2.4982) −0.7055
=
,
33.4388
f 2 (1.5543 ,2.4982)
[
W ( X 1 )= −10.8169 8.2846
53.4688 50.2351
na podstawie których obliczamy Δ X 1 =−W ( X 1 )−1⋅F ( X 1) a następnie
]
X 2 = X 1+ Δ X 1
Analogicznie realizujemy kolejne iteracje aż osiągniemy ustaloną dokładność, którą możemy sobie
oznaczyć jako suma wartości bezwzględnej z funkcji fi (dla i=1,2,...,m) przy znalezionym w k-tym
kroku wektorze Xk:
m
dokladnosc=∑∣f i (X k )∣
i=1
Wartość dokładności przy zbieżnym procesie iteracji dąży do zera.
Częściowe wyprowadzenie wzoru na kolejne iteracje
Mamy dany zapis układu w postaci macierzowej: F(X)=0 gdzie:
[] [ ]
x1
X = x2 ,
⋮
xm
f 1( X )
F( X)= f 2 ( X ) ,
⋮
f m (X )
czyli
[
] []
f 1 ( x 1, x 2, ... , x m )
F( X)= f 2 ( x 1, x 2, ... , x m ) ,
⋮
f m (x 1, x 2, ... , xm )
0
0= 0
⋮
0
Chcąc rozwiązać taki układ równań nieliniowych tworzymy układ równań liniowych (funkcje fi
rozwijamy w szereg Taylora) postaci:
[ ] [ ][ ]
δf1
δ x1
δf2
f 2 (x 1, x 2, ... , x m)
+ δ x1
⋮
...
δfm
f m ( x 1, x 2, ..., x m ) δ x
1
f 1 (x 1, x 2, ... , x m)
δf1
δ x2
δf2
δ x2
...
δfm
δ x2
δf1 Δ x
1
δ xm
δ f 2 Δ x2
...
=0
δ xm ⋅
⋮
... ...
δfm
...
δ xm Δ xm
...
Macierz pochodnych cząstkowych nazywamy macierzą Jacobiego, oznaczamy W(X):
[ ]
δf1
δ x1
δf2
W ( X)= δ x 1
...
δfm
δ x1
δf1
δ x2
δf2
δ x2
...
δfm
δ x2
δf1
δ xm
δf2
...
δ xm
... ...
δfm
...
δ xm
...
Cały układ równań zapiszemy w postaci macierzowej dla kroku k:
k
k
k
F( X )+ W (X )⋅Δ X =0,
gdzie Δ X
k
to wektor niewiadomych w dla kroku k
przekształcamy aby wyznaczyć Δ X k :
F (X k )+W (X k )⋅Δ X k =0
W (X k )⋅Δ X k =−F( X k )
W ( X k )−1⋅W (X k )⋅Δ X k =−W ( X k )−1⋅F ( X k )
Δ X k =−W (X k )−1⋅F( X k )
Czyli ostatecznie wartość zmiany do obliczenia kolejnego przybliżenia wynosi:
Δ X k =−W ( X k )−1⋅F ( X k )
Wektor niewiadomych dla kolejnego przybliżenia Xk+1 wynosi: X k +1=X k + Δ X k
Mamy więc wzór do obliczenia ciągu kolejnych przybliżeń.
Kod dla danych przykładowych
%% usuwamy zmiene z pamieci, dobry nawyk
clear;
%% wprowadzmy zadane funkcje, tutaj dwie funkcje dwoch zmiennych
f1=@(x,y) 2*x*y^2-3*x^2*y-2;
f2=@(x,y) x^2*y^3+2*x*y-12;
%% funkcje pochodnych czastkowych do macerzy W,
%% pochodne czastkowe po obu funkcjach, po obu zmiennych
%% w kolejnych wierszach pochodne kolejnych funkcji
%% w kolejnych kolumnach pochodne po kolejnych zmiennych
w11=@(x,y) 2*y^2-6*x*y;
w12=@(x,y) 4*x*y-3*x^2;
w21=@(x,y) 2*x*y^3+2*y;
w22=@(x,y) 3*x^2*y^2+2*y;
%% ustalamy sobie przyblizenie poczatkowe
X=[3; 2];
if (f1(X(1),X(2))==0 && f2(X(1),X(2))==0)
disp('Rozwiazanie znalezione');
return;
end
F=zeros(2,1);
W=zeros(2,2);
dokladnosc=999;
krok=1;
while dokladnosc>0.00000001
%% ... do zrobienia samodzielnie
%% ladnie wyswietlamy wyniki
fprintf('X=[%.20f %.20f], krok: %d\n', X, krok);
krok++;
end
%% Wyniki podstawiamy do zadanych funkcji i powinna byc wartosc bliska zeru
disp('Sprawdzenie');
f1(X(1),X(2))
f2(X(1),X(2))