10 februari 2017 Matematisk analys för ingenjörer Matlabövning 2 Numerisk ekvationslösning och integration Syfte med övningen: Introduktion till ett par numeriska metoder för lösning av ekvationer respektive numerisk integrering. Övning i att använda matlab. Illustration av linjär approximation och integralbegreppet. En beskrivning av Newton-Raphsons metod finns i kursbokens (ET7/8) kapitel 4.8, och av numerisk integration i avsnitt 7.7. Läs gärna de avsnitten. Läs igenom hela texten i detta pm! Varje uppgift innehåller några frågor, besvara dem! Samla kod i körbara script respektive funktionsfiler. Gör helst en scriptfil per uppgift. Skriv en kort rapport med svar på frågor och valda illustrationer i exv Word. Ladda upp filerna till en mapp M2 i din inlämningsmapp/dropbox på kurssciosidan (MA123G VT17) som dokumentation. 1
Newton-Raphsons metod för ekvationslösning En metod för att approximera lösningar till ekvationen f(x) = 0 är Newton- Raphsons metod, där man, givet ett värde x 0 skapar en följd av tal x 0, x 1, x 2,..., x N på följande sätt: För ett givet x n låter vi L n vara den linjära approximationen till f kring x = x n dvs L n (x) = f(x n ) + f (x n )(x x n ). (Grafen till den linjära approximationen är tangentlinjen till y = f(x) i x = x n.) Sedan låter vi x n+1 vara roten till den linjära ekvationen L n (x) = 0. L n (x n+1 ) = 0 f(x n ) + f (x n )(x n+1 x n ) = 0 x n+1 = x n f(x n) f (x n ). På så vis får vi en följd av tal, som förhoppningsvis snabbt närmar sig en lösning till ekvationen f(x) = 0. Vi kan implementera Newton-Raphsons metod i matlab på följande sätt: Om f(x) och f (x) är två funktioner (matlabuttryck, skapade som anonyma funktioner eller en funktionsfil) så ger xx=x 0 ; for k=1:n; x=xx(end); % Plockar sista värdet i listan xx xx=[xx x-f(x)./f (x)]; end en lista xx med värdena x 0,..., x n, som fås enligt Newton-Raphsons metod med startvärde x 0. (x 0 skall alltså bytas ut mot startvärdet, f(x) mot den funktion du vill använda, f (x) mot en funktion som är derivatan av den förra och n mot antalet gånger du vill iterera.) Figur 1: Visualisering av Newton- Raphsons metod på ekvationen x 4 = 1 (x 4 1 = 0) med startvärde x 0 = 0.7. 2
Uppgift 1. Gör en funktion, definierad i en funktionsfil, med prototypen (det som följer function på första raden) xx=mynewton(f,df,x0,n) som kör Newton-Raphson för hitta ett (närapå) nollställe till funktionen f med derivata df (båda givna som function handle), och ett startvärde x0 med n iterationer (for-vändor). Funktionen ska som resultat ge en vektor med n + 1 komponenter: startvärdet följt av alla värden som beräknas per iteration (dvs som xx i koden ovan). Exempelkörning för x 2 1, given som en anonym funktion: >> format long; ns = mynewton( @(x)x^2-1, @(x)2*x, 2, 3 ) ns = 2.000000000000000 1.250000000000000 1.025000000000000 1.000304878048780 Använd din funktion för att beräkna en rot till ekvationen cos x = 0. Pröva med några olika startvärden, till exempel 1, 0.1, 0.01 och 0, och använd ett lämpligt antal iterationer. Varför blir resultaten olika? Modifiera funktionen till en funktion mynewton2(f,df,x0,tol) som istället för att köra ett givet antal iterationer istället kör tills f(x) är högst tol. Tips: Byt ut for-satsen mot while abs(f(xx(end)))>tol. Exempelkörning: >> format long; ns = mynewton2( @(x)x^2-1, @(x)2*x, 2, 0.01) ns = 2.000000000000000 1.250000000000000 1.025000000000000 1.000304878048780 Provkör med olika toleranser på cos x = 0. Not: Matlab har också en inbyggd ekvationslösare som heter fzero. Jämför gärna med vad den ger för rot. 3
Numerisk integrering En av de enklaste formerna av numerisk integrering är trapetsmetoden. Då approximerar man en funktion med en styckvis linjär funktion, som sedan lätt kan integreras genom att summera de trapetsareor som bildas i denna approximation (se figur 2). (Trapets=fyrhörning med två sidor parallella.) Notera att arean av en sådan trapets är lika med medelvärdet av de stående sidornas längder gånger basens längd. (Se också Stewart Calculus ET, avsnitt 7.7.) Om vi vill approximera värdet av integralen b a f(x)dx genom att använda värdena x 0, x 1,..., x n, där a = x 0 < x 1 < x 2 < < x n = b. 2 1.8 1.6 1.4 1.2 1 0.8 0.6 så får vi med trapetsmetoden en approximation till integralen som summan n M i x i, i=1 där M i = 1 2 (f(x i 1) + f(x i )) är medelvärdet av sidhöjderna i trapets nr i och x i = x i x i 1 är längden av samma trapets bas. 0.4 0.2 0 0 1 2 3 4 5 6 7 Figur 2: Approximation av funktion för beräkning av integral med trapetsmetoden. I matlab kan vi göra så här: Antag att vi har en lista av tal x 0, x 1,..., x n (av växande storlek) i en matlab-vektor x och en lista av motsvarande funktionsvärden y=f(x). Vi skapar en lista av baslängder: dx=diff(x) (diff(x) skapar en vektor som består av differensen mellan på varann följande element i vektorn x.) Sedan en vektor med medelvärdena mellan på varann följande funktionsvärden: my=(y(1:end-1)+y(2:end))/2 Vi skapar sedan en vektor av trapetsareor : ydx=my.*dx Nu kan vi skapa den bestämda integralen genom att summera dessa areor, vilket vi kan göra med sy=sum(ydx) Variabeln sy håller nu integralens värde. (Tips: Matlab skriver normalt inte ut mer än fyra decimaler, skriv format long för att se fler.) 4
Uppgift 2. Beräkna med trapetsmetoden en approximation av integralen 1 0 x dx med några olika uppdelningar av integrationsintervallet. Rita också en graf av den approximerande styckvis linjära funktionen (av samma typ som den blå kurvan i figur 2) för varje uppdelning. Beräkna det exakta värdet av integralen med hjälp av en primitiv funktion. Är värdet som man får genom trapetsmetoden en underskattning eller en överskattning? Har det något med andraderivatan att göra? Uppgift 3. Hitta själv på en integral att beräkna med trapetsmetoden. Använd en funktionsfil för att definiera integranden. Kan du bedöma ifall trapetsmetoden ger en överskattning eller en underskattning av integralen? Extrauppgift: Med x och y som ovan, kan man göra hela trapetsmetoden som y *a*x för en lämplig n n-matris a (om x och y är kolonnvektorer; y*a*x om de är radvektorer). Hur ska matrisen a se ut? Matlab har också mer avancerade numeriska integrationsmetoder (Simpsons formel adaptivt rekursivt) i form av funktionerna quad och quadl. Har du tid över får du gärna pröva dem. 5