DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 1. Laborationsregler Läs detta dokument, lös uppgifterna i slutet, och lämna in en individuell laborationsrapport senast måndag 14 januari i pdf-format via uppgiftsverktyget i lärplattformen Cambro. I kapitel 7 finns instruktioner för vad din rapport ska innehålla. Ett särskilt laborationstillfälle finns bokat om du behöver hjälp med uppgifterna, se lektionsschemat. Du kan också lösa dem på egen hand i vårt datorlabb eller hemma om du har tillgång till Matlab eller programmen Octave eller FreeMat. Dessa är fria program som har stora likheter med Matlab, du hittar dem på www.octave.org och freemat.sourceforge.net. Den som inte godkänts på datorlaborationen i samband med ordinarie inlämningstillfälle ges ny möjlighet till bedömning av laborationsrapporten, om denna inlämnas senast fredagen 4 mars 2013. Ytterligare tillfälle till bedömning av laborationsrapport ges i samband med ytterligare omtentor. Om du vill läsa mer om Matlab så kan du gå till www.mathworks.com, här finns bland annat diskussionsgrupper och ett filarkiv för programmet. Det finns även några korta videor med introduktioner till MATLAB under följande länk: Introduktion till MATLAB. 2. Numerisk integration Hittills i kursen har vi försökt beräkna integralen b a f(x) dx genom att försöka hitta en primitiv funktion F (x) till f(x) och sedan använda integralkalkylens huvudsats som säger att b a f(x) dx = F (b) F (a). Det finns flera skäl till att denna metod inte alltid är den bästa eller ens möjlig. Det kan vara så att det visserligen går att beräkna en primitiv funktion men att det är svårt och kräver både listighet och ett antal knep. Exempelvis går 2 ln x 1 x 1 + x 2 dx att beräkna och 2 har det exakta värdet ln( 5 + 2) 1 2 5 (1 + ln 2) ln(1 + 2) + 2, men uträkningen år inte så enkel. Integralen 1 1 x5 e 9 x sin 7 x dx går visserligen att beräkna, och det är inte så svårt, men det är alldeles för jobbigt. Det finns andra integraler, till exempel π sin x π x dx, 3 x 2 ln x dx och 4 0 e x2 dx, där det absolut inte går att hitta någon primitiv funktion uttryckt med hjälp av elementära funktioner. En vanlig situation i naturvetenskapliga och tekniska tillämpningar är att funktionen f(x) inte är känd men att man har ett antal mätvärden som gör att man känner funktionens värde (ofta inom en viss felmarginal) i ett ändligt antal indelningspunkter x 0, x 1,..., x n. 1
2 DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 Man känner alltså värdena y 0 = f(x 0 ), y 1 = f(x 1 ),..., y n = f(x n ) och med hjälp av dem vill man ange ett, åtminstone ungefärligt, värde på integralen x n x 0 f(x) dx. För att kunna uppskatta hur stort felet är i det värde man får fram på integralen är det nödvändigt att veta lite mer om funktionen f(x). $ $ $ $ '#$ '#$ '#$ '#$ ' ' ' ' &#$ &#$ &#$ &#$ & & & & %#$ %#$ %#$ %#$ % % % %!#$!#$!#$!#$!!!! "#$ "#$ "#$ "#$ "!!!"#$ " "#$! ()*+!,#+(-./0)1.+*)23.+)+4-./035# "!!!"#$ " "#$! ()*+!6#+7,.8/3+93..,+:-./0)1. "!!!"#$ " "#$! ()*+!;#+3<<35+93.., "!!!"#$ " "#$! ()*+!9#+3<<35+0)<<+1;=+>39+93..,# Figur 1. I figuren ovan är de givna mätvärdena ritade i ett stolpdiagram i Fig 1a. Egentligen kanske detta är det enda vi vet om funktionen f men ofta vet vi mer. I Fig 1b. är punkterna i Fig 1a. förbundna med en slät kurva, det vill säga funktionen f har kontinuerliga derivator av alla ordningar. I Fig 1c. är punkterna sammanbundna med en styckvis linjär kurva, det vill säga på varje delintervall är funktionen f linjär. Slutligen visas i Fig 1d. en funktion som har rätta funktionsvärden enligt Fig 1a. men som är styckvis konstant. Den är alltså inte ens säkert kontinuerlig i alla punkter. För att göra en feluppskattning för en approximativ beräkning av en integral behöver man veta något om hur mycket funktionen kan ändra värde mellan mätpunkterna x 0, x 1,..., x n. När man gör numerisk integration med datorer kommer det erhållna resultatet, I num, att avvika från integralens sanna värde, I, dvs. man erhåller ett visst fel. Detta fel kan delas upp i ett diskretiseringsfel, E, som beror på vilken numerisk integrationsmetod som används samt indelningens finhet, och andra typer av numeriska fel, ɛ, som uppkommer av exempelvis avrundningsfel i datorn. Det gäller då att I I num = E + ɛ. I allmänhet är E mycket större än ɛ och då gäller approximativt I I num E. För fina indelningar kan emellertid ɛ vara av samma storleksordning som E eller högre. Man kan ofta få en uppskattning av felet E på formen E Ch k där k är ett naturligt tal och h = max i (x i x i 1 ) är den största intervallängden i indelningen, det som brukar kallas indelningens finhet. Talet k anger felets storleksordning ju högre värde på k desto bättre approximationsmetod. Slutligen är C en konstant som beror på funktionens utseende, mer exakt beror den på storleken på f (k) (x) det vill säga derivatan av ordning k jämför med feluppskattningen vid Taylorapproximation.
DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 3 I den här datorlaborationen kommer inte så mycket tid att ägnas åt att göra teoretiska feluppskattningar. Sådana saker lär man sig mera om när man läser kurser i numerisk analys. Här kommer det mest att handla om att bekanta sig med några vanliga numeriska integrationsmetoder och skriva Matlabprogram för dessa metoder, samt tillämpa dem på några exempel och rent experimentellt undersöka felets storleksordning. Den som vill lära sig mer om de metoder som tas upp i laborationen, och även andra metoder för approximativ beräkning av integraler, hänvisas till avsnitten 6.6, 6.7 och 6.8 i Adams: Calculus a Complete Course. 3. Metoden med Riemannsumma Om a = x 0 < x 1 < < x n = b är indelningen av ett intervall [a, b] så får vi en Riemannsumma till b a f(x) dx genom n k=1 f (ξ k) x k där ξ k är en vald punkt i intervallet [x k 1, x k ] och x k = x k x k 1 längden av intervallet. I följande Matlabprogram används ξ k = x k 1 i intervallet [x k 1, x k ]. Jämför Fig 1d) på sidan 2. Kopiera in följande program i en M-fil och spara den som riemann.m. Obs att vår indelning av intervallet är x 0,..., x n för att överensstämma med teorin i Adams bok, men i Matlab-programmen kommer indelningen vara x 1,..., x n+1 på grund av hur Matlab framställer vektorer. function integral = riemann(funk, a, b, n) % riemann(funk,x) beräknar integralen av funk på % intervallet (a,b) med konstant steglängd h=(b-a)/n. % Som funktionsvärden väljs värdena i vänstra ändpunkterna i % delintervallen x=linspace(a,b,n+1); % x=[a a+h a+2h... a+nh=b] y=funk(x); % y=funktionsvärdena som svarar mot x-värdena integral=0; %nollställning av integral h=(b-a)/n; for i=1:n integral=integral+h*y(i); end Börja med att i Command Window skriva >> help riemann så får du upp kommentaren i programmet som beskriver funktionen riemann. Testa sedan programmet t.ex. med f(x) = sin x integrerad över intervallet [0, π/2] genom att skriva riemann(@sin,0,pi/2,16). Matlab bör returnera ans = 0.9501
4 DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 Talet 16 är antalet delintervall, så steglängden blir h = (π/2 0)/16 i felformeln E Ch k ovan. Om vi vill uppskatta värdet på k kan vi använda oss av att ln( E ) ln(c h k ) = ln C + k ln(h). Genom att göra substitutionen y = ln( E ), x = ln(h), ser vi att y = k x + ln(c), vilket beskriver en rät linje. Genom att anpassa en rät linje genom olika värden ln( E ) och ln(h) kan vi uppskatta värdet på k. Övning Beräkna först det exakta värdet på I = π/2 0 sin x dx. Beräkna sedan approximativa värden Ĩ med funktionen riemann då h = 0.1, 0.01, 0.001 och 0.0001. Beräkna felen I Ĩ. Uppskatta sedan metodens ordning k genom att beräkna lutningen av grafen till ln( E ) ln(c)+k ln(h). Ni kan rita grafen genom att kopiera följande m-fil och spara den som exempel_fel.m exakt_varde=1; %Exakta värdet av integralen av sin mellan 0 och pi/2 for k=1:4 n(k)=10^k; fel(k)=abs(riemann(@sin,0,pi/2,n(k))-exakt_varde); end h=(pi/2-0)./n; % [h;fel] %skriv ut felet för olika värden på h [log(h);log(fel)] %skriv ut par av punkter på den räta linjen plot(log(h),log(fel)) title( Fel för Riemannintegralen av sin(x) mellan 0 och \pi/2 ) xlabel( ln(h) ) ylabel( ln(fel) ) Skriver ni exempel_fel i kommandotolken bör ni få reslutatet ans = 0.1571 0.0157 0.0016 0.0002 0.0806 0.0079 0.0008 0.0001 ans = -1.7456-4.1435-6.4552-8.7587-2.4101-4.8340-7.1481-9.4518 samt grafen i Figur 3. Första uppsättningen tal visar de olika h-värdena på första raden, och motsvarande absoluta fel på andra raden. Andra uppsättningen tal ger fyra punkter på den räta linjen i Figur 3, med x-värdena på första raden och motsvarande y-värdena
DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 5 på andra. Genom att räkna ut k = y/ x med hjälp av uppsättningen av punkter på den Figur 2. Grafen till exempel fel är en så kallad log-log-plot räta linjen drar vi slutsatsen att felet har storleksordning k 1. 4. Trapetsmetoden I Figur 3 har funktionen f(x) approximerats linjärt mellan punkterna (x i 1, y i 1 ) och (x i, y i ). Arean under kurvan approximeras med arean A i av parallelltrapetsen ABCD. Vi har att A i = 1 2 (y i 1 + y i )(x i x i ) = (y i 1+y i ) 2 x i. Approximationen av arean under kurvan blir n A = A i. i=1 Vi väljer att dela in integrationsintervallet i n lika långa delintervall, d.v.s. x i = b a n = h. Då får vi A = h n (y i 1 + y i ). 2 i=1 Följande funktion beräknar integralen med trapetsmetoden. function integral=trapets(funktion,a,b,n) format long % Vi vill ha fler decimaler än bara 4 i utskriften % trapets(funktion,a,b,n) där funktion=den funktion som skall integreras % a och b är integrationsintervallets gränser och n är antalet % delintervall.
6 DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 y(i+1) y(i) x(i) x(i+1) Figur 3. Linjär approximation % Metoden som används är trapetsmetoden h=(b-a)/n;%intervallängden beräknas x=linspace(a,b,n+1); %x innehåller de n+1 ändpunkterna för delintervallen y=funktion(x); % y=funktionsvärdena som svarar mot x-värdena Summay=0; % nollställning av summan av y-värdena for i=1:n Summay=Summay+(y(i)+y(i+1));% y-värdena summeras enligt trapetsmetoden end integral=h/2*summay;% slutligen multipliceras med h/2 enligt formeln 5. Simpsons metod Nu skall vi gå vidare och approximera funktionen med andragradspolynom. Vi antar att integrationsintervallet är indelat i ett jämnt antal delintervall. Delintervallen parar vi ihop två och två. Genom de tre punkterna (x i, y i ), (x i+1, y i+1 ) och (x i+2, y i+2 ) kan vi lägga en andragradskurva given av y = p(x) där polynomet blir (x x i+1 )(x x i+2 ) p(x) = y i (x i x i+1 )(x i x i+2 ) + y (x x i )(x x i+2) ) i+1 (x i+1 x i )(x i+1 x i+2 ) + + y i+2 (x x i )(x x i+1) ) (x i+2 x i )(x i+2 x i+1 ) Det är lätt att kontrollera att p(x i ) = y i, p(x i+1 ) = y i+1 och p(x i+2 ) = y i+2. Dessutom ser man att p(x) blir ett polynom av grad 2. Det är lätt att se att man på samma sätt skulle kunna konstruera ett n-te grads polynom genom n + 1 givna punkter. Man säger att ett
DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 7 y(i+2) y(i) y(i+1) x(i) x(i+1) x(i+2) Figur 4. Andragradsapproximation sådant polynom interpolerar till de n + 1 punkterna och polynomen konstruerade på detta sätt brukar kallas Lagranges interpolationspolynom. I figur 4 är interpolationspolynomet av grad 2 inritat tillsammans med den fetare ritade kurvan, y = f(x). Vi vill egentligen bestämma arean under kurvan y = f(x), men eftersom vi inte kan göra det, bestämmer vi istället arean under interpolationspolynomet. Vi antar att delintervallen alla har längden h vilket innebär att (x i x i+1 ) = h, (x i x i+2 ) = 2h, (x i+1 x i ) = h. Formeln för p(x) förenklas då till p(x) = 1 ( 2h 2 y i (x x i+1 )(x x i+2 ) 2y i+1 (x x i )(x x i+2 )+ ) + y i+2 (x x i )(x x i+1 ) Vi beräknar integralen under kurvan y = p(x) på intervallet [x i, x i+2 ] och får att xi+2 x i p(x) dx = 1 2h 2 xi+2 x i ( y i (x x i+1 )(x x i+2 ) ) 2y i+1 (x x i )(x x i+2 ) + y i+2 (x x i )(x x i+1 )) dx Genom att göra substitutionen x x i+1 = u, x = u + x i+1 och dx = du, får vi att xi+2 p(x) dx = 1 h ( ) x i 2h 2 y i u(u h) 2y i+1 (u + h)(u h) + y i+2 u(u + h) du h = 1 h ( 2h 2 (y i 2y i+1 + y i+2 ) u 2 + (y i+2 h y i h) u + 2y i+1 h 2) du h
8 DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 Vi vill alltså integrera ett polynom i variabeln u över ett symmetriskt intervall. Då kommer alla termer av udda grad att försvinna, och endast de med jämn grad bli kvar. Vi kan då använda att för en jämn funktion f gäller att a a f(x) dx = 2 a 0 f(x) dx. Vi får då att xi+2 p(x) dx = 1 ) ((y x i h 2 i 2y i+1 + y i+2 ) h3 3 + 2h3 y i+1 = h ) (y i 2y i+1 + y i+2 + 6y i+1 = h ) (y i + 4y i+1 + y i+2. 3 3 Vi kan nu ställa upp följande formel för den nya approximationen av integralen. b f(x) dx h ( ) (y 0 + 4y 1 + y 2 ) + (y 2 + 4y 3 + y 4 ) + + (y n 2 + 4y n 1 + y n ) 3 a = h 3 n 2 i=0 jämna i (y i + 4y i+1 + y i+2 ) Observera att vi förutsätter att n är ett jämnt tal. Den formel vi har härlett brukar kallas Simpsons formel. 6. Uppgifter Uppgift 1. Undersök storleksordningen k för felet, då man använder trapetsmetoden. Gör på motsvarande sätt som i övningen ovan för metoden med Riemannsumma på sida 4. Använd funktionen trapets på sida 5 och skriv ett skript liknande skriptet exempel_fel på sida 4 för att uppskatta I = 4 1 ln t dt med hjälp av trapetsmetoden för 10, 100, 1000, och 10000 delintervall, samt storleksordningen på felet. Uppgift 2. Skapa matlabfunktionen function integral=simpson(funktion,a,b,n) genom att modifiera matlabkoden för trapetsmetoden på sida 5. Tänk på att antalet delintervall, n, måste vara ett jämnt tal för att Simpsons formel skall fungera. Lägg gärna in ett felmeddelande med kommandot error så att programmet ger ett meddelande och stoppar om man försöker köra det med ett udda tal som n. Ett tips är att i funktionen utnyttja en for-loop med steglängd 2 enligt följande modell for i=1:2:n satser end Inmatning av en funktion i simpson sker antingen genom att man skriver till exempel. >> simpson(@myfun,a,b,n) där myfun.m är en funktion som finns kodad i en m-fil eller möjligen är en Matlab-funktion t.ex. sin. Om man vill mata in en funktion direkt, utan att först skapa en m-fil så kan man använda en s.k. anonym funktion och t.ex. skriva >> simpson(@(u) 1./u+(u-1).^2,1,3,200)
DATORLABORATION FÖR KURSEN ENVARIABELANALYS 2 9 som beräknar funktionen simpson för 3 ( 1 1 u + (u 1)2) du där integrationsintervallet [0, 2] är indelat i 200 delintervall med längden 0,01. OBS! Det är viktigt att använda punkterade räkneoperationer i definitionerna av funktionerna så att de kan acceptera att x är en lista med värden när man skriver f(x). 2 a) beräkna ett värde på integralen 1 0 cos(x) dx med Simpsons metod för 500 delintervall och jämför med det exakta värdet sin(1). 2 b) Undersök storleksordningen k för felet då man använder Simpsons metod på samma integral. Obs: gå inte upp till 10000 delintervall, utan nöj dig med 10, 100 och 1000 delintervall. Om du går högre kommer ɛ (den delen av felet som uppkommer t ex genom avrundningsfel i dator) att bli så stort att vi inte längre har ett linjärt samband (se avsnitt 2). 7. Laborationsrapportens utseende och struktur Filen ska vara i pdf-format och namnges enligt följande: efternamn_förnamn_datum.pdf Rapporten ska ha ett försättsblad där det framgår 1) vilken laboration det är fråga om, 2) vilken kurs laborationen ingår i, och 3) namn och mailadress till den som gjort rapporten. Rapporten ska ha en inledning med en kort beskrivning av laborationens syfte (tänk att någon läser rapporten som inte har sett laborationsinstruktionerna först). För uppgift 1 ska följande ingå: källkoden för skriptet som anropar trapets, det absoluta felet för 10, 100, 1000, och 10000 delintervall, en log-log-plot liknande figur 2, och en uppskattning av felets storleksordning. och för uppgift 2 ska följande ingå: källkoden för simpson, lösning på uppgift 2 a), det absoluta felet i uppgift 2 b) för 10, 100 och 1000 delintervall (obs: gå inte upp till 10000), en log-log-plot liknande figur 2, samt en uppskattning av felets storleksordning. Stolpa inte bara upp punkterna ovan, utan bind ihop dem med text där du förklarar vad det är du presenterar. Avsluta varje uppgift med en sammanfattning av vad du kan dra för slutsatser om felets storleksordning för de olika numeriska metoderna. Laborationsrapporten behöver inte vara en lång essä! Det viktiga är att du kort kan sammanfatta syfte och resultat samt presentera uppgiftspunkterna ovan i löpande text. Rapporten ska vara språkligt korrekt, dvs du ska använda fullständiga meningar, stava rätt, och använda matematiska termer korrekt.