Löpsedel: Icke-linjära ekvationer Ickelinjära ekvationer Beräkningsvetenskap I Varför är det svårt att lösa icke-linjära ekvationer? Iterativa metoder Bisektion/intervallhalvering Newton-Raphsons metod Noggrannhet/stoppvillkor hastighet/exekveringstid Läroboken Kap 5.1 (s 114-116), 5.4 (s 122-128), 5.6 (s.132-135) Kap 6.2 (s 144-149), 6.4 (s 151-154), 6.6 (s 157-161) Standardformulering av ickelineär ekvation: f(x) = 0 Ekvationen representeras i Matlab genom att vi definierar en Matlab-funktion som beskriver f(x) Matlabs inbyggda kommando för att lösa f(x) = 0 heter fzero fzero hittar ett nollställe per anrop Kräver startgissning eller intervall Använda fzero kräver viss kunskap om problemet och var man ska leta Plott ger ingen vettig information! Andel av en viss substans kan bara anta värden mellan 0 och 1. Ny plott: Problem för värdet 1. Visar sig att det blir division med noll 1
Exkludera 1, t ex mellan 0 och 0.8. Ny plott igen: Bättre. Här kan man se att det finns ett nollställe någonstans nära 0 Obs att det a intressanta i grafen är själva nollstället. Grafen i övrigt betyder ingenting. Nytt kommando för plottning: fplot Praktisk att använda då det man ska rita är en matematisk funktion som definieras i en Matlabfunktion, t ex funktionen func Ritas på intervallet [a b] med kommandot fplot(@func, [a b]) Man slipper använda linspace för att skapa x-axel och indelning ordnas automatiskt Ickelinjära i Matlab Skriv först på formen f(x) = 0 => problemet blir att hitta nollställe Använd fzero @func kallas för ett funktionshandtag x0 är startgissning f(x) = 0 x = fzero(@func, x0) I matlabfunktionen func finns f(x) definierad Går även att använda intervall som gissning x = fzero(@func, [a b]) Vad gör fzero? fzero bygger på en kombination av två olika grundalgoritmer: bisektionsmetoden Sekantmetoden, en variant av Newton- Raphsons metod (dessutom används invers interpolation, som vi hoppar över här) Kan datorn inte bara räkna ut lösningen...? Det finns väl formler för lösningarna? Nej!! Polynomekvationer kan bara lösas upp till grad 4 Exakt lösning i matematisk mening ger sällan siffervärden Hur beräknas egentligen 2? Tumregel: Icke-linjära problem iterativa metoder 2
Iterativ metod Iterativ metod - princip I en iterativ metod låter man x 0 vara en startgissning Man bildar sedan { x k } k=1 som en följd av approximationer till den exakta lösningen Om konvergens så är x = I praktiken kan man aldrig nå dit utan man stannar när tolerans uppfylld Hur bra kan det bli på en dator? x = startgissning x = ny gissning Ny gissning beräknas utgåe från någon formel eller princip Kan lyckas konvergens eller misslyckas divergens Hur snabbt metoden hittar lösningen - konvergenshastighet Bisektionsmetoden, idé a Idé: - Halvera intervallet - Välj som nytt intervall den del där teckenbyte finns - Upprepa m m b Etc tills intervallet tillräckligt litet Bisektionsmetoden, pseudokod Indata: Startintervall [a, b] så att f(a) och f(b) har olika tecken xl = a; xu = b xr = xl + (xu-xl)/2 if sign(f(xl))==sign(f(xr)) then xl = xr else xu = xr Newton-Raphsons, idé Från idé till formel Idé: - Hitta nollställe till tangenten i en punkt - Välj detta nollställe som ny punkt - Upprepa tills tillräckligt nära lösningen x 2 x 1 x 0 f(x) x Tangentens lutning: f (x 0 ) Tangentens lutning: (0-f(x 0 ))/(x 1 -x 0 ) (x 0, f(x 0 )) Ger: x 1 = x 0 f(x 0 )/f (x 0 ) (x 1, 0) x 0 f(x) x 3
Newton-Raphsons metod, pseudokod x = startgissning x = x f(x)/fprime(x) Tänker oss att fprime innehåller f (x), kan även beräknas numeriskt Newton-Raphsons brister Newton-Raphsons metod är snabb men... ganska mycket kan gå fel Hamnar nära eller i extrempunkt => blir 0 eller nästan 0 Svårt att förutse vilket nollställe som hittas, någon punkt hamnar på en plats så att tangenten skjuter iväg till ett annat nollställe Kan även hamna i cykliska förlopp studsar hela tiden mellan samma sekvens av värden Robustare: Bisektion + N-R Man kan visa att N-R konvergerar om startgissningen är tillräckligt nära lösningen Hur kommer man tillräckligt nära? Koppla in Bisektionsmetoden, t ex så här: 1. Bestäm ett intervall där nollstället finns 2. Kör N-R 3. Om konvergens så klart annars (N-R t ex hamnat utanför intervallet) koppla in Bisektion några steg för att minska intervallet 4. Gå till punkt 1 med nya intervallet Kombinerar N-R:s snabbhet och Bisektions säkerhet. fzero innehåller en mer sofistikerad algoritm enligt samma princip. Hittills Vilket stoppvillkor? Newton-Raphson: Man brukar använda eller där tol ges av användaren Om skillnaden mellan två steg liten bör man vara nära roten Används även som uppskattning av felet Bisektion: Stanna då intervallet < tolerans, dvs while abs(xu xa)> tol där tol ges av användaren Man vet då att felet högst är intervallets längd Som lösning x k+1 används xr xl xr xu 4
Vad händer om metoderna inte konvergerar? Det kanske inte finns något nollställe. Man hamnar i en oändlig loop eftersom stoppvillkoret aldrig uppfyllt Man brukar därför lägga till maximalt antal iterationer som stoppvillkor maxiter = 100; % t ex 100 iter = 0; while ( )&(iter < maxiter) iter = iter + 1; Kan man inte använda f(x k+1 ) < tol? Problem vid diffus skärning - Långt från - stort avstånd mellan och x k - f(x k+1 ) 0 - Långt från - stort avstånd mellan x och k - f(x k+1 ) 0 Viktigt att metoder konvergerar snabbt, mäts med konvergenskvot: lim x k+1 = C k r x k, C konstant r = 1, C<1 => linjär konvergens r = 2 => kvadratisk konvergens r = 3 => kubisk konvergens Gäller i limes, men kan ses när man närmar sig lösningen Tolkning: fel i iteration k+1 = C (fel i iteration k) r Har man felet i iteration k vet man alltså vad felet i nästa iteration blir Hur vet man felet, inte känd? Man använder uppskattning eller Test >> [x,fx,fel] = NewtonRaphson(@func1, 3); >> [x fel fel.^2] ans = 3.0000 1.0000e+000 1.0000e+000 2.3320 6.6802e-001 4.4625e-001 1.9228 4.0920e-001 1.6744e-001 1.7604 1.6237e-001 2.6363e-002 1.7346 2.5795e-002 6.6536e-004 1.7340 6.2460e-004 3.9012e-007 1.7340 3.6208e-007 1.3110e-013 Fel vid iteration k+1 är ungefär felet vid iteration k i kvadrat => kvadratisk konvergens hos Newton-Raphson Vilken konvergenskvot har Bisektion? Felet halveras varje steg, dvs Linjär konvergens med C=1/2 Detta gör att Newton-Raphson konvergerar MYCKET snabbare (Bisektion å andra sidan säkrare) 5