Block 5: Ickelineära ekvationer Löpsedel: Icke-lineära ekvationer Varför är det svårt att lösa ickelineära ekvationer? Iterativa metoder Bisektion/intervallhalvering Newton-Raphsons metod Noggrannhet/stoppvillkor hastighet/eekveringstid Läroboken Tillämpningseempel Kap 5. (s 4-6), 5.4 (s 22-28), 5.6 (s.32-35) Kap 6.2 (s 44-49), 6.4 (s 5-54), 6.6 (s 57-6) Standardformulering av ickelineär ekvation: f() = 0 Ekvationen representeras i Matlab genom att vi definierar en Matlabfunktion som beskriver f() Matlabs inbyggda kommando för att lösa f() = 0 heter fzero fzero hittar ett nollställe per anrop Kräver startgissning Använda fzero kräver viss kunskap om problemet och var man ska leta Plott ger ingen vettig information! Andel av ett visst kan bara anta värden mellan 0 och. Ny plott: Problem för värdet. Visar sig att det blir division med noll
Ekludera, t e 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. Ickelinjära i Matlab Skriv först på formen f() = 0 => problemet blir att hitta nollställe Använd fzero @func kallas för ett f() = 0 funktionshandtag 0 är startgissning = fzero(@func, 0) I matlabfunktionen func finns f() definierad Går även att använda intervall som gissning = fzero(@func, [ 2]) 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 Eakt lösning i matematisk mening ger sällan siffervärden Hur beräknas egentligen 2? Tumregel: Icke-linjära problem iterativa metoder Iterativ metod I en iterativ metod låter man 0 vara en startgissning Man bildar sedan { } k k som en = följd av approimationer till den eakta lösningen Om konvergens så är = I praktiken kan man aldrig nå dit utan man stannar när tolerans uppfylld Hur bra kan det bli på en dator? 2
Iterativ metod - princip Bisektionsmetoden, idé = startgissning = ny gissning Kan lyckas konvergens eller misslyckas divergens Hur snabbt metoden hittar lösningen - konvergenshastighet a m Idé: - Halvera intervallet - Välj den del där teckenbyte finns som nytt intervall - Upprepa * b Etc tills intervallet tillräckligt litet Bisektionsmetoden, pseudokod Newton-Raphsons idé Indata: Startintervall [a, b] så att f(a) och f(b) har olika tecken l = a; u = b r = l + (u-l)/2 if sign(f(l))==sign(f(r)) then l = r else u = r 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 * 2 0 f() Från idé till formel Newton-Raphsons metod, pseudokod Tangentens lutning: f ( 0 ) Tangentens lutning: (0-f( 0 ))/( - 0 ) ( 0, f( 0 )) Ger: = 0 f(0)/f (0) (, 0) f() = startgissning = f()/fprime() Tänker oss att fprime innehåller f (), kan även beräknas numeriskt 0 3
Newton-Raphsons brister Newton-Raphsons metod är snabb men... ganska mycket kan gå fel Hamnar nära eller i etrempunkt => f ( k ) 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 f ( k ) = 0 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 e så här:. Bestäm ett intervall där nollstället finns 2. Kör N-R 3. Om konvergens så klart annars (N-R t e hamnat utanför intervallet) koppla in Bisektion några steg för att minska intervallet 4. Gå till punkt med nytt intervall Kombinerar N-R:s snabbhet och Bisektions säkerhet. fzero innehåller en mer sofistikerad algoritm enligt samma princip. Hittills Vilket stoppvillkor? Man brukar använda k < tol k < tol eller där tol ges av användaren Om skillnaden mellan två steg liten bör man vara nära roten Används som uppskattning av felet Kan man inte använda f( ) < tol? Problem vid diffus skärning k + k k + k Lång från, stort avstånd mellan och k men f( ) 0 Lång från, stort avstånd mellan och k och f( ) 0 Viktigt att metoder konvergerar snabbt, mäts med konvergenskvot: lim k + = C, C konstant k r k r =, C< => 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 4
Tolkning: fel i iteration = 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 k eller k k + Test >> [,f,fel] = NewtonRaphson(@func, 3); >> [ fel fel.^2] ans = 3.0000.0000e+000.0000e+000 2.3320 6.6802e-00 4.4625e-00.9228 4.0920e-00.6744e-00.7604.6237e-00 2.6363e-002.7346 2.5795e-002 6.6536e-004.7340 6.2460e-004 3.902e-007.7340 3.6208e-007.30e-03 Fel vid iteration är ungefär felet vid iteration k i kvadrat => kvadratisk konvergens hos Newton-Raphson Vilken konvergenskvot har Bisektion? Felet halveras varje steg, dvs fel steg k + = 2 fel steg k Linjär konvergens med C=/2 Detta gör att Newton-Raphson konvergerar MYCKET snabbare (Bisektion å andra sidan säkrare) 5