Per Lindström
Inst. För Datavetenskap, UmU
MATLAB
MATrix  LABoratory
avancerad ”räknedosa”
utvecklingsmiljö och“programmeringsspråk”
visualisering av data
avancerad grafik
1
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
MATLAB
2
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Användbara kommandon
help kommando –visar hjälptext ikommandofönstret
doc – öppnar Matlab-dokumentationen
who/whos – listar variabler
format – anger formatet på utskriften
clear all – ta bort alla definierade  variabler
3
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Språket - kommandosyntaxen
liknar ”matematik” med C syntax
stor uppsättning kommandon ochfunktioner
-avancerade algoritmer
-ursprungligen inriktat mot linjär algebra
enkelt konstruera egna program/script ochfunktioner (M-filer)
4
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Variabler m.m.
ingen variabeldeklaration
-variabler definieras genom tilldelning
den grundläggande datatypen är double(normalt 16 decimaler)
-elementen är i de flesta fall reella (kan varakomplexa)
det grundläggande dataformatet ärmatriser
1×1-matriser kallas skalärer
case-sensitive
5
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
…variabler m.m.
resultat lagras i ans (om ingen tilldelning)
tilldelningar sker med =
>> A = 7.5*2 (resultatet i A)
A =
    15
>> 7.5*2  (resultatet i ans)
ans =
    15
semikolon undertrycker utskrifter
kommentarer inleds med % och räckerresten av raden
6
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
: operatorn
start : steg  : stopp
ger en följd av värden
till exempel 1:2:9 ger vektorn [1 3 5 7 9]
start : stopp
steget är 1
x = -pi/2:pi/30:pi/2
ger en radvektor
7
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Grafik- 2D
plot
-ritar ut en mängd av ordnade talpar (punkter,linjer, färger)
fplot
-graf till funktion i en variabel
hold
-håller kvar aktuellt grafikfönster, så att flerafigurer kan ritas i samma fönster
olika kommandon för text i grafikfönster
-xlabel, ylabel, title,...
8
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Elementoperationer
x = linspace(0,1);%  OBS! Radvektor
n=2;
y = x.^n.*exp(x);
plot(x,y,'k')
n=3;
hold on
plot(x, x.^n.*exp(x))
9
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Kod direkt i kommandofönstret
>>x = linspace(0,1);%  OBS! Radvektor
>>n=2;
>>y = x.^n.*exp(x);
>>plot(x,y,'k');
>>n=3;
>>hold on
>>plot(x, x.^n.*exp(x))
>> title('x^n*exp(x) för n=2 och n=3')
>> xlabel('x-axeln')
>> ylabel('y-axeln')
>> axis([-1 1 -1 3])
>> v=axis;
>> plot([v(1) v(2)],[0 0]) %Rita y=0
>> plot([0 0], [v(3) v(4)]) %Rita x=0
10
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Slutlig figur (som Figure 1)
11
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Subplottar
%Test subplot() by plotting different functions
%in different plot windows
%
x=linspace(0,1);
for n=0:10
    y=x.^n .* exp(x);
    subplot(4,3,n+1)
    plot(x,y)
    nchar=num2str(n);
    title(strcat('x^n*exp(x) where n= ', nchar))
end
12
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Subplottar
13
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Funktioner
en funktion  ̶  en fil
-om en fil innehåller flera funktioner kan endast den förstaanropas, de andra är interna funktioner
första kommandoraden skall innehålla ordet function
-(annars en kommandofil/script/huvudprogram)
-function [utparametrar] = namn(inparametrar)
noll, en eller flera in-/utparametrar – värdeparametrar
anropas med: [utparametrar] = filnamn(inparametrar)
-ger funktionen samma namn som filen
de första kommentarraderna (fram till blankrad eller förstakommandorad) skrivs ut vid>> help filnamn
14
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Mata in i editorn och spara myf() påfil namn myf.m
function y = myf(x)
%Evaluate f(x)=sin(x)+x^3-x^2+1.5
%Call: y=myf(x)
%
y=sin(x)+x.^3-x.^2+1.5;
Skriv i kommandofönstret
>> help myf
 Evaluate f(x)=sin(x)+x^3-x^2
 Call: y=myf(x)
