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