• No results found

an att upprepa koden p˚a flera st¨allen i samma fil. En annan f¨ordel med en funktion ¨ar att alla variabler ¨ar lokala, det vill s¨aga en funktion delar inte workspace med det program som anropar funktionen. Detta ¨ar en stor f¨ordel i stora program d¨ar det annars kan vara sv˚art att h˚alla reda p˚a alla variabler som anv¨ands till exempel f¨or index i slingor eller x-koordinater i plottar (man kan inte anv¨anda samma variabelnamn i tv˚a olika betydelser!)

F¨or att detta skall fungera v¨al m˚aste vi dels f¨olja en viss syntax f¨or hur en funktion skall kodas i ComsolScript, men ocks˚a skriva koden som skall rymmas i funktionen p˚a ett klokt s¨att. Vi m˚aste f¨ors¨oka g¨ora funktionen s˚a allm¨an som m¨ojligt s˚a att den verkligen g˚ar att

˚ateranv¨anda. Vi skall exemplifiera med att skissa hur man kan skriva en funktion som f¨or en given in-vektor x ber¨aknar en y-vektor med normalf¨ordelningens v¨arde i motsvarande punkter. Vi skall kunna ange vilket medelv¨arde och standardavvikelse f¨ordelningen skall ha, men om vi utel¨amnar dessa argument s˚a skall standard normalf¨ordelningen, det vill s¨aga den med medelv¨arde 0 och standardavvikelse 1 ber¨aknas. Vi f˚ar allts˚a om vi definierar en vektor x, och sedan skriver y=normal(x,medel,sigma) en y-vektor som inneh˚aller v¨ardet f¨or normalf¨ordelningen i varje punkt x som vi anger n¨ar vi anropar funktionen.

4.3.1 Syntaxen f¨or funktioner

En funktion inleds alltid med en rad som b¨orjar med function och sedan ger syntaxen f¨or hur funktionen anropas. I v˚art fall b¨orjar funktionen allts˚a:

function y=normal(x, mean, sigma)

H¨ar ¨ar y resultatet av funktionen, de variabler som ges inom parantes ¨ar funktionens ar-gument. Eftersom varje funktion har en separat workspace s˚a ¨ar enda s¨attet att utbyta

information mellan en funktion och det program som anropar funktionen genom argumenten och de v¨arden som kommer ut ur funktionen. Om man beh¨over ge mer ¨an ett (i det h¨ar fallet tre) utargument, resultat fr˚an funktionen, g¨or man det med hj¨alp av syntaxen

function [a b c ]=normal(x, mean, sigma)

F¨orutom f¨orsta raden f¨oljer en funktion samma regler som vilken annan m-fil som helst vad g¨aller syntax. Har man bara designat gr¨anssnittet mot omv¨arlden korrekt s˚a att all n¨odv¨andig information finns tillg¨anglig s˚a ¨ar det sedan ”bara” att koda den ¨onskade algoritmen. Vi m˚aste dock se till att spara den fil som inneh˚aller funktionen med samma namn som vi ger i f¨orsta raden, med till¨agget (engelska extension) .m .

4.3.2 help f¨or en funktion

En speciell sak med en funktion ¨ar att om vi skriver ett block med kommentarer efter f¨orsta raden s˚a kommer dessa att skrivas ut i kommandof¨onstret n¨ar vi skriver help funktionsnamn.

Detta g¨aller bara det f¨orsta blocket av kommentarer, ingen av de kommentarer som kommer l¨angre ned i koden syns. H¨ar skall vi allts˚a skriva in den information som kan beh¨ovas f¨or att f¨orst˚a hur man skall anv¨anda funktionen. Vi kan se massor av exempel p˚a hur det kan g¨oras, i sj¨alva verket ¨ar det precis det som h¨ander varje g˚ang vi skriver help i kommandof¨onstret, vi l¨aser d˚a helt enkelt det f¨orsta blocket med kommentarer i den fil som utf¨or funktionen.

V˚ar funktion f¨or normalf¨ordelningen b¨or d˚a b¨orja n˚agonting i stil med

