Stora problem och m

Programmering, del 2
Beräkningsvetenskap I
Informationsteknologi
Stora problem och m-filer
n 
Hittills har vi haft en m-fil (kommandofil) för
varje program när vi löst ett problem eller skrivit
Matlab-kod direkt i kommandofönstret
n 
Större problem måste delas upp i delproblem,
var och en med egen algoritm
n 
Varje delproblem löses för sig oberoende av det
större problemet
n 
Man behöver på det sättet bara ha kontroll över
ett delproblem i taget
Institutionen för informationsteknologi | www.it.uu.se
1
Informationsteknologi
Huvudprogram och underprogram
n 
Delproblemen blir vanligen en egen Matlabfunktion, eller flera funktioner (delproblemen kan
innehålla egna underprogram)
n 
Större program blir uppdelade i fler delprogram
(underprogram), dvs flera m-filer per problem
(funktionsfiler och kommandofiler)
n 
En av m-filerna (vanligen kommandofil) utgör
själva huvudprogrammet – detta styr
problemlösningen och anropar funktionerna.
Institutionen för informationsteknologi | www.it.uu.se
Informationsteknologi
Huvudprogram och underprogram
% Prog5.m, Huvudprogram som anropar underprogram
disp('Testa tidigare programexempel (1-4)');
test=input('Ange programexempel (1-4), avsluta med 0:');
while test~=0
if test==1
Prog1;
elseif test==2
Prog2;
elseif test==3
Prog3;
elseif test==4
Prog4;
else
disp('Alternativet ej giltigt!');
end
test=input('Ange programexempel (1-4), ...
avsluta med 0:');
end
Uppgift: Ladda ner program Prog5.m och testkör.
Institutionen för informationsteknologi | www.it.uu.se
2
Informationsteknologi
Kommandofiler och funktioner
n 
En kommandofil är ett sätt att ”lagra”
kommandon som annars skulle skrivits
interaktivt. Genom att köra filen så exekveras
alla kommandon i den. Kommandofiler
är ofta specifika för ett visst problem.
n 
Funktioner kan liknas vid en ”svart låda”. Man
stoppar in indata (inparametrar) och får som
resultat utdata (utparametrar).
indata
n 
utdata
Den svarta lådan har egna variabler, för
mellanlagring av data, som vi utanför ej
behöver bry oss om (eller kan se)
Institutionen för informationsteknologi | www.it.uu.se
Funktioner
Informationsteknologi
n  Det
finns många inbyggda (fördefinierade)
funktioner i MATLAB
Exempel:
if abs(sum(x)) > 10
plot(x,y)
end
Egentligen är abs, sum, plot funktioner i
filerna abs.m, sum.m, plot.m
Institutionen för informationsteknologi | www.it.uu.se
3
Informationsteknologi
Funktioner
n 
Funktioner
är tänkta att kunna återanvändas i flera
program för olika problem av liknande sort
(jfr Matlabs inbyggda funktioner)
n 
Att skriva funktioner
®  tänk först på vad som ska in och vad som
ska ut ur funktioner, dvs in- och
utparametrar
®  Ha inga onödiga utskrifter, vanligen bara
varningsutskrifter – användaren bestämmer
om något ska skrivas ut eller ej
Institutionen för informationsteknologi | www.it.uu.se
Informationsteknologi
Funktioner exempel
Funktion som beräknar medelvärdet av två tal.
function z = medelfunk(x, y)
% z = medelfunk(x,y)
% Beräknar medelvärdet av två tal, x, y
z = ( x + y )/2;
Anrop från kommandofilen main.m:
a=2; b=6; c = medelfunk(a,b);
disp(['medel = ', num2str(c)]);
Ger vid körning resultatet
>> main
medel = 4
Här: två in och en utparameter
Institutionen för informationsteknologi | www.it.uu.se
4
Funktioner exempel
Informationsteknologi
n 
Inledande kommentarer i funktioner visas då
man använder help-kommandot (precis som i
kommandofiler)
>> help medelfunk
z = medelfunk(x,y)
Beräknar medelvärdet av två tal, x, y
n 
Kommentaren bör beskriva hur man anropar
funktionen och kort vad den gör – man ska
kunna använda funktionen bara genom hjälptexten
Institutionen för informationsteknologi | www.it.uu.se
Funktioner
Informationsteknologi
n 
En funktion måste alltid börja med
funktionshuvud, t ex
function [x, y] = cossin(x0, x1, n)
utparametrar
n 
n 
inparametrar
Obs! inled alltid med function
Antalet in- och utparametrar kan vara
godtyckligt många (beroende på vad man
behöver till funktionen)
Filnamn måste överensstämma med
funktionsnamn, dvs här cossin.m
Institutionen för informationsteknologi | www.it.uu.se
5
Funktioner och parametrar
Informationsteknologi
n 
Skriv i filen cossin.m följande funktion:
function [x, y] = cossin(x0, x1, n)
% [x, y]=cossin(x,y,n)
% Beräknar cos(x)+sin(x) på intervallet
% [x0 x1] i n punkter
x = linspace(x0,x1,n);
y = cos(x)+sin(x);
n 
Funktionen anropas t ex genom:
>> xstart=0; xslut=pi; n=100;
>> [x1,y1] = cossin(xstart,xslut,n);
Institutionen för informationsteknologi | www.it.uu.se
Funktioner och parametrar
Informationsteknologi
>> [x1, y1] = cossin(xstart,xslut,n);
function[x, y] = cossin(x0, x1, n)
x = linspace(x0,x1,n);
y = cos(x)+sin(x);
Utanför funktionen i funktionen utanför funkt
xstart
à
x0
xslut
à
x1
n
à
n
x
à
x1
y
à
y1
Institutionen för informationsteknologi | www.it.uu.se
6
Funktioner och parametrar
Informationsteknologi
Olika anrop till samma funktion
>> [t, u] = cossin(0,2*pi,50);
eller…
>> [a, b] = cossin(pi,3*pi,150)
Medför att a och b skrivs ut (inget semikolon)
eller…
>> a1 = 0; a2 = 2*pi;
>> [a1,a2]=cossin(a1,a2,50);
OBS! Variablerna a1 och a2 får nya värden
efter anrop, skrivs över av utdata.
Institutionen för informationsteknologi | www.it.uu.se
Funktioner och parametrar
Informationsteknologi
Observera också att…
>> [t, u] = cossin(0,2*pi,50);
Leder till att variablerna t
och u bildas, se t ex workspace.
Däremot bildas inte x och y alla variabler som enbart skapas
inne i funktionen är ”interna”.
Man säger att de interna variablerna är lokala.
Institutionen för informationsteknologi | www.it.uu.se
7
Informationsteknologi
Funktioner
Uppgift: Skriv en funktion som löser 2:a
gradsekvationer (pq-formeln). Funktionen ska
kunna anropas:
[x1,x2]=pqformel(p,q);
[w1,w2]=pqformel(-3,2);
etc.
Utgå ifrån följande kod:
% pq-formeln, löser 2:a gradsekvationen
% x^2+ax+b=0
x1=-a/2-sign(a)*sqrt((a/2)^2-b);
x2=x1/b;
Institutionen för informationsteknologi | www.it.uu.se
Okänt antal parametrar
Informationsteknologi
n 
En funktion kan ha egenskapen att den anropas
med olika antal parametrar olika gånger.
®  nargin = antal inparametrar vid anrop
®  nargout = antal utparametrar vid anrop
Ex)
function [x, y, z] = cossin(x0, x1, n)
% [x, y, z]=cossin(x,y,n)
% Beräknar cos(x)+sin(x) på [x0 x1] i
% n punkter
if (nargin==2), n=100; end
x = linspace(x0,x1,n);
y = cos(x)+sin(x);
if (nargout==3), z=x.*y; end
Institutionen för informationsteknologi | www.it.uu.se
8
Okänt antal parametrar
Informationsteknologi
n 
Kan nu anropas med t ex
>> [x, y] = cossin(0, 2*pi);
då sätts n till 100 i funktionen
n 
…eller t ex
>> [x, y] = cossin(0, 2*pi, 200);
n 
…eller t ex
>> [x, y, u] = cossin(0, 2*pi, 200);
n 
Ett sätt att ha s k defaultvärden i funktioner
Institutionen för informationsteknologi | www.it.uu.se
Funktioner som parametrar
Informationsteknologi
Funktioner kan också ta andra funktioner
som inparametrar:
function myplot(func,a,b,n)
if (nargin==3) n=100; end
x=linspace(a,b,n);
y=feval(func,x);
plot(x,y,’r-’);
Uppgift:
Ladda ner
myplot.m och
myfun.m och
testa anropen
Anropas med @-tecken:
>> myplot(@sin,0,2*pi);
>> myplot(@myfun,0,1,10);
där
function y=myfun(x)
y=x.^2+3*sin(x).*cos(x);
Institutionen för informationsteknologi | www.it.uu.se
9
Olika sorters fel
Informationsteknologi
Det finns tre typer av fel, s k buggar som kan
inträffa i program
n 
n 
n 
Syntaxfel
Ett grammatiskt fel. Kan ej översätta Matlabkoden till "datorkod". Felmeddelanden från
Matlab inte alltid så lätta att tolka.
Exekveringsfel
Fel som uppkommer under körningen och medför
att programmet "kraschar", dvs slutar exekvera,
kallas exekveringsfel eller runtime-fel.
Logiska fel
Programmeraren har tänkt fel, men programmet
kör. Svårupptäckt.
Institutionen för informationsteknologi | www.it.uu.se
Informationsteknologi
Vanliga syntaxfel i MATLAB
n 
Skrivfel, t ex plott(x,y);
n 
Utelämnade tecken
t ex multiplikationstecknet, *: 3(x+5)
eller if ~( (x > 0) & (y < pengar*17)
eller if ( x = 1 )…
n 
Felstavat variabelnamn
skyldigMig = 50;
if SkyldigMig > 100
n 
Oidentifierade variabler
t ex glömt initiera sum före loop
for i=1:5, sum=sum+i; end, sum
Institutionen för informationsteknologi | www.it.uu.se
10
Informationsteknologi
Vanliga syntaxfel i MATLAB
n 
Glömd punkt vid elementvisa operationer, ger
??? Error using ==> ^ Matrix must
be square. n 
Skrivit else if, istället för elseif
n 
Slarv med kolon, komma, semikolon
Institutionen för informationsteknologi | www.it.uu.se
Informationsteknologi
Exempel (finn fem fel)
a=input(’a= ’); b=input(’b= ’); c=input(’c= ’);
if (a=0)
disp(’Avbryt, a=0!’);
else
p=b/a;
q=c/a;
s=((p/2)^2-q)^1/2;
while (p<0)
x1=-p/2+s; x2=q/x1;
else
x1=-p./2-s; x2=q./x1;
end
disp(’svar: x1= ’ num2str(x1) …
’ x2= ’ num2str(x1));
end
Uppgift: Ladda ner Prog6.m och rätta felen.
Institutionen för informationsteknologi | www.it.uu.se
11
Goda råd vid programmering
Ha enbart en sats per rad
2.  Indentera (flytta in text) på vettigt sätt.
3.  Använd blanka rader för att dela upp koden i
segment, t ex före/efter block
4.  Kommentera varje block
5.  Använd vettiga variabelnamn och funktionsnamn
6.  Dokumentera gärna variabler och förklara
7.  Ha ett "dokumentationshuvud" i början av filen
Informationsteknologi
1. 
Kanske fel kan undvikas om koden uppfyller detta
J
Institutionen för informationsteknologi | www.it.uu.se
Goda råd…
Informationsteknologi
n 
Effektiv programmering:
®  I största möjliga grad bör vektoroperationer
och inbyggda funktioner användas
Ex) Antag att f = (f1, f2,…,fn) skapats och vi
vill beräkna f1+2f2+…+2fn-1+fn
% Metod 1
tmp = f(1);
for k = 2:n-1
tmp = tmp + 2*f(k);
end
sum = tmp + f(n)
Institutionen för informationsteknologi | www.it.uu.se
12
Goda råd…
Informationsteknologi
n 
Effektiv programmering:
®  Ex forts) Utnyttja att sum är en s.k.
skalärprodukt mellan (1,2,…,2,1) och
(f1, f2,…,fn)T
% Metod 2, vektoroperation
summa = [1 2*ones(1,n-2) 1]*f’;
( f’ => transponat fT )
% Metod 3, inbyggd funktion
summa = f(1)+2*sum(f(2:n-1))+f(n);
Metod 2 och 3 är snabbare än metod 1!
Uppgift: Ladda ner Prog7.m och jämför metoderna
Institutionen för informationsteknologi | www.it.uu.se
Goda råd…
Informationsteknologi
n 
Effektiv programmering:
® 
® 
® 
Behandla vektorer och matriser som ”vilka
variabler som helst”
Skriv generellt. Undvik att skriva funktioner
som bara fungerar för ett problem.
Undvik siffror inne i loopar och inne i program.
Använd bokstäver och sätt konstanter och
parametrar initialt i koden.
Institutionen för informationsteknologi | www.it.uu.se
13
Goda råd…
Effektiv programmering
[m,n] = size(A);
for i = 1:m
for j = 1:n
A(i,j) = A(i,j)-…
end
är bättre än t ex
end
for i = 1:500
for j = 1:400
A(i,j) = A(i,j)-…
end
end
Informationsteknologi
n 
Institutionen för informationsteknologi | www.it.uu.se
Goda råd…
Informationsteknologi
n 
n 
n 
Matlab är enkelt att programmera och felsöka
Enkelt att visualisera resultat
Innehåller mycket färdigdefinierade funktioner
och numeriska lösare
Men Matlab är långsamt…
n  Matlab är interpreterande, dvs varje programrad
måste översättas till maskininstruktioner vid
programkörning
n  Använd Matlab för enstaka experiment eller för
att snabbt testa ideer
n  För produktionskoder använd ett kompilerande
språk, t.ex. C eller C++ (alt Fortran)
Institutionen för informationsteknologi | www.it.uu.se
14
Informationsteknologi
Numeriska beräkningar och simuleringar
är ofta mycket CPU/minnes-krävande
och utförs på parallelldatorer.
Quad-core laptop
Uppsala universitets (UPPMAX)
2784 core PC-cluster
Dual-core mobile
2x6-core PC
⇒  12 cores
1024 core GPU
Institutionen för informationsteknologi | www.it.uu.se
Exempel sortering
Informationsteknologi
Sortera n stycken slumpmässiga tal.
Algoritm:
För varje tal beräkna hur många tal som är mindre
=> Placeringen av talet
Lägg in talet enligt placeringsordningen i ny vektor
15
27
1
3
3
6
25
8
8
15
19
19
1
21
21
22
6
25
22
27
Institutionen för informationsteknologi | www.it.uu.se
15
Matlab
Informationsteknologi
function outdata=enumsort(indata)
% Enkel sorteringsalgoritm
len=length(indata);
outdata=zeros(len,1);
for j=1:len
rank=1;
% rank räknar hur många element som är
% mindre än element j
for i=1:len
if (indata(i)<indata(j))
rank=rank+1;
end
end
% Placera in element j i sorteringsordning
outdata(rank)=indata(j);
end
Institutionen för informationsteknologi | www.it.uu.se
C-kod
int main(int argc, char *argv[]) {
int len,i,j,rank,nthreads;
double *indata, *outdata, time;
Informationsteknologi
printf("Give number of elements: ");
scanf("%d",&len);
indata=(double *)malloc(len*sizeof(double));
outdata=(double *)malloc(len*sizeof(double));
// Generate random numbers
for (i=0;i<len;i++)
indata[i]=((double)rand())/RAND_MAX;
// Sort data
time=timer();
for (j=0;j<len;j++)
{
rank=0;
for (i=0;i<len;i++)
if (indata[i]<indata[j]) rank++;
outdata[rank]=indata[j];
}
time=timer()-time;
printf("Time: %f sec\n",time/1000000);
}
Institutionen för informationsteknologi | www.it.uu.se
16
Informationsteknologi
C-kod
Kompilera koden, dvs översätt C-koden till
maskininstruktioner för den specifika dator som
programmet ska köras på. Koden optimeras
för den aktuella datorarkitekturen.
Kompileringen görs av ett datorprogram,
kompilatorn gcc i det här fallet och utförs i
terminalfönstret (där man ger kommandon
direkt till operativsystemet).
> gcc –O3 –o enum enumsort.c
> ./enum
(Kompilera)
(Exekvera)
~15ggr snabbare än Matlab!
~60ggr snabbare parallelliserad på 4 kärnor!
Institutionen för informationsteknologi | www.it.uu.se
Informationsteknologi
Notera: Det finns effektivare sorteringsalgoritmer, t.ex. Quicksort.
Algoritm Quicksort:
1. Välj ett element, kallas pivotelement
2. Dela upp data i två mängder, i större
respektive mindre element
3. Sortera vardera delmängden med Quicksort
(i ett rekursivt anrop, dvs upprepa 1-3 på
vardera delmängden)
Komplexitet: n.log(n), (jmf n2 för enumsort)
Institutionen för informationsteknologi | www.it.uu.se
17
Informationsteknologi
Exempel: Quicksort >400ggr snabbare än
enumsort, n=50.000
15
27
3
25
8
19
1
21
6
22
Pivot=15
3
8
1
6
15
Pivot=3
1
1
3
3
27
25
19
21
22
Pivot=22
8
6
19 21
Pivot=8
Pivot=19
6
8
6
8
15
19
21
19
21
22
27 25
Pivot=27
22
25
27
25
27
Institutionen för informationsteknologi | www.it.uu.se
18