Nedenstående er 1 opgave i databehandling og en opgave i Newtons metode med brug af function samt en række mindre øvelser under eksersits (Fra A. P. Ravn) de sidste kan være nyttige hvis man vil gøre erfaringer med de grundlæggende egenskaber af functions if-sætninger og løkker.

Opgave 1 i databehandling med funktioner (dampdata)

På filen dampflow findes dataoptagelser af det dampflow der er gået igennem turbinen på kraftværket i Esbjerg i løbet af en periode på 12 timer. Data er samplet med 20 sekunders mellemrum (samplingtiden h = 20 sek). Dampflowet er målt i kg/sekund. Der er tæt på at være proportionalitet mellem dampflow og den effekt der produceres.

Opgave 2: Newtons metode med function

Lav en function med navn 'newton' og følgende syntaks

resultat = newton(fx_dfxdx,xstart,tolerance)

hvor fx_dfxdx er navnet på en function som returnerer dels en funktionsværdi, dels den afledede af funtionsværdien mht argumentet. xstart er startpunkt for iterationen og tolerance er den ønskede tolerance på resultatet. Syntaksen bliver altså:

[fx,dfxdx] = fx_dfxdx(x)

Afprøv 'newton' med funktionen x-cosx som også skal lægges ind i en function.

Prøv med forskellige startpunkter og tolerancer

Eksersits

Vi vil konstruere en række varianter over en simple funktion "test", som afprøver de forskellige konstruktioner.
A Valgsætninger
1. Først kaldes program-redigering frem gennem menuen "Files", punktet "New" (M-file). Vi vil nu indtaste funktionshovedet::
  function resultat = test(argument)
Nøgleordet "function" angiver at vi definerer en ny funktion med navnet "test". Resultatet skal kaldes "resultat" og den skal kaldes med en værdi, som vi  kalder "argument".

2.  Vi vil først prøve med If-konstruktionen. Indtast følgende under funktionshovedet:
  if argument, 
resultat = 'argument har værdien sand';
end
Derpå gemmes med  redigeringsprogrammets  "Save", idet navnet skal  være "test"  ( med filtype bliver det "test.m").

3. Vi kan nu fra ordrelinjen kalde test med forskellige argumentværdier:. Prøv test(1), test(0 og , test(-1). Hvornår er en argumentværdi ikke sand?

4. Prøv også med  test([1 0]), test([1 -1])  og test(eye(3)). Hvornår er en argumentværdi sand?

5. Rediger nu i testprogrammet (Files, Open hvis I har lukket "MATLAB editor"). Idet vi  erstatter "end" med
  else
resultat = 'argument har værdien falsk';
end
og gentag afprøvningen med forskellige argumentværdier.

6. Navnene "resultat" og "argument" er tilfældigt valgte. Erstat dem med "r" og "x" igennem hele programmet. Brug redigeringsprogrammets "Replace". Ændrer det virkningen af et kald?  Man kan faktisk også ændre funktionsnavnet, da funktionen findes gennem m-filens navn; men det er en dårlig skik at gøre det.

7. Udskift "kroppen" af funktion "test" med:
  switch x,
case 3,
r = 'argument er stort';
case {0, 1 2},
r = 'argument er lille';
end
og afprøv den ændrede funktion. Prøv også test([1 2]).

8. Med "otherwise" kan man fange værdier forskellig fra 0,1,2 og 3. Burg evt. "help switch" til  at finde ud af syntaksen og ret "test", så den giver resultatet 'argument  ude af område' for disse værdier.
B løkker
1. Vi begynder med for-løkken. Skift kroppen i "test" ud med:
  r = 0;
for k = x,
disp(k);
r = r+1;
end
Resultatet er antal  iterationer (antal gange løkken gentages). For hver trin udskrives den aktuelle værdi af  løkke-variablen "k". Afprøv den med forskellige argumenter: test(0), test(5), test([]), test([ 1 5 7 ]), test([1 ; 5 ; 7]), test([1 2 3 ; 3 2 1])  er gode eksempler.

2. Læg mærke til at "k" er lokal i funktionen - den er ikke defineret ude i  ordrelinjen (det program, hvorfra funktionen kaldes). Prøv at finde værdien for ved at indtaste "k". Hvad gælder der for "x" og "r" er de også lokale?

3. Egentlig behøver man ikke at konstruere løkker. Funktionskald og valg-sætninger er tilstrækkelige. Afprøv følgende rekursive definition af  "test":
  function r = test(x)
s = size(x);
if s(2),
k =x(:,1);
disp(k);
r = test(x(:,2:s(2))) +1;
else
r = 0;
end
4. Vi kunne også skrive det som en  while-løkke:
  function r = test(x)
r = 0;
s = size(x);
columns = s(2);
while columns,
k =x(:,1);
disp(k);
r = r+1;
x = x(:,2:columns);
columns = columns-1;
end
Afprøv denne version.

Palle Andersen, Tom S. Pedersen 2008-05-3