% NORMAL Normalf\"ordelningsfunktionen

% y=normal(x,m,s)

% Indata: x av typ vektor

% m medelv\"ardet

% s varians

%

% om m utel\"amnas s\"atts m=0

% om s utel\"amnas s\"atts s=1

%

prova att koda detta och sedan skriva help normal (normal.m m˚aste sparas n˚agonstans i ComsolScripts s¨okv¨ag).

4.3.3 Testa antalet argument

Vi har sett fler exempel p˚a funktioner som accepterar olika antal argument, och som ocks˚a levererar litet olika resultat beroende p˚a hur m˚anga utvariabler man anger, ett exempel p˚a det ¨ar kommandot hist (se avsnit 7.3.2) som kommer att bli en av v˚ara favoriter. Det h¨ar

¨

ar ett s¨att att inte beh¨ova introducera ett stort antal funktioner som g¨or n¨astan samma sak, men inte riktigt. Det ¨ar mer ekonomiskt att i st¨allet l˚ata en funktions beteende variera litet beroende p˚a hur man anropar den, och hur man formaterar resultaten fr˚an funktionen.

Rent tekniskt ¨ar det inte s˚a sv˚art att l˚ata en funktion g¨ora litet olika saker med hj¨alp av villkors-satser, det g¨aller bara att veta hur funktionen har blivit kallad. F¨or detta finns kom-mandona nargin och nargout som talar om hur m˚anga argument som gavs n¨ar funktionen anropades, och hur m˚anga ut-argument som angavs i anropet. Genom att testa p˚a antalet argument kan vi styra villkoren f¨or hur funktionen skall bete sig.

if nargin < 3, s=1; end if nargin < 2, m=0; end

en svaghet i denna konstruktion ¨ar att man m˚aste utesluta argument ”bakifr˚an”, dvs vi f¨oruts¨atter att om ett argument ¨ar utel¨amnat s˚a ¨ar det standardavvikelsen, och inte medelv¨ardet

4.3. FUNKTIONER 39 i exemplet ovan. Det finns v¨agar runt detta1men det kr¨aver en hel del arbete och komplicerad kodning, s˚a det l¨amnar vi till den som ¨ar speciellt intresserad.

P˚a motsvarande s¨att kan man testa hur m˚anga ut-argument som gavs i anropet, i v˚art fall om normal kallades med y=normal(x,m,s) eller med normal(x,m,s). Att kommandot som g¨or det heter nargout kommer v¨al knappast som en ¨overraskning?

Exempel p˚a funktion

Vi visar h¨ar ett exempel p˚a hur en funktion kan anv¨andas. Funktionen total r¨aknar ut hur stor summa man m˚aste betala f¨or ett l˚an taget till olika r¨antor:

function total=interest(belopp, rantesats, manader, period)

%

% total ber¨aknar totalt ˚aterbetalat belopp.

%

% utdata total - total skuld

%

% indata belopp - l˚anat belopp

% rantesats - r¨antesatsen i procent

% manader - l˚anets l¨optid i m˚anader

% period [’m’/’y’] - period

% f¨or vilken r¨antesatsen g¨aller

% m˚aste vara antingen ’m’ f¨or m˚anad

% eller ’y’ f¨or ˚ar.

% om period utl¨amnas antas ˚ar

%

% Sten Hellman 030211

if (nargin == 3); period=’y’; end;

if (period == ’y’)

total = belopp * (1 + rantesats/100) ∧ (manader / 12);

elseif (period == ’m’)

total = belopp * (1 + rantesats/100) ∧ (manader);

else

disp(’ perioden m˚aste anges som m eller y’);

total = -99;

end

Denna funktion kan man sedan kalla fr˚an ett program d¨ar man l¨agger in olika m¨ojliga alter-nativ f¨or att kunna best¨amma vilket som ¨ar mest f¨orm˚anligt:

% kreditkort ett ˚ar till 4.3% i m˚anaden kredit = interest(10000, 4.3, 12, ’m’)

% bank ett ˚ar till 23% per ˚ar bank = interest(10000, 23, 12)

