Matematikk 1000 Øvingsoppgaver i numerikk leksjon 8 Løsningsforslag Oppgave 1 Riemann-summer a) b) f(x) = 1/x P = {1, 6/5, 7/5, 8/5, 9/5, 2} S = {6/5, 7/5, 8/5, 9/5, 2} (x i = x i ) Her kan partisjon og seleksjon bli gitt slik: `P=1:1/5:2;', og seleksjonen slik: `S=6/5:1/5:2;' eller slik:`s=p(2:6)' eller slik:`s=p(2:end);'. `end' refererer her til det siste elementet i P-vektoren slik at vi ikke trenger å vite hvor lang vektoren er. Disse endringene gjør vi i linje 5 og 7 i skriptet, som vi har kalt RiemannSum.m. Funksjonsla endres slik at den siste linja blir 'F=1./x;'. Vi kjører skriptet og får: > RiemannSum Rps = 0.64563 Her kunne vi også ha funnet svaret eksakt: ( 5 R P,S = x f(x i ) = 1 1 5 6 + 1 7 + 1 8 5 5 5 ( 1 5 5 6 + 5 7 + 5 8 + 5 9 + 5 ) 10 420 + 360 + 315 + 280 + 252 2520 f(x) = x 2 P = { 1, 1/2, 0, 1/2, 1} + 1 9 5 + 1 2 ) = = 1 6 + 1 7 + 1 8 + 1 9 + 1 10 = = 1627 2520 S = { 1, 1/2, 0, 1/2} (x i = x i 1 ) Vi gir partisjonen og seleksjonen slik: 1
P=-1:0.5:1 S=P(1:(end-1)). Vi oppdaterer funksjonsla slik at den gir x 2 og får > RiemannSum Rps = 0.75000 Det kan se ut til at Riemann-summen er eksakt 3/4, noe vi får bekrefta om gjør det analytisk: R P,S = x 4 f(x i ) = 1 ( 1) 4 ( ( 1) 2 + ( 1/2) 2 + 0 2 + (1/2) 2) = 1 2 3 2 = 3 4. c) f(x) = sin x P = {0, π/6, π/4, π/3, π/2, 2π/3, 3π/4, 5π/6, π} S = {π/6, π/4, π/3, π/2, 2π/3, 3π/4, 5π/6, π} (x i = x i ) Her må vi nok skrive hele partisjonen eksplisitt: % Partisjon: P=[0 pi/6 pi/4 pi/3 pi/2 2*pi/3 3*pi/4 5*pi/6 pi]; % Seleksjon: S=P(2:end); Vi kjører skriptet og får: > RiemannSum Rps = 1.9667 Også her kan summen nnes eksakt (selv om det ikke er så pent): R P,S = 8 f(x i ) x i = sin(π/6)(π/6 0) + sin(π/4)(π/4 π/6) + sin(π/3)(π/3 π/4) + sin(π/2)(π/2 π/3) + sin(2π/3)(2π/3 π/2) + sin(3π/4)(3π/4 2π/3) + sin(5π/6)(5π/6 3π/4) + sin π(π 5π/6) = 1/2 π/6 + 2/2 π/12 + 3/2 π/12 + 1 π/6 + π ( 3/2 π/6 + 2/2 π/12 + 1/2 π/12 + 0 = 7 + 2 2 + 3 ) 3 24 d) Denne gangen er partisjon regulær igjen. Og seleksjonen er gitt ved midpunktet i hvert del-intervall: f(x) = x 3 P = { 1, 3/4, 1/2, 1/4, 0, 1/4, 1/2, 3/4, 1} S = { 7/8, 5/8, 3/8, 1/8, 1/8, 3/8, 5/8, 7/8} (x i = (x i x i 1 )/2) Vi gir partisjonen og seleksjon i skriptet slik: 2
% Partisjon: P=-1:1/4:1; % Seleksjon: S=-7/8:1/4:7/8; Seleksjonen kunne blitt gitt på ere måter; en annen måte kunne være `S=(P(1:(end-1))+P(2:end))/2;'. Vi endrer funksjonla tilbake til det den var utgangspunktet og får > RiemannSum Rps = 0 En analytisk utregning bekrefter at 0 er den eksakte verdien av Riemannsummen (og det tilsvarende integralet). Oppgave 2 Enda en Riemann-sum f(x) = x 2 a) Lengda av alle del-intervall skal være like lange. Siden vi skal ha n delintervall, og lengda av intevallet [0, a] er a, må hvert del-intervall ha lengda x = a/n. b) Partisjonen P n = {x 0, x 1,..., x n } har x i = x 0 + i x = i x. Seleksjonen S n er gitt ved at x i = x i = i x. Det gir Riemann-summen R Pn,S n = n f(x i ) x i = x ( x) 3 n f(i x) = x n ( a ) 3 i 2 2n 3 + 3n 2 + n = n 6 n (i x) 2 = = a3 6 (2 + 3n + 1n 2 ). c) lim R P n,s n = lim R a 3 P P n 0 n n,s n = lim (2 + 3n n 6 + 1n ) 2 = a3 a3 (2+0+0) = 6 3. Setning 5.1.5 er nødvendig fordi vi bare har vist at Riemann-summen går mot a 3 /3 for en bestmet partisjon og seleksjon. Dersom en annen partisjon eller seleksjon hadde gitt en annen grenseverdi, ville ikke grenseverdien av Riemann-summen eksistert. Setning 5.1.5 sier at for stykkevis kontinuerlige funksjoner (som inkluderer kontinuerlige funksjoner), er grenseverdien alltid veldenert. d) Vi velger a = 1 og n = 10 og regner ut R P10,S 10 ved hjelp av dette skriptet: 3
1 % Skript som bergegner en Riemann-summ for f(x)=x^2 2 % på intervallet [0, a]. Partisjonen er reguær og 3 % seleksjonen er gitt ved x_i^* = x_i 4 5 % Bestemmer a: 6 a=1; 7 % Bestemmer antall delintervall 8 n=10; 9 % Lengda av delintervallene 10 DeltaX=a/n; 11 % Partisjon: 12 P=0:DeltaX:a; 13 % Seleksjon - lik partisjonsvektoren bortsett fra første element 14 S=P(2:end); 15 16 % Starter med å sette Riemann-summen til 0: 17 Rps=0; 18 % for-løkke som regner ut Riemann-summen 19 for :n 20 xstjerne=s(i); 21 Rps=Rps+(xStjerne)^2*DeltaX; 22 end 23 %Skriver Riemann-summen til skjerm 24 Rps Seleksjonen i linje 14 kunne også ha blitt gitt slik: `S=P(2:(n+1))'; P har n+1 elementer. Vi har kalt skriptet RegulaerPartisjon.m. Når vi kjører det i MATLAB, får vi > RegulaerPartisjon Rps = 0.30250 Når vi skal bruke ulike n-verdier, kan det være nyttig å endre tilordninga i linje 8 til en input-kommando: n=input('angi antall delintervall: '); Når skriptet kjører, vil det stoppe når det kommer til denne linja og vente på at du gir n i kommandovinduet. Teksten `Angi antall delintervall: ' blir da skrevet til skjerm. Når vi kjører skriptet, kan det se slik ut: > RegulaerPartisjon Angi antall delintervall: 50 Rps = 0.34340 > RegulaerPartisjon Angi antall delintervall: 100 Rps = 0.33835 4
> RegulaerPartisjon Angi antall delintervall: 500 Rps = 0.33433 > RegulaerPartisjon Angi antall delintervall: 5000 Rps = 0.33343 Riemannsummen ser vitterlig ut til å nærme seg 1/3 som seg hør og bør. Oppgave 3 Høgre-, venstre- eller midtseleksjon: Hva er best? a) Vi velger oss følgende: f(x) = x 2 + e x, a = 1 og b = 1. Integralet blir b a f(x) dx = 1 1 ( x 2 + e x) dx = [ x 3 /3 + e x] 1 1 = 1/3 + e ( 1/3 + e 1 ) = 2/3 + e 1/e 3.017. b) Vi får x = b a = 2 5 5 x i = x 0 + i x = 1 + 2i/5 P 5 = { 1, 3/5, 1/5, 1/5, 3/5, 1} S 5,v = { 1, 3/5, 1/5, 1/5, 3/5} S 5,h = { 3/5, 1/5, 1/5, 3/5, 1} S 5,m = { 4/5, 2/5, 0, 2/5, 4/5} Vi regner ut de tre Riemann-summene ved å lage et lite skript til å kjøre i MATLAB: % Skript som regner ut Riemann-summer for en regulær % partisjon på tre ulike måter % Maskevidde DeltaX=2/5; % Partisjon: P=-1:DeltaX:1; % Seleksjoner Sv=P(1:5); Sh=P(2:6); Sm=-4/5:DeltaX:4/5; 5
% Setter de tre summene til null: RsumV=0; RsumH=0; RsumM=0; % for-løkke som regner summene for :5 XvStjerne=Sv(i); XhStjerne=Sh(i); XmStjerne=Sm(i); RsumV=RsumV+IntFunk(XvStjerne)*DeltaX; RsumH=RsumH+IntFunk(XhStjerne)*DeltaX; RsumM=RsumM+IntFunk(XmStjerne)*DeltaX; end % Skriver summene til skjerm RsumV RsumH RsumM I kommandovinduet i MATLAB får vi: RsumV = 2.6316 RsumH = 3.5717 RsumM = 2.9748 c) Vi velger å bruke input-funksjonen slik at vi ikke trenger endre skriptet hver gang vi velger en ny n (skriptet er veldig likt det vi hadde i deloppgave b) og i oppgave 2): 1 % Skript som regner ut Riemann-summer for en regulær 2 % partisjon på tre ulike måter 3 4 % Grenser 5 a=-1; 6 b=1; 7 8 % Antall del-intervaller: 9 n=input('angi antall del-intervaller ') 10 11 % Maskevidde 12 DeltaX=(b-a)/n; 13 14 % Partisjon (har n+1 elementer): 15 P=-1:DeltaX:1; 16 % Seleksjoner (har n elementer) 17 Sv=P(1:n); % Venstre 18 Sh=P(2:(n+1)); % Høgre 6
19 Sm=(Sv+Sh)/2; % Midt 20 21 % Setter de tre summene til null: 22 RsumV=0; RsumH=0; RsumM=0; 23 24 % for-løkke som regner summene 25 for :n 26 XvStjerne=Sv(i); 27 XhStjerne=Sh(i); 28 XmStjerne=Sm(i); 29 RsumV=RsumV+IntFunk(XvStjerne)*DeltaX; 30 RsumH=RsumH+IntFunk(XhStjerne)*DeltaX; 31 RsumM=RsumM+IntFunk(XmStjerne)*DeltaX; 32 end 33 RsumV 34 RsumH 35 RsumM Her har vi regna ut Sh-vektoren som gjennomsnittet av de to vektorene Sv og Sh. Vi har alt sett at slike midpunksseleksjoner kan lages på ulike måter. Det er strengt tatt nødvendig å lage vektorer for seleksjonene; vi kunne like gjerne ha regna ut x i direkte for hver iterasjon i for-løkka med utgangspunkt i partisjons-vektoren P. d) Vi kjører skriptet, som heter TreRiemannSummer.m, for diverse n-verdier: Angi antall del-intervaller 5 RsumV = 2.6316 RsumH = 3.5717 RsumM = 2.9748 Angi antall del-intervaller 10 RsumV = 2.8032 RsumH = 3.2733 RsumM = 3.0065 Angi antall del-intervaller 20 RsumV = 2.9048 RsumH = 3.1399 RsumM = 3.0144 Angi antall del-intervaller 50 RsumV = 2.9709 RsumH = 3.0649 RsumM = 3.0166 Angi antall del-intervaller 100 7
RsumV = 2.9938 RsumH = 3.0408 RsumM = 3.0170 Angi antall del-intervaller 500 RsumV = 3.0124 RsumH = 3.0218 RsumM = 3.0171 Det ser ut til at alle tre Riemann-summene nærmer seg integralet når n øker (se deloppgave a)). Men det er tydelig at midt-summen nærmer seg mye raskere; allerede med n = 50 har denne metoden 3 desimaler riktig, mens for høgre- og venstresummene ikke dette tilfelle med n = 500 en gang. e) Vi lager tre funksjonsler for hver av de tre funksjonene. Den for R Pn,Sn,v b a f(x) dx ser slik ut: function D=RiemannDiffV(n) % Funksjon som regner ut absoluttverdien av differanse mellom et integral % og en Riemann-sum for en regulær partisjon og venstre-seleksjon. % "Fasiten": Integral=2/3+exp(1)-1/exp(1); % Grenser a=-1; b=1; % Maskevidde DeltaX=(b-a)/n; % Partisjon (har n+1 elementer): P=a:DeltaX:b; % Seleksjon (har n elementer) Sv=P(1:n); % Setter summen til null: RsumV=0; % For-løkke som regner summen for :n XvStjerne=Sv(i); RsumV=RsumV+IntFunk(XvStjerne)*DeltaX; end D=abs(RsumV-Integral); 8
Figur 1: Figuren viser forskjellen mellom integralet og de tre Riemann-summene for ulike verdier av n. Til venstre ser vi et vanlig plott, mens plottet til høgre bruker logaritmiske akser. og heter RiemannDiffV.m. De andre to ser tilsvarende ut og har tilsvarende navn. Når du lager tre.m-ler som er så like, bruker vi så klart klipp og lim-metoden for alt den er verd. Det bør nevnes at det er mulig å lage ei funksjonsl som gir alle tre funksjonsverdiene i ett spør gjerne oss lærere om du vil vite hvordan. Vi lager et skript som lager plottet: % Velger n-verdier nvektor=2:5:30; % Lager vektorer for plotting indeks=1; for n=nvektor VenstreVektor(indeks)=RiemannDiffV(n); HogreVektor(indeks)=RiemannDiffH(n); MidtVektor(indeks)=RiemannDiffM(n); indeks=indeks+1; end % Plotter plot(nvektor,venstrevektor,'bx-','linewidth',2) set(gca,'fontsize',15) hold on plot(nvektor,hogrevektor,'r+-','linewidth',2) plot(nvektor,midtvektor,'mo-','linewidth',2) hold off legend('venstre-seleksjon','hogre-seleksjon','midt-seleksjon') Resultatet er vist i gur 1. Resultatet er vist både som et vanlig plott og som et logaritmisk plott. Logaritmiske plott lager man på samme måte 9
som vanlige plott bortsett fra at man skriver `loglog' i stedet for `plot'. Legg merke til at på et slikt plott ser feilen ut til å gå som rette linjer. Den grønne går klart bratteste nedover altså avtar feilen mye raskere med n for midtpunktsseleksjon enn for høgre- og venstreseleksjoner. Konklusjonen bør være ganske tydelig: Riemann-summen konvergerer mye raksere mot integralet om vi velger midtpunktene enn når vi velger endene. 10