Skip to end of metadata
Go to start of metadata

Læringsmål:

  • Funksjoner
  • 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:

 Function handles i Matlab
Du har til nå forhåpentligvis blitt godt kjent med funksjoner i Matlab, og hvordan de kan ta inn forskjellige variabler som parametere. I denne oppgaven skal vi nå introdusere et nytt konsept: Funksjoner kan i tillegg til vanlige variabler også ta inn andre funksjoner som parametre. Dette gjøres på ganske lik måte som når man tar inn en variabel som parameter, og du får her et eksempel på hvordan dette gjøres:
Vi definerer først en helt vanlig funksjon f(x) som vi skal bruke i neste steg, denne tar bare inn tallet x og opphøyer det i andre:
 
function y = f(x)
 y = x^2;
end
 
Her kommer det nye - vi definerer nå en ny funksjon g(x) som tar inn et parameter fn. Dette er navnet på en vilkårlig funksjon som skal tas inn, og kan brukes som en hvilken som helst annen type funksjon:
 
function y = g(x, fn)
 y = sqrt( fn(x) ); % her kaller vi på funksjonen som er lagret i parameteren fn, sender inn x i denne og tar kvadratroten av resultatet.
end
 
Nedenfor kaller vi på funksjonen g(x) med x=2 og sender inn funksjonen f(x) som fn. Forskjellen fra det man er vant til her er at nå må det stå et krøllalfa foran funksjonen som skal være en parameter.
 
x = 2;
y = g(x, @f)) % legg merke til krøllalfa-tegnet forann f!
 
Kan du se hva resultatet av dette vil gi? Det kan kanskje være enklere å se hvis man omformulerer det god gammeldags matematikk. Prøv dette selv, blir det riktig?



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.

  \( \int\limits_a^b f(x)\textrm{dx} \approx \frac{\Delta x}{3}(y_1+4y_2+2y_3+4y_4+2y_5+ ... + 2y_{n-1} + 4y_n + y_{n+1}) \)      Hvor \( \Delta x = \frac{b-a}{n} \)

Her er  \( y_i = f(a + (i-1) \cdot \Delta x) \) for i = [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:

% 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 y-er: y3, y5 ... y_(n-1)
	% regn ut 2*summen av disse
% velg partall y-er: y2, y4, ... y_n
	% regn ut 4*summen av disse
% legg sammen de to summene sammen med y_1 og y_(n+1)
% gang alt med \deltaX/3 . 

 

Test funksjonen med følgende kall:

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 S4Hvis 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:

f = @(t) sin(t)
>> simpsons_error(0, 1, 10^-4, f) 
Antall ledd: 4
ans =  
     0.459707744927311 
% Skriv format long før du kjører koden.