Rozdziaª 7 Rozwi zywanie równa«nieliniowych W tym rozdziale zajmiemy si metodami rozwi zywania równa«nieliniowych skalarnych. Interesuje nas znalezienie zera nieliniowej funkcji f : [a, b] R: Przetestujemy kilka metod. f(x) = 0. 7.1 Funkcja octave'a fzero() Na pocz tek zapoznamy si z funkcj octave'a sªu» c do znajdowania zer równania nieliniowego, czyli fzero(). Funkcja posiada dwa wywoªania w pierwszym: x=fzero ( f, ap ) f jest wska¹nikiem (uchwytem) do funkcji function y=f ( x ) a app = (a, b) jest wektorem z dwoma liczbami lokalizuj cymi zero funkcji, tzn.»e to zero le»y pomi dzy a i b. Przetestujmy t funkcj z tym wywoªaniem na kilku prostych przykªadach: fzero (@( x ) x ^5,[ 1,2]) fzero (@( x ) x x 2,[1,2]) sqrt ( 2 ) fzero ( @sin, [ 1, 2 ] ) fzero ( @sin, [ 3, 4 ] ) pi 72
Funkcja dziaªa. Przetestujmy j w sytuacji kiedy zer mo»e by kilka np.: fzero ( " s i n ",[ 4,5]) Funkcja znalazªa pierwiastek π, ale mo»e nie zadziaªa : fzero ( " s i n ",[ 4,1]) Zwracaj c: error : fzero : not a v a l i d i n i t i a l b r a c k e t i n g Nietrudno si domy±le,»e dla tej funkcji wªa±ciwy przedziaª to taki,»e funkcja w ko«cach przyjmuje przeciwne znaki. Kolejnym mo»liwym wywoªaniem tej funkcji jest podanie ap jako liczby -przybli»enia zera: fzero (@( x ) x x 2,2) sqrt ( 2 ) fzero ( @sin, 1 ) fzero ( @sin,3) pi To wywoªanie te» dziaªa. Inn funkcj octave'a sªu» c rozwi zywaniu równa«nieliniowych jest fsolve (). Jej wywoªanie jest takie samo, jak druga wersja wywoªania funkcji fzero(), tzn. podajemy wska¹nik (uchwyt) do funkcji i liczb b d c przybli»eniem pierwiastka, np.: f s o l v e (@( x ) x x 4,2) Przetestujmy na kilku innych przykªadach: f s o l v e (@( x ) x x x 27,5) 3 f s o l v e ( @sin, 1 ) f s o l v e ( @sin,3) pi Wyniki s poprawne. Funkcja fsolve () jest bardziej ogólna od fzero(), mo»e sªu»y znajdowania zer ukªadów równa«nieliniowych, ale to wykracza poza standardowwy zakres wykªadu z Matematyki Obliczeniowej. 7.2 Metoda bisekcji Najprostsz metod znajdowania zera jest metoda bisekcji. Dla funkcji ci - gªej f - je±li f(a) f(b) < 0 - to istnieje zero pomi dzy punktami a, b. Idea metody bisekcji (poªowienia odcinka), to przyj cie za przybli»enie zera x = (a + b)/2 i sprawdzenie znaku f w x. Albo f(x) jest równe zero - wtedy otrzymali±my,»e x jest szukanym zerem. W przeciwnym razie zast pujemy jeden z ko«ców odcinka przez x - ten w którym znak warto±ci f 73
w tym ko«cu jest ten sam co dla f(x). Dalej post pujemy analogicznie z nowym odcinkiem o dªugo±ci równej poªowie poprzedniego. Poni»ej widzimy prost implementacj metody bisekcji: function x=b i s e k c j a ( f, a, b, eps=1e 4,itmax =200) #[ x]= b i s e k c j a ( f, a, b, eps=1e 4, itmax =200) #f wskaznik do f u n k c j i #a, b p o c z a t e k i koniec odcinka #eps t o l e r a n c j a met zatrzymuje s i e o i l e ( b a)<eps #itmax max i l o s c i t e r a c j i #Output : #x p r z y b l i z o n e zero #Zakladamy, ze uzytkownik poda dwa punkty a<b # w k t o r y c h f ( a ) f ( b)<0 ya=f ( a ) ; yb=f (b ) ; i t =0; x=(a+b ) / 2 ; while ( (b a>eps ) && ( i t <itmax ) ) y=f ( x ) ; i f ( sign ( y)==sign ( ya ) ) ya=y ; a=x ; else yb=y ; b=x ; end x=(a+b ) / 2 ; endwhile endfunction Przetestujmy dla kilku funkcji: b i s e k c j a (@( x ) x x 2,1,2) sqrt ( 2 ) Wynik jest poprawny. Je±li b a jest du»e to zbie»no± jest do± wolna: tic ; b i s e k c j a (@( x ) x x 2,1,1 e30) sqrt ( 2 ) ; toc Czas potrzebny do obliczenia zera wydaje si maªy, ale wyobra¹my sobie,»e musimy rozwi za kilka milionów takich równa«. Spróbujmy znale¹ zero dla funkcji bardziej skomplikowanej g(x) = x 0 exp( 0.5 t2 ) dt = 0: f=@( x ) exp( x x / 2 ) ; 74
g=@( x ) quad( f, 0, x) 1; x=b i s e k c j a ( g, 1, 2 ) g ( x ) 7.3 Metoda Newtona Kolejn bardzo wa»n metod jest metoda Newtona: x n+1 = x n f(x n )/f (x n ) n 0 poprawnie okre±lona, o ile f (x n ) 0. Zaimplementujmy w octave'ie metod Newtona. Poni»ej podajemy kod funkcji octave'a szukania zer za pomoc metody Newtona: function [ x, f v a l, info ]=newton ( f, df, x0,... epsr=1e 7, epsa=1e 9,maxit=30) #Metoda Newtona s k a l a r n a # #Input : #f f u n c t i o n handle do f u n k c j i p o s t a c i y=f ( x ), #k t o r e j zera szukamy przy czym zwracana wartosc #y to wartosc f ( x ) #d f f u n c t i o n handle do pochodnej f u n k c j i p o s t a c i #y=d f ( x ) k t o r e j zera szukamy #x s t a r t o w e p r z y b l i z e n i e # #P o z o s t a l e parametry opcjonalne #epsr = wzgledna t o l e r a n c j a #epsa bezwgledna t o l e r a n c j a #maxit maksymalna i l o s c i t e r a c j i #Output : #y p r z y b l i z e n i e zera #f v a l wartosc f ( x ) #i n f o wynik 0 z b i e z n o s c ; # 1 brak z b i e z n o s c i # p r z e k r o c z y l max i l o s c i t e r a c j i # 2 d f ( x ) zero nie mozna p o l i c z y c # k o l e j n e g o p r z y b l i z e n i a # i t e r a c j e zatrzymuja s i e j e s l i # z a c h o d z i jedna z dwu # 1/ f ( x ) > epsa + epsr f ( x0 ) 75
# l u b # 2/ i l o s c i t e r a c j i = maxit # # Przyklad : # f u n c t i o n y=f ( x ) # y=x x 2; # endfunction # # Wywolujemy : # y=newton ( @f, 2 ) # [ y, fy, i n f o ]=newton ( @f, 4, 1 e 2,1e 3) i t d fx=f ( x0 ) ; f v a l=fx ( 1 ) ; i t =0; info =0; eps =0.5 ( epsr abs ( f v a l )+epsa ) ; x=x0 ; while ( ( abs ( f v a l )>eps ) && ( i t <maxit ) ) #liczymy pochodna dfx=df ( x ) ; i f (abs ( dfx )>1e 12) x=x f v a l / dfx ; else info =2; printf ( "Pochodna df w punkcie x_%d=%g zero \n", i t, x ) ; return ; endif i t ++; fx=f ( x ) ; f v a l=fx ( 1 ) ; endwhile i f ( ( abs ( f v a l )>eps ) ) info =1; #brak z b i e z n o s c i printf ( "Brak z b i e z n o s c i! Po... %d i t e r a c j a c h f (%g) =%g>t o l=%g! \ n", i t 1,x, f v a l, eps ) ; endif endfunction Zbadajmy zbie»no± metody Newtona dla modelowej funkcji f(x) = x 2 76
4, której pierwiastkami s 2, 2. newton (@( x ) x x 4,@( x ) 2 x,4) 2 Teraz wywoªamy t funkcj ze wszystkimi zwracanymi warto±ciami: [ x, f v a l, info ]=newton (@( x ) x x 4,@( x ) 2 x, 4 ) Przetestujmy, czy metoda zbiega dla x 0 = 100: [ x, f v a l, info ]=newton (@( x ) x x 4,@( x ) 2 x, 1 0 0 ) czy dla x 0 jeszcze bardziej oddalonych od pierwiastków: [ x, f v a l, info ]=newton (@( x ) x x 4,@( x ) 2 x, 1 0 0 0 ) [ x, f v a l, info ]=newton (@( x ) x x 4,@( x ) 2 x, 0. 0 1 ) [ x, f v a l, info ]=newton (@( x ) x x 4,@( x ) 2 x, 1 e 9) [ x, f v a l, info ]=newton (@( x ) x x 4,@( x ) 2 x, 1 e6 ) W ostatnim przypadku ilo± iteracji w warunku stopu okazaªa si niewystarczaj ca. Mo»emy te» przetestowa rz d zbie»no±ci dla równania, którego rozwi - zanie znamy, np. rozpatrzmy ostatnie równanie x 2 = 4: Poni»szy kod testuje rz d zbie»no±ci metody Newtona dla dodatniego pierwiastka funkcji f(x) = x 2 4: M=6; x=4; e =0; i t =0; for k=1:m, x=x (x x 4)/(2 x ) ; i t ++; ep=e ; e=x 2; i f ( i t >1) printf ( "[%d ] e/ep=%3.4e e /( ep ep)=%3.4e \n",... i t, e/ep, e /( ep ep ) ) ; endif endfor Otrzymali±my,»e rz d zbie»no±ci dla tej funkcji jest równy dwa, co jest zgodne z teori, która mówi,»e je±li funkcja jest klasy C 2 na otoczeniu swojego pierwiastka x, oraz warto± pochodnej funkcji w pierwiastku jest ró»na od zera to metoda jest lokalnie zbie»na kwadratowo (zbie»na z rz dem równym dwa): tzn. istnieje takie ɛ > 0 i staªa C 0,»e je±li x 0 startowe 77
Rysunek 7.1: Wykresy funkcji f(x) = 2 x + sin(x) na [0, 3]. przybli»enie metody Newtona speªnia: x x 0 ɛ, to por. np. [11]. x n+1 x C x n x 2, 7.4 Odwracanie funkcji Podamy jeden przykªad zastosowania metod rozwi zywania równa«nieliniowych do znajdowania przybli»onych warto±ci funkcji odwrotnej do danej. Zaªó»my,»e potramy policzy warto±ci funkcji, i chcemy znale¹ warto±ci funkcji odwrotnej do danej funkcji, aby np. narysowa wykres funkcji odwrotnej (zakªadamy,»e na danym odcinku ona istnieje). Zazwyczaj niestety nie znamy wzoru analitycznego na funkcj odwrotn. Jak to zrobi z zastosowaniem funkcji fzero()? Gdyby chodziªo o sam wykres mo»emy zastosowa proste odbicie: x=linspace ( a, b ) ; 78
Rysunek 7.2: Wykresy funkcji odwrotnej do f(x) = 2 x + sin(x) na [0, 3]. y=f ( x ) ; plot ( x, y, " ; wykres y=f ( x ) ; " ) ; plot ( y, x, " ; wykres x=f ^{ 1}(y ) ; " ) ; Na rysunku 7.1 wida wykres f(x) = 2 x + sin(x) na [0, 3], a na rysunku 7.2 wykres funkcji do niej odwrotnej. Oczywi±cie wykres funkcji odwrotnej wygl da zgodnie z oczekiwaniami. Rozpatrzmy inn funkcje: f(x) = tan(x) na [ 1.57, 1.57] i popatrzmy na wykresy funkcji odwrotnej otrzymanej w analogiczny sposób i wykres rzeczywistej funkcji odwrotnej, której wzór analityczny w tym przypadku znamy: (tan) 1 (y) = atan(y): rysunek 7.3. Wida,»e wykres funkcji odwrotnej jest troch inny od wykresu uzyskanego naszym sposobem. Aby uzyska wykres prawidªowy powinni±my zna bardzo dokªadne przybli»enia warto±ci funkcji odwrotnej w punktach siatki. Aby obliczy warto± f 1 (y) dla konkretnego y nale»y rozwi za równanie: g(x) = y f(x) = 0, co w praktyce mo»na w sposób przybli»ony dokona przy u»yciu np. funkcji 79
Rysunek 7.3: Wykresy funkcji odwrotnej do f(x) = tan(x) na dwa sposoby. kolor zielony rzeczywisty wykres funkcji odwrotnej, kolor niebieski wykres uzyskany przez odbicie. fzero() w octave'ie. Poni»szy kod oblicza warto±ci funkcji odwrotnej do f(x) = tan(x) na siatce równomiernych punktów na [ f(1.57), f(1.57)] (korzystamy z tego,»e funkcja jest nieparzysta i obliczamy jej warto±ci tylko dla argumentów dodatnich): f=@tan ; c=f ( 1.57); d= c ; N=1000; y=linspace (0, d,n) ; x=zeros (N, 1 ) ; x (1)=0; #tan (0)=0 for k=2:n, x0=x ( k 1); g=@( x ) y ( k ) f ( x ) ; x ( k)= f s o l v e ( g, x0 ) ; 80
Rysunek 7.4: Wykresy funkcji odwrotnej do f(x) = tan(x). Wykonane na dwa sposoby. Kolor zielony - rzeczywisty wykres funkcji odwrotnej, kolor niebieski - wykres uzyskany przez odbicie. Oba wykresy si pokrywaj. endfor y=[y d y ] ; x=[ flipud ( x ) ; x ] ; plot ( y, x, " ; o b l i c z. f odwrotna ; ", y, atan ( y ), " ; atan ( y ) ; " ) pause ( 2 ) ; plot ( y, x' atan ( y ), " ; wykres bledu ; " ) Na rysunku 7.4 wida,»e wykresy funkcji odwrotnej oraz obliczonej przez nas pokrywaj si. Potwierdza to tak»e wykres bª du, por. rysunek 7.5. 81
Rysunek 7.5: Wykresy bª du obliczania funkcji odwrotnej do f(x) = tan(x). 82