Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Læringsmål:

  •  Kap løkker PLACEHOLDERFunksjoner

 

a)

Lag funksjonen f gitt av; f(x)=e^{-x^2}
Denne skal kunne regne på lister.

Code Block
languagenone
f(0) % skal skrive ut 1
 
f (1) % skal skrive ut 0.3679
 
f ([-1.5:0.5:1.5]) % skal skrive ut [0.1054, 0.3679, 0.7788, 1.0000, 0.7788, 0.3679, 0.1054]

b) 

Plott funksjonen fra -2 til 2 med steglengde 0.01

c)

Plott funksjonen fra -2 til 2 med steglengde 0.1 . 
Bruk hold on før plot funksjonen kjøres. Da vil neste plot tegnes på det forrige. Resultatet blir ca: 

Image Removed

d)

Noen funksjoner er sure og kan derfor ikke integreres analytisk. Derfor kan dette gjøres nummerisk, altså tilnærmes. 
Se på plottet ovenfor, og legg merke til at de to grafene nesten ligger oppå hverandre. Legg også merke til at den blå linjen, sammen med bunnlinjen og de vertikale grå linjene, danner trapeser. Trapes er enkelt å regne ut arealet for (smile)

Lag funksjonen trapezArea(r, s, h) som returnerer arealet til et trapes. A = \frac{r+s}{2}*h
r og s er lengden på de parallelle sidene i trapeset. h (eller dx) er avstanden mellom disse.

e)

Lag funksjonen trapezMethod. Prameterene er start, stop, n og fn. 

Code Block
languagenone
trapezMethod (0, 2, 10, @f) % skal skrive ut 3.5875
trapezMethod (0, 2, 2, @f) % skal skrive ut 4.0391
trapezMethod (0, pi , 10, @sin ) % skal skrive ut 1.9835

Du får bruk for at:  

Definerer en vanlig (mattematisk) funksjon:

Code Block
languagenone
function y = f(x)
y = x;
end

 

  • 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
Function handles i Matlab - forklaring
Function handles i Matlab - forklaring



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.

      Hvor

Her er 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:

Code Block
languagenone
% 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

...

:

Code Block
languagenone
function yg = g@(x, fn)
	% her kaller vi på funksjonen som er lagret i parameteren fn
	y = fn(x) * fn(x);
end

 

...

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:

Code Block
languagenone
dispf = @( g ( 2, @f ) ); % legg merke til krøllalfa - tegnet!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.