>>t=-2:0.1:2;
>>y=myf(t);
>>plot(t,y)
15
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Plot av: sin(x)+x^3-x^2+1.5
16
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Elementära matematiska funktioner
help elfun
  Elementary math functions.
  Trigonometric.
    sin       - Sine.
    sind      - Sine of argument in degrees.
    sinh      - Hyperbolic sine.
    asin      - Inverse sine.
    asind     - Inverse sine, result in degrees.
    asinh     - Inverse hyperbolic sine.
    cos       - Cosine.
Och många fler…..
17
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Problemet måste definieras i en funktion
help funfun
  Function functions and ODE solvers.
 
  Optimization and root finding.
-fminbnd    Scalar bounded nonlinear functionminimization.
-fminsearch Multidimensional unconstrainednonlinear minimization,
-fzero      - Scalar nonlinear zero finding.
Och många fler……..
>> help fzero
 FZERO  Scalar nonlinear zero finding.
    X = FZERO(FUN,X0) tries to find a zero of
    the function FUN near X0,
    if X0 is a scalar.
18
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Prova använda fzero()
>> help myf
 Evaluate f(x)=sin(x)+x^3-x^2+1.5
 Call: y=myf(x)
>> xzero=fzero('myf',0.9)
xzero =
   -0.7062
>> myf(xzero)
ans =
 -4.4409e-016
19
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
S.k. anonyma funktioner
FUNHANDLE = @(ARGLIST)EXPRESSION constructs ananonymous function and
     returns a handle to that function.
>> format short
>> fh=@(x)x.^2-2; %Def. av anonym funktion
>> fh(-2);
>> t=-2:0.1:2;
>> y=fh(t);
>> plot(t,y)
>> tzero=fzero(fh,1.3)
tzero =1.4142
>> fh(tzero)
ans =4.4409e-016
20
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
X^2-2 i [-2..2]
21
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Matriser
tilldelning
omges av hakparenteser [ ]
tilldelning sker radvis
blank eller komma mellan elementen
rader i matrisen skiljs med semikolon ellerny rad
värdet av en variabel
variabelns namn följt av retur
22
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
Skapa en matris
23
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
Enstaka element i matrisen adresserasmed rad- resp. kolumnindex 1,2,….
variabelnamn(radindex,kolumnindex)
        A(1,3)
Observera!  skillnadmellan tilldelning ochadressering
24
Mom 3, 5DV104, 5DV105     HT09
A=[1 5;10 15;-2 6]
ger A (3*2)-matris
A(1,1)=100
ändrar (1,1)-elementet
Stefan Johansson
Department of Computing Science, Umeå University
Del av matrisen
i:te radenA(i,:)
j:te kolumnenA(:,j)
DelmatrisA(i:j,k:l)
alla
25
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Att skapa matriser
ones(n)× n-matris med ettor
ones(m,n)× n-matris med ettor
zeros(n)× n-matris med nollor
eye(n)en enhetsmatris n × n 
diagger diagonalen/skapardiagonalmatris
triu,trilger över/under trianguläramatriser
26
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Matrisoperationer
A’(konjugerade) transponatet
det(A)determinanten
inv(A)inversen
eig(A)egenvärdena
norm(A)2-normen
A*B, A+B
matrisoperatorer!
27
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Strängar
strängar är av datatypen char
de lagras som matriser
strängkommandon
-strcmp, strncmp
-strcat
-strfind, findstr
-strrep
-lower, upper
-int2str, str2double
-sprintf
-...
>>s = ’detta är en sträng’s =detta är en sträng>>s(2)ans =e>>s2 = s(5:10)s2 =a är e
Exempel:
28
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Kontrollstrukturer...
for variabel = uttryck
satser
end
for I = 1:2:n
satser
end
for i= 1:n
satser
end
for (i=1; i<=n;i=i+2)
{
satser
}
jmfr. C / Java
29
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
…kontrollstrukturer...
if logiskt uttryck
satser
end
if logiskt uttryck
satser
elseif logiskt uttryck
satser
end
if logiskt uttryck
satser
else
satser
end
30
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
...kontrollstrukturer...
logiska operatorer
 & (och)
 (eller)
 (inte)
