Læringsmål:
- FunksjonerElementvis operasjoner
- Numerikk
- While-Løkker
Pensum:
...
- 2.3 - Scalar and Array Operations on Vectors and Matrices
- 3.7 - User-Defined Functions That Return a Single Value
- 5.3 - While Loops
- 10.2 - Uses of Function Handles
Deler av denne oppgaven omhandler bruk av såkalte function-handles i Matlab. Dersom du ikke vet hvordan man bruker disse finner du en forklaring nedenfor:
Include Page | ||||
---|---|---|---|---|
|
Noen funksjoner er
...
transcendentale og kan derfor ikke integreres analytisk.
...
Men de kan (av og til) integreres numerisk, altså tilnærmes.
Nedenfor er Simpsons metode, som dere kanskje har lært om i matematikk 1, forklart kort.
Areal: Hvor
Her er for en i ,og funksjonen du vil integrere, f(x).
Se lengre ned for bruk av funksjoner som parametere i andre funksjoner.
...
Fordi n må være partall, må funksjonen isEven(n)
lages. Returvariabelen er 1 eller 0 om n er partall eller ikke. Er det egentlig nødvendig å lage en egen funksjon for dette?
b)
...
.
c)
= [1,2,...,n+1]. n må være et partall. Legg merke til at det brukes n+1 y-verdier.
...
a) Implementer
simpsons(a, b, n, fn)
ved gitt pseudokode:
Code Block | ||
---|---|---|
| ||
% Ta inn a, b, n og funksjonen fn. % Sjekk at n er partall, gi feilmelding hvis ikke. % Gå videre: % La variabelen y inneha alle funksjonsverdiene til fn fra a til og med b med steglende deltaX. % velg odde yer: y1,y-er: y3, y5 ... y_(n-1) % regn ut 42*summen av disse % velg partall yery-er: y2, y4, y6 ... y_(n-2) % regn ut 24*summen av disse % legg sammen de to summene sammen med y_01 og y_(n+1) % gang alt med \deltaX/3 . |
d)
Test funksjonen med følgende kall:
Code Block | ||
---|---|---|
| ||
g = @(t) sin(t).^t simpsons(0, |
...
1, |
...
100, g) % skal returnere 0.7487
h = @(t) exp(-(t.^2))
simpsons(0, 1, 100, h) % skal returnere 0.7468 |
b) Feilen for Simpsons metode er gitt som en funksjon av den fjerdederiverte. Ofte er det vanskelig å finne gode skranker for feilen, men vi ønsker likevel å ha en viss kontroll på hvor stor feil vi gjør. Vi skal nå se på en mulig praktisk løsning på problemet.
La Sn
være tilnærmingen til integralet vi får når vi bruker Simpsons metode med n delintervaller. Det er rimelig å anta at S8
er mye mer nøyaktig enn S4
. Det betyr at |S4 − S8|
kan være et rimelig estimat for feilen i tilnærmingen S4
. Hvis dette estimatet sier at feilen i S4
er for stor kan vi i stedet bruke S8
som tilnærming. Nå kan vi finne et estimat for feilen i S8
ved å regne ut S16
og bruke |S8 − S16|
som estimat. Slik kan vi fortsette i det uendelige. Vi stopper når feilestimatet blir mindre enn en oppgitt toleranse.
Skriv funksjonen simpsons_error(start, stop, error, fn)
som tar inn start
og stop
som integrasjonsgrenser, feiltoleransen error
og funksjonen fn
som skal integreres. Funksjonen skal returnere funksjonen fn
integrert numerisk, samt skrive ut antall ledd som kreves for å komme innenfor feiltoleransen error.
Test funksjonen med følgende kall
e)
Lag funksjonen deviation(a,b,n, fn, corr)
. corr er det analytiske svaret. Funksjonen skal returnere feilen mellom det korrekte svaret, og svaret funnet ved hjelp av simpsons metode.
f)
Mattematisk bonusspørsmål:
Simpsons metode er en annenordens metode. Hva har det med det logaritmiske plottet under å gjøre?
Code Block | ||
---|---|---|
| ||
n =200;
c = 1;
for i = [2:2:n]
e(c) = simpsons(0,pi,i,@sin);
c = c+1;
end
loglog([1:n/2], e-2) |
...
Du får bruk for at:
Definerer en vanlig (mattematisk) funksjon:
Code Block | ||
---|---|---|
| ||
function yf = f@(xt) y = x; end |
Slik definerer vi en funksjon som benytter seg av en annen funksjon (fn) som parameter:
Code Block | ||
---|---|---|
| ||
function y = g(x, fn)
% her kaller vi på funksjonen som er lagret i parameteren fn
y = fn(x) * fn(x);
end |
Kaller på funksjonen g og sender inn f. Når man står utenfor funksjonen må det stå et krøllalfa foran funksjonen som skal være en parameter.
Code Block | ||
---|---|---|
| ||
disp ( g ( 2, @f ) ); % legg merke til krøllalfa - tegnet! sin(t) >> simpsons_error(0, 1, 10^-4, f) Antall ledd: 4 ans = 0.459707744927311 % Skriv format long før du kjører koden. |