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