relations operatorer
 == (lika med)
 ~= (skilt från)
 och > (mindre/större än)
 <= och >= (mindre än eller lika med resp. större äneller lika med)
31
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
32
Mom 3, 5DV104, 5DV105     HT09
Andra användbara funktioner vid kontrollerany(), all(), ismember()
Exempel
a=[1:10]; b=[1 2 3 4 5];
if(any(a<0)) %värde falskt
   do something
else
   do something else
end
Exempel
-ismember(b,a);
Ger vektor [1 1 1 1 1 ]
-ismember(a,b);
Ger vektor [1 1 1 1 1 0 0 0 0 0]
Per Lindström
Inst. För Datavetenskap, UmU
...kontrollstrukturer...
while logiskt uttryck
satser
end
x=0.1
while x < 3
x = x*1.1
end
Exempel:
33
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
...kontrollstrukturer
switch vilkorsuttryck
case vilkor1
satser
case {vilkor2,vilkor3,...}
satser
  :
[otherwise]
satser
end
vilkorsuttrycket kanvara en skalär ellersträng
34
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Skärmutskrift och inläsning
returvärdet från kommandon som inteavslutas med semikolon skrivs ut
kommandon för utskrift
fprintf – formaterad utskrift (C syntax)
disp – textutskrift eller matriser
Ex. disp(’Rubrik över en tabell’)
T.ex. om a och b är radvektorer av sammalängd: disp([a’ b’])
35
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
36
Mom 3, 5DV104, 5DV105     HT09
Input() för inläsning via tangentbordet
Ex. postal=input(’Ge positivt heltal’);
Inmatning av sträng görs med
Ex. str=input(’Ledtext ’,’s’);
Utan ; i slutet ger utskrift av det nyss inmatade
Stefan Johansson
Department of Computing Science, Umeå University
37
Mom 3, 5DV104, 5DV105     HT09
%A program to roll 2 ordinary dice a number oftimes.
%Number of times is input by the user.
%The program produces statistics for results2,3,4...,11,12
%
disp('The program simulates rolling 2 dice anumber of times')
num=-1; % Initiate for the while-loop
while num <= 0
   num=input('Give number of simulations (>0): ')
end % of while
tab=zeros(12,2); % 2:nd column for relativefrequence
%Use the clock to initiate the random sequence
rand('state',sum(100*clock));
Stefan Johansson
Department of Computing Science, Umeå University
38
Mom 3, 5DV104, 5DV105     HT09
%Simulate and save
for i=1:num
    res=rolldice+rolldice;
    tab(res,1)=tab(res,1)+1;
