OH till Föreläsning 2, NumMet O, 40303 Hela GKN-boken & hela kursen! God programmeringsteknik Tänk efter före: - Definiera problemet VAD skall göras? -Bestäm algoritm och lagrings-struktur - Dela upp i små delar Skriv sedan kod - Dela upp i små delar - Bra variabelnamn -Lägg data i variabler/konstanter -Använd färdigkod/rutiner -AnvändFOR-ochWHILE-slingor! Undvik kod-upprepning! -Använd FOR då antalet upprepningar är känt. -Använd WHILE då antalet upprepningar inte är känt. - Kommentera koden medan du skriver den. - Indentera - Snygg kod oftast rätt! - Överför info mellan programdelarna som parametrar. Undvik GLOBAL. Debugga sedan koden - Debugga både delarna och helheten! -Omnågot fel envisas: Handjaga detaljerna, antag inget! - Fundera igenom vilka fel som kan uppstå. 30% av ovana programmerares programrader exekveras aldrig. När sedan programmet är färdigt skriv om det. Det är normalt först tredje versionen som blir bra. Att tänka på både vid köp och försäljningav kod!. Effektivitet -Använd färdig-debuggad kod! -Använd bra metoder/algoritmer. - Tagut onödiga beräkningar ur loopar. Förkompilera koden. Förallokera vektorer. Använd Matlabs punktnotation i stället för FOR-slinga. Tänk dock på att de allra flesta program körs färre än 0 gånger och det är den totala tiden som skall optimeras.
Grundläggande idéer: räta linjer och upprepning Approximera funktionen en liten bit med en rät linje Men olika val av linjer ger olika svar, en del är bättre än andra. Oftast, men inte alltid, blir det bättre ju kortare linjer man har. Exempel: f x y x gjord som enkelsidig f fx + h fx x h centrerad f fx + h fx h x 2h med E trunk ch med E trunk ch 2 Det fel som vi har infört genom att approximera den riktiga funktionen med en rät linje kompenserar vi sedan för genom någon form av upprepning. På så vis blir trunkeringsfelet till slut acceptabelt litet. Upprepningen hjälper oss också att se felets storlek. Upprepningen sker i form av iteration eller rekursion: Iteration T.ex. Newton-Raphson: x n+ x n fx n /f x n Rekursion T.ex. Eulers metod: { yn+ y n + hy x n,y n x n+ x n + h x n och x n+ beskriver allt bättre samma värde. y n och y n+ beskriver olika värden. y n behövs för att beräkna y n+. y n+ y n x n+ x n x n x n+ Beteckningar x betecknar exakta värdet. Det är sällan känt. x betecknar närmevärdet. Det är det vi räknar ut, vår approximation! E x max x x gränsen för absoluta felet. R x Ex x Ex x gränsen för relativa felet. E tab osäkerhet i utdata pga osäkra indata. E ber osäkerhet i utdata pga avrundade mellanresultat. E trunk osäkerhet i utdata pga kapad Taylorutveckling eller kapad iteration eller ändligt steg. E pres osäkerhet i utdata pga egen slutlig presentationsavrundning. 2
Tabellfelet, E tab Tabellfelet uppstår genom felfortplantning. Om indata är osäkra blir även resultatet osäkert: w fx,y,z,... där x x ± E x,yỹ ± E y, z z ± E z, osv w w ± E w Tabellfelet skattas med tex: Allmänna felfortplantningsformeln w f x, ỹ, z E w f x E x + f y E y + f z E z +... där derivatorna beräknas i punkten x, ỹ, z Störningsräkning dvs AFFF med numeriskt skattade derivator praktisk! w f x, ỹ, z E w f x+e x, ỹ, z f o + f x, ỹ+e y, z f o + f x, ỹ, z + E z f o +... där f o w Min-och-max-räkning Finn maximala och minimala resultatet, f max och f min, tex genom att beräkna funktionsvärdet med alla möjliga kombinationer av störda parametrar. Denna metod blir mycket arbetssam om man har många parametrar! w f max + f min /2 E w f max f min /2 Beräkningsfelet, E ber Detta fel är svårskattat. Datorn avrundar ju alla sina mellanresultat till det antal siffror den räknar med. Försök att undvika kancellation och utskiftning så minimeras beräkningsfelet. Ekvationslösning Förbehandling: Bakgrundsinformation. Grafisk teknik och uppdelning. Matematik antag x liten eller stor och förenkla, kolla tecken hos derivatan, mm Intervallhalvering. Fortsättningsmetoder: De är alla iterativa metoder: gissa x 0,förbättra enligt x n+ x n t n,fortsätttills t blir tillräckligt liten. Om t n+ /t n konstant såär konvergensen linjär. Om t n+ /t 2 n konstant såär konvergensen kvadratisk. En ekvation med en obekant Newton-Raphson t n fx n /f x n t n+ K t 2 n x Sekantmetoden t n fx n n x n fx n fx n t n+ K t n t n Fixpunktsmetoden t n+ K t n, K Ickelinjära ekvationssystem Sökt x såatt f x 0.Denendametodvilär oss är iterativ, Newtons metod: Gissa x 0. 2 Beräkna vektorn f f x n ochmatrisenj f x x n. 3 Lös ekvationssystemet J t f t n J n 4 Bättre approximation x n+ x n t n 5 Om inte t n tillräckligt liten, upprepa från punkt 2 med x n+. Ettvanligtsätt att skatta trunkeringsfelet är att titta på sistaanvända korrektionen t. Oftastär detta en grov överskattning, men om konvergensen är långsam, t n /t n > 0.5, så är det inte ens tillräckligt! Trunkeringsfelet kan då varastörre än sista korrektionen! Det är bla därför man måste titta på hurdan konvergens man har. Om den inte är som teorin säger är något fel. 3 f n
Linjära ekvationssystem a x + a 2 x 2 + a N x N b a 2 x + a 22 x 2 + a 2N x N b 2.. a N x + a N2 x 2 + a NN x N b N Ax b har en lösningom A existerar dvs om deta 0såär x A b. Annars har ekvationssytemet ingen eller oändligt antal lösningar. x 2 Normer ett mått på vektorer x 2 + x2 2 + + x2 N x max i N x i A max i N vanliga största elementet N a ij tyngsta raden j Konditionstalet, κa Illakonditionerat Känsligt för störningar. Tidsåtgång κa A A Praktisk skattning: κa R ut R in Bandmatris : T N Triangulär matris : T N 2 Full matris : T N 3 Minstakvadratmetoden Används då man har fler villkor än obekanta, dvs överbestämda ekvationssystem. Överbestämda linjära ekvationssystem Ac b där A har fler rader än kolumner. MKV löser systemet så att r 2 b Ac 2 minimeras. Löses som A T Ac A T b c A T A A T b A T A har lika många rader som kolumner. Antalet rader i A T A är detsamma som antalet kolumner i A som är detsamma som antalet obekanta parametrar. Löses i ett stegdvs direkt, inga iterationer. Kontroll: A T r 0. Överbestämda ickelinjära ekvationssystem f c 0 där f har fler komponenter än c. Löses med MKV Gauss-Newtons metod så att f 2 minimeras. Iterativ metod! Gissa c 0. 2 Beräkna vektorn f f c n ochmatrisenj f c c n. 3 Lös det överbestämda linjära ekvationssystemet J t f t n Jn T J n J T n fn 4 Bättre approximation c n+ c n t n 5 Om inte t n tillräckligt liten, upprepa från punkt 2 med c n+. 4
Interpolation Allmänt: Givet tabell x x x 2 x N y y y 2 y N Sökt yx för punkter däremellan. Polynominterpolation Naiv ansats Newtons ansats Centrerad ansats px c + c 2 x + c 3 x 2 + c 4 x 3 +... px c + c 2 x x +c 3 x x x x 2 +c 4 x x x x 2 x x 3 +... px c + c 2 x m+c 3 x m 2 + c 4 x m 3 +... Koefficienterna bestäms med px i y i vilket ger ett linjärt ekvationssystem. Med naiva ansatsen får ekvationssystemet ofta stort konditionstal. Med Newtons ansats blir ekvationssystemet lättlöst och får ofta lågt konditionstal. De olika ansatserna ger olika koefficienter men det erhållna polynomet är detsamma. Vid höga gradtal uppträder Runges fenomen. E trunk skattas genom att göra beräkningar med olika gradtal på polynomet. Styckvis interpolation Grundidé: Lägg ett nytt polynom i varje intervall [x i,x i+ ]. Linjär IP: Förstagradspolynom. Behöver y i varje punkt x i.drarrätlinje mellan varje punktpar. Hermite: Tredjegradspolynom. Behöver y och y i varje punkt x i. Splines: Tredjegradspolynom. Behöver bara y i varje punkt x i. Metoden beräknar/skattar/gissar y och y enligt kravet att de är kontinuerliga. Integraler I b a fxdx Trapetsregeln { I T h h 2 fa+fa + h+fa +2h+ + fb h+ } 2 fb E trunk T h I c h 2 + c 2 h 4 + c 3 h 6 +... T h T 2h T h är bra skattningav integralen om { h tillräckligt litet för att följa kurvan T 2h T 4h T h T 2h 22 4 Rombergs metod Trapetsregeln + Richardsonextrapolation T h I + c h 2 + c 2 h 4 +... T 2h I +4c h 2 +64c 2 h 4 +... T 4h I +6c h 2 + 256 c 2 h 4 +... ˆT h bra om ˆT h ˆT h+ ˆT h ˆT 2h 5 T h T 2h ˆT h T h+ I + c h 4 +... 3 T 2h T 4h ˆT 2h T 2h+ I +6c h 4 +... 3 I + c h 6 +... T 2h T 4h T h T 2h 22 4 dvsfeletit ch 2 ˆT h bra om ˆT 2h ˆT 4h ˆT h ˆT 2h 24 6 dvs felet i ˆT ch 4 5
Matlab: Iquad8 funk,a,b,tol, Etrunkabstol*I % OK om kurvan snäll Matlab: Iquadl funk,a,b,tol, Etrunktol % OK om kurvan snäll Förbehandling: Substitution Uppdelning Kapning Partiell integration Ordinära differentialekvationer begynnelsevärdesproblem BV Våra metoder klarar bara första ordningens differentialekvationer, men det är inget problem ety högre ordningens differentialekvationer kan alltid skrivas om till ett system av första ordningen. Skriv på standardform : dȳ dx fx, ȳ ȳa c, ȳb? Lösningsidé: Approximera kurvan en kort bit med en rät linje. Linjens lutningges av differentialekvationen och metoden, olika metoder ger olika lutning. Eulers metod Linjens lutningen beräknas till derivatan i startpunkten: { yn+ y n + hfx n,y n y 0 c x n+ x n + h x 0 a E trunk yx; h yx c h + c 2 h 2 + c 3 h 3 + c 4 h 4 +... yx; h yx;2h Metoden är lätt att programmera men har låg noggrannhet. Runge-Kuttas metod Linjens lutningen beräknas som ett viktat medelvärde av derivatan i startpunkten, mittpunkten och slutpunkten: k hfx n,y n k 2 hfx n + h/2,y n + k /2 k 3 hfx n + h/2,y n + k 2 /2 k 4 hfx n + h, y n + k 3 { yn+ y n +k +2k 2 +2k 3 + k 4 /6 y 0 c x n+ x n + h x 0 a E trunk yx; h yx c h 4 + c 2 h 5 + c 3 h 6 + c 4 h 7 +... yx; h yx;2h Runge-Kutta är lite klurigare att programmera än Eulers metod men den ger mycket bättre svar vid samma mängd beräkningar. I Matlab finns de två ODE-lösarna ode23 och ode45 som bygger på Runge-Kutta och adaptiv steglängd. Trunkeringsfelet skattas genom att jämföra resultatet från två beräkningar med olika steglängd: y0c; tolvalodeset RelTol, e-6; tolval2odeset RelTol, e-9; [xut,yut]ode45 dydx,[a b],y0,tolval; nlengthxut; yyutn,; [xut,yut]ode45 dydx,[a b],y0,tolval2; n2lengthxut; y2yutn2,; plotxut,yut; svary2 % Eftersom sökt yb och y2 beräknad med minsta steget. if n n2; Etrunkabsy-y2, end; 6
Ordinära differentialekvationer randvärdesproblem RV En metod +en extra att välja på: Finita-Differens-Metoden FDM förr Bandmatrismetoden Ersätt alla derivator med differenser dvs både i differentialekvationen och randvillkoren. 2 Diskretisera integrations-intervallet. 3 Sätt in differenserna i alla diskretiseringspunkter ekvationssystem. 4 Lös ekvationssystemet med Newtons metod om icke-linjärt. 5 Upprepa från 2 med dubbla antalet diskretiseringspunkter dvs halva steget om felet är för stort. E trunk kommer från vald steglängd och hur länge man itererar i Newton om man hade ett icke-linjärt ekvationssystem och skattas genom att jämföra lösningen beräknad med dubbla steget. E trunk yx; h yx;2h y x yx + h yx h 2h y x yx + h 2yx+yx h h 2 Inskjutningsmetoden även kallad provskottsmetoden Gissa det saknade startvärdet. 2 Lös diffekvationen med en metod för begynnelsevärdesproblem BV. 3 Kolla hur stort felet blev i slutet genom att jämföra med det givna randvillkoret. 4 Gissaettnyttstartvärde. 5 Lös ånyo med BV-metoden. 6 Kolla hur stort felet blev denna g ång. Om tillräckligt litet, stanna: vår lösningär OK. Om för stort: 7 Bestäm nytt startvärde utgående från de senaste två gissningarna vi gjort sekantmetoden. 8 Upprepa från 5. E trunk kommer från vald steglängd i BV-metoden och hur länge man itererar för att hitta det rätta startvärdet. Slut på denna nummekurs. Lycka till med det fortsatta nummandet! 7 c 204 Ninni Carlsund Levin
Exempel på inskjutningsmetoden. Beräkna y0.0,y0.,y0.2 och y0.3. Använd inskjutningsmetoden och Eulers metod med steget h 0.. y x 2 +6y y Lösning y0.3 0.7 y 0.0 0.4 Det är ett RV-problem eftersom randvillkoren är givna i olika punkter. Fär att kunna använda Eulers metod som är en BV-metod måste vi ha alla randvärdena givna i samma punkt. Vi skriver om till standardform: u yx u 2 y u y x u 2 x u 2 y x x 2 +6y y x 2 +6u 2 u u vilket skrivet i vektorform blir : ū ū u x 2 2 +6u 2 u Eulers metod blir då u 2 { ūn+ ū n + h ū n x n+ x n + h med startvärden ū 0 u x 0 u0 u 2 x 0 u 20 Ivårt fall har vi u 20 0.4 men vi saknar ett värde på u 0.Istället har vi fått värdet på y i punkten x 0.3. Med steget h 0. ochvåra beteckningar betyder detta att vi vet värdet på u efter tre steg, u 3 0.7 Det inskjutningsmetoden innebär är att vi måste gissa ett värde på u 0 och räkna fram vad vi får på u 3.Omvifår 0.7 betyder det att vi gissade rätt, annars får vi göra om med ett nytt startvärde på u 0. Gissning Jaggissar u 0 0.7 ibristpåfantasiså antar jagatt u x yx inteändras alltför mycket mellan x 0 och x 0.3. Jagskall nu lösa begynnelsevärdesproblemet; tre stegmed Eulers metod ty x 0 0,x 0.,x 2 0.2,x 3 0.3 upp till fyra decimaler redovisas: Steg : Steg 2: Steg 3: u0 ū 0 u 20 ū ū 0 + h ū 0 0.7 0.4 0.7 0.4 u 0.74 ū u 2 0.568 ū 2 ū + h ū 0.74 0.568 ū 2 u2 u 22 ū u 0 20 0.4 x 2 0 +6u 20 u0.68 0.7 0.04 0.74 + 0.4 0.68 0.568 0.4 +0..68 +0. 0.7968 0.8209 ū 3 ū 2 + h ū 2 0.7968 0.8209 +0. ū u 2 0.5680 x 2 +6u 2 u 2.5293 0.568 0.74 0.0568 + 2.5293 0.568 0.2529 0.7968 0.8209 ū u 2 22 0.8209 x 2 2 +6u 22 u2 3.9566 0.8209 0.7968 0.082 + 3.9566 0.8209 0.3957 0.8789.266 Denna Euler-räkningkan redovisas kompaktare med följande tabell n x n ū n T ū n T h ū n T 0 0.0 0.7000 0.4000 0.4000.6800 0.0400 0.680 0. 0.7400 0.5680 0.5680 2.5293 0.0568 0.2529 2 0.2 0.7968 0.8209 0.8209 3.9566 0.082 0.3957 3 0.3 0.8789.266 Jagfick u 3 0.8789, inte 0.7, alltså har jag gissat fel. Ny gissning behövs. 8
Gissning 2 Eftersom jagfick ett för stort slutvärde så chansar jagnu på ett lite mindre, jaggissar nu u 0 0.6. Nu har jagvad jagbehöver fär att göra en ny Euler-räkningfrån x 0 0 till x 3 0.3 Den redovisas i tabellform: n x n ū n T ū n T h ū n T 0 0.0 0.6000 0.4000 0.4000.4400 0.0400 0.440 0. 0.6400 0.5440 0.5440 2.0954 0.0544 0.2095 2 0.2 0.6944 0.7535 0.7535 3.673 0.0754 0.367 3 0.3 0.7698.0703 Nu fick jag u 3 0.7698, bättre men inte riktigt bra. Vidare räkningar Ett nytt startvärde behövs men denna gånggissar jaginte vilt utan använder sekantmetoden på devärden jag har. Med startgissningen 0.7 blev felet i slutet 0.8789 0.7 0.789 och med startgissningen 0.6 blev felet i slutet 0.7698 0.7 0.0698: z n z n 0.6 0.7 Sekantmetoden : z n+ z n f n 0.6 0.0698 f n f n 0.0698 0.789 0.536 Min nya startgissning blir alltså u 0 0.536 Den nya Euler-beräkningen redovisas i tabellform igen: n x n ū n T ū n T h ū n T 0 0.0 0.536 0.4000 0.4000.2866 0.0400 0.287 0. 0.576 0.5287 0.5287.833 0.0529 0.833 2 0.2 0.6290 0.720 0.720 2.79 0.072 0.272 3 0.3 0.7002 0.9832 Slutvärdet är inte riktigt bra, jag kör ett varv till. Nytt startvärde blir 0.536 0.0002 0.536 0.6 0.0002 0.7698 0.5359 Den nya Euler-beräkningen redovisas ånyo i tabellform: n x n ū n T ū n T h ū n T 0 0.0 0.5359 0.4000 0.4000.2863 0.0400 0.286 0. 0.5759 0.5286 0.5286.8325 0.0529 0.833 2 0.2 0.6288 0.79 0.79 2.70 0.072 0.27 3 0.3 0.7000 0.9830 Nu stämmer slutvärdet och kör man sekantmetod-formeln ett varv till får man korrektionen till startvärdet.2 0 7 och samma värden med fyra decimaler. De sökta värdena är således y0 0.5359, y0. 0.5759, y0.2 0.6288 och givetvis y0.3 0.7000. Trunkeringsfelet i svaret beror av när vi stannar i sekantmetoden samt steglängden i Euler. Här dominerar felet från Euler! Gör man om beräkningarna med steget h 0.05 får man y0 u 0 0.579, y0. u 2 0.560, y0.2 u 4 0.692 och y0 u 6 0.7000. För att få fyrasäkra decimaler var jagtvungen att ha h<0.000, dvs över 3000 stegi varje Euler-beräkning! När jagbytte ut Euler mot ODE45 fick jagsvaret med en tiondel så mycket arbete. Använd inte Euler! Gissat y00.7 Gissat y00.6 Gissat y00.53609 Gissat y00.53595 0.5 0 0. 0.2 0.5 0 0. 0.2 0.5 0 0. 0.2 0.5 0 0. 0.2 Rätta värdena med fyra decimaler är y0 0.4943, y0. 0.54, y0.2 0.6060 och y0.3 0.7000. Om man gör ett stegs Rich.-extr. på Euler-värdena får man rätta svaret med 75% av ODE45-arbetet. Om man väljer RK med h 0. ochgör ett stegs Rich. får man rätta svaret med 25% av ODE45-arb. 9 c 204 Ninni Carlsund Levin