Matematikk 000 Øvingsoppgaver i numerikk leksjon 9 Løsningsforslag Oppgave Integral som en sum av rektangler a) 3 f(x) dx = 3 x 3 dx = [ ] 3 3 + x3+ = [ x 4 ] 3 4 = 34 = 20. 4 b) 0.5 f() + 0.5 f(.5) + 0.5 f(2) + 0.5 f(.5) = 0.5 ( 3 +.5 3 + 2 3 + 2.5 3) = 4. Vi ser at dette samla arealet ligger et godt tykke under integralet fra a). Dette er ikke så overranskende om vi sammenligner gur og 2 i oppgavesettet. c) og d) Vi ser at jo ere intervaller vi deler [, 3] opp i, jo nærmere blir summen av rektangel-arealet det totale arealet i gur 3; det vite området mellom grafen og rektanglene blir mindre og mindre når n øker. Vi skal regne ut summen x n n f(x i ), i= med x n = (3 )/n og x i = + (i ) x n. Det kan vi gjøre med dette skriptet: % Skript som estimerer et integral som en sum 2 % av arealene til rektangler 3 4 % Bestemmer antall del-intervaller 5 n=4; 6
7 % Integrasjonsgrenser 8 a=; 9 b=3; 0 % Regner ut Delta X 2 DeltaX=(b-a)/n; 3 4 % Setter summen til null 5 S=0; 6 7 % for-løkke som beregner summen 8 for i=:n 9 xi=a+(i-)*deltax; % Finner x_i 20 fi=xi^3; % Tilsvarende funksjonsverdi 2 S=S+fi; % Oppdaterer sum 22 end 23 24 % Regner ut svaret og skriver det til skjerm 25 Svar=DeltaX*S Skriptet heter Rsum.m. Her har vi først satt n til 4 for å kunne kontrollere at svaret faktisk blir 4, slik vi vet det skal bli. Det gjør det: >> format compact 4 Når vi nå skal endre på n i linje 5, kan vi gjøre dette på en ganske smidig måte ved å bruke input-fuksjonen i MATLAB; vi endrer linje 5 til n=input('hvor mange del-intervaller skal vi bruke? '); Når vi nå kjører skriptet, vil det stoppe å be deg gi n fra kommandovinduet. På den måten slipper vi å gå inn å endre n for hånd hver gang. 7.4800 Hvor mange del-intervaller skal vi bruke? 20 8.7200 2
9.4832 0 9.7408 0 9.9480 00 9.9740 00 9.9948 000 9.9974 000 9.9995 Hvor mange del-intervaller skal vi bruke? 30000 9.999 Først når vi hadde delt [, 3] opp i 30 000 del-intervaller, kk vi et svar med ein feil som var mindre enn 0 3. e) Vi endrer linje 9 i skriptet til xi=a+i*deltax; % Finner x_i Når vi nå igjen estimerer integralet for stadig høyere verdier av n, får vi konsekvent en verdi som er for høy: 22.6800 3
20.5232 0 20.2608 00 20.0260 000 20.0026 Hvor mange del-intervaller skal vi bruke? 20000 20.003 Hvor mange del-intervaller skal vi bruke? 30000 20.0009 Nok en gang måtte vi opp i ca. 30 000 del-intervaller for å få den ønskede presisjonen. f) Vi endrer linje 9 igjen: xi=a+(i-/2)*deltax; % Finner x_i Når vi nå estimerer integralet, nærmer vi oss fasiten langt raskere: Hvor mange del-intervaller skal vi bruke? 4 9.7500 9.9600 9.9984 0 9.9996 00 del-intervaller var nok! 4
Oppgave 2 Integral som en sum av trapeser a) Arealet blir: 0.5(f() + f(.5))/2 + 0.5(f(.5) + f(2))/2 + 0.5(f(2) + f(2.5))/2 + 0.5(f(2.5) + f(3))/2 = 0.5 (f()/2 + f(.5)/2 + f(.5)/2 + f(2)/2 + f(2)/2+ f(2.5)/2 + f(2.5)/2 + f(3)/2) = 0.5 (f()/2 + f(.5) + f(2) + f(2.5) + f(3)/2) = () 0.5 ( /2 +.5 3 + 2 3 + 2.5 3 + 3 3 /2 ) = 20.5 b) Venstre-summen har vi fra før: Høgre-summen blir og gjennomsnittet av de to blir S v = 0.5 (f() + f(.5) + f(2) + f(2.5)). S h = 0.5 (f(.5) + f(2) + f(2.5) + f(3)), 2 (S v + S h ) = (f() + f(.5) + f(2) + f(2.5) + f(.5) + f(2) + f(2.5) + f(3)) = 4 (f() + 2f(.5) + 2f(2) + 2f(2.5) + f(3) + f(2) + f(2.5) + f(3)) = 4 0.5 (f()/2 + f(.5) + f(2) + f(2.5) + f(3)/2). Vi kjenner igjen dette uttrykket fra deloppgave a) (likning ). c) og d) Det kan være naturlig å ta utgangspunkt i skriptet fra oppgave. Vi har her valgt å kopiere det over i ei ny l som vi har kalt TrapesSum.m: % Skript som estimerer et integral som en sum 2 % av arealene til trapeser 3 4 % Bestemmer antall del-intervaller 5 n=input('hvor mange del-intervaller skal vi bruke? '); 6 7 % Integrasjonsgrenser 8 a=; 9 b=3; 0 % Regner ut Delta X 2 DeltaX=(b-a)/n; 3 4 % Setter summen til null 5
5 S=0; 6 7 % for-løkke som beregner trapes-summen for de "indre punktene" 8 for i=:(n-) 9 xi=a+i*deltax; % Finner x_i 20 fi=xi^3; % Tilsvarende funksjonsverdi 2 S=S+fi; % Oppdaterer sum 22 end 23 % Det første punktet: 24 xi=a; 25 fi=xi^3; 26 S=S+fi/2; 27 % Det siste punktet 28 xi=b; 29 fi=xi^3; 30 S=S+fi/2; 3 32 % Regner ut svaret og skriver det til skjerm 33 Svar=DeltaX*S Merk at for-løkka i linje 8 går fra og med i= til og med i=n-. Det første og det siste leddet, som begge skal deles på 2, har vi håndtert separat etter for-løkka. Ellers er skriptet som i oppgave. Vi kjører det og forsøker å få feilen til å bli mindre enn 0 3 : Hvor mange del-intervaller skal vi bruke? 4 20.5000 20.0800 20.0032 0 20.0008 Hvor mange del-intervaller skal vi bruke? 80 20.002 Hvor mange del-intervaller skal vi bruke? 90 6
20.000 Vi ser at vi får en feil som er mindre enn 0 3 omtrent like rakst som da vi valgte midtpunktene for rektanglene. Oppgave 3 Uten fasit Det vil være naturlig å fortsette å bruke skriptet TrapesSum i denne oppgava. Men for å lettere endre funksjonen vi skal integrere, innfører vi ei funksjonl for denne funksjonen. Vi kaller denne IntFunk.m. Tilsvarende oppdaterer vi linjene 20, 25 og 29 i skriptet til fi=intfunk(xi). a) Vi lar funksjonsla se slik ut: function F=IntFunk(x) 2 3 % Funksjon som blir brukt av skriptet TrapesSum, som 4 % beregner et integral ved trapesmetoden 5 6 F=sin(x^2); I tillegg må vi justere grensene i linje 8 og 9 i TrapesSum til 0 og 2. Vi får 0.7959 Hvor mange del-intervaller skal vi bruke? 20 0.8026 0.8044 0 0.8047 Hvor mange del-intervaller skal vi bruke? 200 0.8048 Med tre riktige desimaler ser integralet ut til å være 0.805. 7
b) Funksjone sin x 2 har rett og slett ikke noen anti-derivert som kan skrives som en enkel, ekplisitt funksjon. Ingen av de teknikkene vi har, er i stand til å gi en anti-derivert av denne funksjonen. Slik er det for mange elementære funksjoner. c) i) Vi oppdaterer funksjonen vår; det vil si vi endrer linje 6 i IntFunk.m til F=x*exp(x^3); (om vi kaller argumentet x eller t spiller ingen rolle). Vi justerer også integrasjonsgrensene i linje 8 og 9 i TrapesSum til -5 og 2. Når vi leker oss i kommandovinduet, får vi: 2.0949e+03 0 552.2275 0 523.4777 00 522.5655 Hvor mange del-intervaller skal vi bruke? 2000 522.3373 00 522.2734 000 522.2643 Med én riktig desimal, ser svaret ut til å være 522.3. Her måtte vi bruke en høy n-verdi for å få et noenlunde nøyaktig svar. ii) Vi endrer linje 6 i IntFunk til F=tan(x^2+); oppdaterer integrasjonsgrensene og får: 8
0.9730 0.970 Hvor mange del-intervaller skal vi bruke? 5 0.9792 0.9730 Hvor mange del-intervaller skal vi bruke? 20 0.975 0.970 0 0.970 Med re rette desimalar ser svaret ut til å være 0.970. iii) Vi gjør de vanlige endringene og kjører på: Hvor mange del-intervaller skal vi bruke? 5 4.4409e-7 3.3307e-7 Hvor mange del-intervaller skal vi bruke? 20 4.4409e-7 4.4409e-7 9
Vi ser at svaret konsekvent ligger ned mot maskinpresisjonen eller under. Mye tyder på at integralet er null. d) Om vi plotter funksjonen vi skal integrere, er det lett å forstå hvorfor vi får null for integralet i c) iii). Se gur. Til venstre for y-aksen er funksjonen negativ slik at vi får et negativt bidrag til integralet. Til høgre for y-aksen får vi et like stort positivt bidrag. Dermed blir summen av de to bidragene null. Figur : Vi ser at det røde området, som gir et negtivt bidrag til integralet, er like stort i areal som det grønne, som gir et positivt bidrag. Summen blir null. e) Vi oppdaterer funksjonen og integrasjonsgrensene igjen og prøver oss: 0.8700 Hvor mange del-intervaller skal vi bruke? 20 6.9894 -.28 0 0.8878 Hvor mange del-intervaller skal vi bruke? 200 0
7.4804 0-0.9257 00.546 Her ser det ikke ut til at summen nærmer seg noe i det hele tatt. Grunnen til det er at integralet ikke er veldenert. Tangens-funksjonen, tan x, går mot ± når x nærmer seg π/2. For vår funksjon skjer dette når x 2 + = π/2 eller x = π/2 0.76. Se gur 2. Heldigvis gir dette seg utslag Figur 2: Plott av funksjonen tan(x 2 +). Funksjonen har ein loddrett asymptote for x = pi/2. i at vi ikke får noen konvergent verdi for trapes-summen. Hadde vi vært uheldige, hadde vi fått et tilsynelatende konvergert svar for et integral som ikke ns. Numeriske beregninger er ikke alltid en idiotsikker aære. Ekstra-oppgave: Monte Carlo-integrering a) Siden begge uttrykkene skal gi y, kan vi helt enkelt sette dem (tilnærma) lik hverandre: b a b a b a f(x) dx n n f(x i ) i= f(x) dx b a n n f(x i ) i=
b) Hvis ` rand' gir et tilfeldig tall mellom 0 og, må `a+(b-a)*rand' gi et tilfeldig tall mellom a og b. Vi tester: >> a=-; >> b=; >> a+(b-a)*rand ans = -0.553 >> a+(b-a)*rand ans = -0.04090 >> a+(b-a)*rand ans = -0.75354 >> a+(b-a)*rand ans = -0.73380 >> a+(b-a)*rand ans = 0.50765 >> a+(b-a)*rand ans = 0.9263 >> a+(b-a)*rand ans = -0.60546 Dette ser ut til å fungere. (Husk å bruke pil-tastene når du repeterer kommandoer på denne måten.) c) Vi velger oss integralet (x 2 + e x ) dx = 2 3 + e e. Nedenfor er et forslag til hvordan metoden kan implementeres. Uttrekket av x er gjort i linje 4. Vi har valgt å lage en vektor med sekvenser av Monte Carlo-estimater inni for-løkka slik at vi kan bruke dene til å plotte konvergensen etterpå. Dette er også gjort i skriptet fra og med linje 9. % Skript som regner ut integralet av funksjonen gitt ved 2 % IntFunk.m fra a til b ved Monte Carlo-metoden 3 4 % Integrasjonsgrenser 5 a=-; 6 b=; 7 % Maksimalt antall trekninger 8 nmax=00; 9 0 % Setter summen til 0: S=0; 2 for i=:nmax 3 x=a+(b-a)*rand; % Trekker tilfeldig x i intervallet 4 y=intfunk(x); % Bestemmer funksjonsverdi 5 S=S+y; % Summerer 2
6 IntEst(i)=(b-a)*S/i; % Bestemmer estimat av integralet 7 end 8 9 % Plotter estimatet som funksjon av antall trekk 20 plot(:n,intest,'bx','linewidth',2) 2 % Plotter også eksakt svar 22 IntEksakt=2/3+exp()-exp(-); 23 hold on 24 plot([ nmax],[ ]*IntEksakt,'k-') 25 hold off 26 % Justerer opp skriftsstørrelsen på aksene 27 set(gca,'fontsize',20) 28 xlabel('antall trekk') Vi har kalt skriptet `MonteCarlo.m'. Som vi ser, plotter det integralestimatet som funksjon av antall trekk. Når vi kjører det i MATLAB, ser det slik ut: >> MonteCarlo Nedre integrasjonsgrense: - Oevre integrasjonsgrense: Maksimalt antall trekk: 00 Selvsagt vil vi ikke få de samme sekvensene av x-verdier hver gang vi kjører skriptet. Derfor vil estimatet gå mot integralet på ulike måter hver gang vi kjører skriptet. I gur 3 har vi vist hvordan tre ulike sekvenser konvergerer. Selv om disse resultatene ser ganske ulike ut for hver gang, Figur 3: Tre sekvenser med Monte Carlo-estimat av integralet (x2 + e x ) dx. Den svarte linja er den eksakte verdien av integralet. ser alle tre ut til å konvergere mot riktig svar men ganske sakte. At 3
konvergensen går sakte ser vi enda tydeligere i gur 4. Først etter ere Figur 4: Konvergensplott for en lengre sekvens av en Monte Carlo-beregning. tusen trekk begynner kurva å plassere seg oppå verdien av integralet (på denne skalaen). Like fullt er Monte Carlo-integrering en svært nyttig og mye brukt teknikk ikke minst når man skal beregne er-dimensjonale integraler. (Det skal vi ikke gjøre i dette kurset.) 4