end %of for
%Compute relative frequence
tab(2:12,2)=tab(2:12,1)/num;
%Print
format short
format compact
utfall=2:12;
disp('disp does not print results readable')
disp('DICE_Sum     Totals    Relative freq.')
disp([utfall(:) tab(2:12,:)])
disp('Using FPRINTF gives better print out')
%NOTE the transpose of tab
disp('DICE_Sum     Totals    Relative freq.')
%The matrix is printed column wise
fprintf('%3d  %10d   %10.3f\n',[utfall;tab(2:12,:)'])
Stefan Johansson
Department of Computing Science, Umeå University
39
Mom 3, 5DV104, 5DV105     HT09
function dice = rolldice
%Roll one ordinary dice. The returned value is
%1, 2, 3, 4, 5 or 6
%Call: s=rolldice
%
dice = 1+floor(rand*6);
Stefan Johansson
Department of Computing Science, Umeå University
40
Mom 3, 5DV104, 5DV105     HT09
>> simdice
The program simulates rolling 2 dice a number oftimes
Give number of simulations (>0): 100000
num =
      100000
disp does not print results readable
DICE_Sum     Totals    Relative freq.
  1.0e+004 *
    0.0002    0.2711    0.0000
    0.0003    0.5509    0.0000
    0.0004    0.8422    0.0000
    0.0005    1.1289    0.0000
    0.0006    1.3767    0.0000
    0.0007    1.6675    0.0000
    0.0008    1.3920    0.0000
    0.0009    1.1153    0.0000
    0.0010    0.8238    0.0000
    0.0011    0.5548    0.0000
    0.0012    0.2768    0.0000
Stefan Johansson
Department of Computing Science, Umeå University
41
Mom 3, 5DV104, 5DV105     HT09
Using FPRINTF gives better print out
DICE_Sum     Totals    Relative freq.
  2         2711         0.027
  3         5509         0.055
  4         8422         0.084
  5        11289         0.113
  6        13767         0.138
  7        16675         0.167
  8        13920         0.139
  9        11153         0.112
 10         8238         0.082
 11         5548         0.055
 12         2768         0.028
>>
Per Lindström
Inst. För Datavetenskap, UmU
 
function fmedel=tabell(fun,xstart,xslut,step)
%Anrop: fmedel=tabell(fun,xstart,xslut,step)
%Funktion som tabulerar den matematiskafunktionen fun
%mellan xstart och xslut med steg step
%fun = filnamn eller funktionshandtag för denmatematiska
%funktionen
%fmdel= medelvärdet av funktionsvärdena
%
t=xstart;
n=0;
while t<=(xslut+eps)
    fx=feval(fun,t);
    n=n+1;
    x(n)=t;
    tabell(n)=fx;
    t=t+step;
end %of while
42
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
 
%Skriv ut
if isa(fun,'function_handle')
    fun=func2str(fun);
end %of if
if n>0
   disp(strcat('Tabell över funktionen ',fun))
   disp('x-värden    f(x)-värden')
   disp([x(:) tabell(:)])%Gör x och tabell tillkolumner
   medel_1=sum(tabell)/n;
else
    disp('Fel i x-argumenten')
    medel_1=0;
end %of if
%Ett annat sätt är med vektorer
x=xstart:step:xslut;
fx=feval(fun,x);
n=length(x);
if n>0
   medel_2=sum(fx)/n;
else
   medel_2=0;
end %of if
fmedel=medel_1;
43
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
44
Mom 3, 5DV104, 5DV105     HT09
function mult(tal)
%Anrop: mult(tal)
%Skriv ut multiplikationstabell för tabell1,2,3...,tal
%Multiplicera talen med 1,2,.....12
%
if tal>0
   for i=1:tal
       for j=1:12
           t(i,j)=i*j;
       end
   end % for i
   disp('Multabeller för talen')
   disp([1:tal])
   disp('-----------------------------------')
   disp(t')
else
   disp('Fel indata')
end % of if
Stefan Johansson
Department of Computing Science, Umeå University
45
Mom 3, 5DV104, 5DV105     HT09
%Ett annat sätt
if tal>0
   rad=1:tal;
   col=1:12;
   disp('ETT ANNAT SÄTT att beräkna')
   A=col'*rad;
   A
end % of if
Stefan Johansson
Department of Computing Science, Umeå University
46
Mom 3, 5DV104, 5DV105     HT09
>> mult(5)
Multabeller för talen
     1     2     3     4     5
-----------------------------------
     1     2     3     4     5
     2     4     6     8    10
     3     6     9    12    15
     4     8    12    16    20
     5    10    15    20    25
     6    12    18    24    30
     7    14    21    28    35
     8    16    24    32    40
     9    18    27    36    45
    10    20    30    40    50
    11    22    33    44    55
    12    24    36    48    60
Per Lindström
Inst. För Datavetenskap, UmU
Spara och öppna/ladda data
datat i definierade variabler kan sparas i en fil (gesfiländelsen .mat)
save
ex. för att spara matrisen A och vektorn b till filen ’minfil.mat’i aktuell katalog>>save minfil A b
load
ex. ladda in filen ’minfil.mat’>>load minfil(skapar A och b i Matlab)
ex. >>load minfil A b
47
Mom 3, 5DV104, 5DV105     HT09
Per Lindström
Inst. För Datavetenskap, UmU
Validering vid inmatning
Skräp in ger skräp ut….. Så man bör validera indata!!!!
T.ex. Inmatning av ett postivt tal
tal=-1;
while tal<0
   tal=input(’Ge positivt tal: ’);
end %of while
T.ex. inmatning av tal i vektor där alla talmåste vara olika och i givet intervall [1..20]
-----”------
rad=[]; %tomma vektorn
disp('Ge 5 tal. Alla olika')
i=1;
while i<=5
   tal=input('Ge tal>>>: ');
   if any(rad==tal) | tal<1 |tal>20
       disp('Fel inmatning. Försök igen')
   else
       rad(i)=tal;
       i=i+1;
   end %of if
end %of while
48
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
%Konverteringstabell mellan Celsius och Fahrenheit
%Formel: Temp(F)=9/5Temp(C)+32
%Låt användaren mata in starttrmp. i C, ökning mellan varje rad
%i tabellen och antalet rader i tabellen
disp('Konverteringstabell mellan Celsius och Fahrenheit');
start = input('Ge starttemp i Celsius: ');
incr = input('Ge steget (mellan rader) i Celsius: ');
total = input('Hur många rader i tabellen: ');
stop = start+(total-1)*incr;
C = start:incr:stop;
F = 9/5*C+32;
more on
format bank
disp('Celsius        Fahrenheit');
disp([C(:) F(:)]);
disp('**************************Med FPRINTF blir utskriften');
disp('Celsius        Fahrenheit');
fprintf('%10.2f %10.2f \n', [C;F]);
Ett exempel till
49
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
>> help CelFah
 
 Konverteringstabell mellan Celsius och Fahrenheit
 Formel: Temp(F)=9/5Temp(C)+32
 Låt användaren mata in starttrmp. i C, ökning mellan varje rad
 i tabellen och antalet rader i tabellen
 
>> CelFah
Konverteringstabell mellan Celsius och Fahrenheit
Ge starttemp i Celsius: -10
Ge steget (mellan rader) i Celsius: 5
Hur många rader i tabellen: 10
Celsius        Fahrenheit
        -10.00         14.00
         -5.00         23.00
             0         32.00
          5.00         41.00
         10.00         50.00
         15.00         59.00
         20.00         68.00
         25.00         77.00
         30.00         86.00
         35.00         95.00
 
50
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
**************************Med FPRINTF blir utskriften
Celsius        Fahrenheit
    -10.00      14.00
     -5.00      23.00
      0.00      32.00
      5.00      41.00
     10.00      50.00
     15.00      59.00
     20.00      68.00
     25.00      77.00
     30.00      86.00
     35.00      95.00
>>
51
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
% Studera felet då derivatan till f(x)=exp(x)
% approximeras med
% fprim(x)= (f(x+h)-f(x-h))/(2h)
%
format compact
x=input('Give x-value for approximation: ')
t=0.1;
i=1;
while t>eps       %Define all h-values in an array
   h(i)=t;
   i=i+1;
   t=t/10;
end %of while
fxph = exp(x+h);
fxmh = exp(x-h);
deriv = (fxph-fxmh)./(2*h);
error = exp(x)-deriv;
format short e
minerr = min(abs(error))
min_ind = find((error == minerr)|(error == -minerr));
52
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
if length(min_ind) == 1
 disp('for h= '), disp(h(min_ind))
else
 disp('There are more than one h-value that give minerror')
 min_ind
end %of if
error = abs(error);
RXF = eps./h; %Beräkningsfel
RT = h.^ 2; %Trunkationsfel
clf
loglog(h,error)
title('Error in central diff-approx. of deriv. tof(x)=exp(x)')
xlabel('10Log h')
ylabel('10Log error')
hold on
loglog(h, RXF, 'r--')
loglog(h, RT, 'k.')
53
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
54
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
function s = xty(x, y)
%Call: s=xty(x,y)
%Beräkna skalärprodukten mellan vectorerna x och y
%med reella element
%
if length(x) ~= length(y)
   error('Vektorerna ska ha samma längd');
   return
end
s = 0;
for k = 1:length(x)
   s = s+x(k)*y(k);
end
% Snabbare variant
x=x(:), y=y(:);
s1 = x'*y;
%Använd fördefinierad funktion dot
s2 = dot(x,y);
if (s == s1) & (s == s2)
   disp('Alla tre summorna lika')
else
   disp('Olika summor');
   format long
   [s s1 s2]
end
55
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
function [terms, sum] = harmoni(upper)
%Compute the sum of 1/k; k=1,2,3,4,5,.........
%until that sum exceeds upper.
%Call: [terms,sum] = harmoni(upper)
%terms = no. of terms in the sum
%sum = the actual sum
%Also there is a printout for each time the sum
%exceeds "the next" integer.
%
sum = 0;
k = 0;
oldsum = -1;
heltal = 1;
while (sum <= upper) & (oldsum ~= sum)
   k = k+1;
   oldsum = sum;
   sum = sum+1/k;
   if sum >= heltal
      fprintf(1,'%d termer behövs för att överskrida %d \n', k,heltal);
      heltal = heltal+1;
   end %of if
end %of while
terms = k;
56
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
>> [termer, summa]=harmoni(15);
1 termer behövs för att överskrida 1
4 termer behövs för att överskrida 2
11 termer behövs för att överskrida 3
31 termer behövs för att överskrida 4
83 termer behövs för att överskrida 5
227 termer behövs för att överskrida 6
616 termer behövs för att överskrida 7
1674 termer behövs för att överskrida 8
4550 termer behövs för att överskrida 9
12367 termer behövs för att överskrida 10
33617 termer behövs för att överskrida 11
91380 termer behövs för att överskrida 12
248397 termer behövs för att överskrida 13
675214 termer behövs för att överskrida 14
1835421 termer behövs för att överskrida 15
57
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
>> termer
termer =
     1835421
>> format compact
>> summa
summa =
   15.0000
>> format long
>> summa
summa =
  15.00000037826723
58
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
function [pos, neg] = split1(x)
%Call: [pos, neg]=split1(x)
%x= a vector with numeric values
%pos= a vector containing the positive values of x
%neg= a vector containing the negative values of x
%
%This is the straight forward solution in Matlab
indpos = 0;
indneg = 0;
for k=1:length(x)
   if x(k)<0
      indneg = indneg+1;
      neg(indneg) = x(k);
   else
      indpos = indpos+1;
      pos(indpos) = x(k);
   end %of if
end %of for k=......
59
Mom 3, 5DV104, 5DV105     HT09
Stefan Johansson
Department of Computing Science, Umeå University
>> type split2
function [pos, neg] = split2(x)
%Call: [pos, neg]=split2(x)
%x = a vector with numeric values
%pos = a vector containing the positive values of x
%neg = a vector containing the negative values of x
%
%This is the short, but not obvious solution in Matlab
indpos = find(x>=0);
indneg = find(x<0);
pos = x(indpos);
neg = x(indneg);
60
Mom 3, 5DV104, 5DV105     HT09