1Man anv¨ander kommandot varargin och t¨anker ut tester som kan avg¨ora vilka argument som faktiskt amnades.

4.4 Ovningsuppgifter ¨

1. Skapa en vektor med tio element som best˚ar av likformigt f¨ordelade slumptal (minns sektion 3.3.2) som antar heltalsv¨arden fr˚an 1 till 6.

2. Skriv en funktion som returnerar ett slumptal mellan 1 och 100. Talet skall vara ett heltal, dvs inga decimaler skall finnas med. F¨orsta raden i filen kan se ut s˚a h¨ar:

function y = slumptal()

3. Skriv ett program som genererar en slumpm¨assig tipsrad. Anta att sannolikheten f¨or 1, x och 2 alla ¨ar 1/3, och l˚at programmet skriva ut tipsraden (en tipsrad best˚ar av tretton stycken tecken). Ett exempel p˚a en k¨orning kan se ut s˚a h¨ar:

>> tipsrad 2

x 2 1 2 1 2 x 2 1 x 2 2

4. En metod f¨or att approximera kvadratroten av ett tal ¨ar Newtons metod som ger

√x ≈ yk med yk+1 = 12yk+yx

k



och y1 = 1. Skriv en funktion y=Newton(x) som anv¨ander denna metod f¨or att ber¨akna kavdratroten ur ett godtyckligt positivt tal.

Kadratroten skall anges korrekt avrundad med tre decimalsiffrors noggrannhet.

Ledning: eftersom vi inte har n˚agot facit m˚aste vi i funktionen sj¨alva avg¨ora n¨ar serien har konvergerat tillr¨ackligt f¨or att vi skall ha den s¨okta noggrannheten. Detta kan vi t.ex. g¨ora genom att kontrollera att |yk− yk−1| < 0.0001

Vi m˚aste dessutom hitta p˚a ett trick f¨or att runda av korrekt, de rutiner vi har till hands rundar ju bara av heltal. Detta kan vi komma runt genom att transformera v˚art decimaltal till ett l¨ampligt heltal som vi sedan rundar av och d¨arefter transformerar tillbaks till ett decimaltal.

Kapitel 5

Ordbehandling med OpenOffice writer

5.1 OpenOffice

OpenOffice ¨ar en serie program som erbjuder ungef¨ar samma funktionalitet som Microsofts Office-paket. P˚a Fysikum har vi g˚att ¨over fr˚an Microsofts produkter till OpenOffice av flera sk¨al: OpenOffice ¨ar ¨oppen k¨allkod och kan laddas ned gratis. Programmet finns f¨or fler operativsystem ¨an Microsofts produkter, speciellt s˚a finns programmen ¨aven f¨or operativsys-temet Linux som ¨ar vanligt p˚a Fysikum. Dessutom ¨ar OpenOffice.writer mycket b¨attre p˚a att hantera formler ¨an vad motsvarande Microsoft produkt ¨ar.

Det ¨ar m¨ojligt att byta filer mellan OpenOffice och Microsofts program men kompatibiliteten

¨

ar inte 100-procentig, i synnerhet inte n¨ar man anv¨ander formler och symboler. Men i dessa fall ¨ar inte kompatibiliteten 100-procentig ens om man bara byter mellan tv˚a Microsoftpro-gram under olika operativsystem.

F¨or dig som student inneb¨ar det h¨ar att du fritt kan ladda ned OpenOffice till din hemdator fr˚an http://www.openoffice.org/ Vi p˚a Fysikum hj¨alper g¨arna till om du st¨oter p˚a sv˚arigheter med detta. Vi kan eventuellt ocks˚a f¨ors¨oka g¨ora n˚agra CD-skivor som de som har l˚angsamma uppkopplingar kan anv¨anda f¨or att installera programmet.

OpenOffice har en hj¨alpfunktion som ¨ar ganska lik den f¨or ComsolScript. Den ¨oppnar du genom att g˚a in i “Help” menyn och v¨alja “OpenOffice.org Help”. Du f˚ar d˚a upp ett f¨onster d¨ar hj¨alpfunktionerna f¨or hela OpenOffice paketet finns tillg¨angliga.