og Institutt for geofag Universitetet i Oslo 17. Oktober 2012
i MatLab En funksjon vil bruke et gitt antall argumenter og produsere et gitt antall resultater og
: Hvorfor Først og fremst bruker vi når vi ønsker: og å kategorisere programkode å kontrollere og organisere programmene våre å utføre beregninger av matematiske er spesielt nyttige for beregninger eller programkode du bruker ofte!
: Hvorfor og Vi har allerede brukt mange MatLab som sum(), sin(), length(), min(), plot() osv. Disse funksjonene utfører programkode vi bruker ofte Fordel: vi slipper å programmere opp koden hver gang vi bruker den Når brydde du deg sist om hva som egentlig skjer når du bruker sinus-knappen på kalkulatoren din? Det er resultatet vi er opptatt av!
: En funksjon er som en sort boks >> w = sqrt(3); input argument(s) (tallet 3) function (sqrt) output argument(s) (w= 2) og sort boks
: En funksjon er som en sort boks >> w = sqrt(3); og Når vi skriver kommandoen sqrt(3), så vet ikke vi hva som skjer inne i selve funksjonen, vi vet kun resultatet av beregningen Det samme gjelder når vi lager våre egene ; beregningene som gjøres i funksjonen er lokale og er ikke synlige
: En funksjon er som en sort boks og >> w = sqrt(3); Alle variabler definert utenfor funksjonen er ikke tilgjenglige for funksjonen De eneste variablene funksjonen kjenner til er variablene du sender inn som argumenter (i eksempelet over tallet 3) og variabler definert lokalt (inne i) i funksjonen Alle variabler du definerer inne i funksjonen er ikke kjent for MatLab utenfor funksjonen (vi vet ikke hva som defineres inne i funksjonen sqrt). Disse variablene dukker derfor ikke opp i workspace vinduet
: En funksjon er som en sort boks >> w = sqrt(3); og Variabler definert i kalles lokale variabler (de vet vi ikke hva er) Variabler definert i kommandovinduet eller i vanlige m-filer kalles globale variabler Disse variablene finnes i workspace vinduet (w er en global variabel )
: r vi og Generell form: function[ut1, ut2,..., utn]= funknavn(inn1, inn2,..., innm) Et eksempel: function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater r = sqrt(x^2+y^2); theta = atand(y/x); end
: r vi og En funksjon lagres som en egen m-fil; funknavn.m Kommandoen function må være den første kommandoen i m-filen du lagrer funksjonskoden i Kommentarer kan evt. komme før kommandoen function, men det er vanlig å sette kommentarene etter første linje Her må funksjonen lagres som cart2plr.m function [theta, r] = cart2plr(x,y)
Funksjonen trenger ikke å sende tilbake verdier. Om du ikke ønsker det kan du enten droppe hakeparentesene eller la de stå tomme : r vi og function [theta, r] = cart2plr(x,y) Hakeparentes, [ ], kalles output argument list Her skriver du hvilke variabler du vil at funksjonen skal sende tilbake I eksempelet over sendes det tilbake 2 variabler; theta og r Det er ingen begrensing på hvilken type eller hvordan størrelse det er på variabelen(variablene) funksjonen sender tilbake
: r vi og function [theta, r] = cart2plr(x,y) Navnet på funksjonen skrives etter likhetstegnet Navnet på m-filen og funksjonsnavnet må være identiske Reglene for funksjonsnavn er de samme som for variabelnavn: Navnet må begynne med en bokstav Deretter kan dere bruke bokstaver, tall og understrek i hvilken kombinasjon dere ønsker Ingen blanke tegn Ikke bruk funksjonsnavn som allerede er definert i MatLab! Bruk kommandoen help funksjonsnavn
: r vi og function [theta, r] = cart2plr(x,y) Parentes, ( ), kalles input argument list og skrives etter funksjonsnavnet Her skriver du hvilke variabler funksjonen mottar I eksempelet over mottar funksjonen to verdier, x og y Funksjonen trenger ikke å ta imot input argumenter om dette ikke er ønskelig
: r vi function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates og Den første linjen etter kommandoen function kalles H1-line Denne linjen beskriver funksjonen i en setning Det er vanlig å skrive funksjonsnavnet i store bokstaver og hvor mange variabler funksjonen skal ha som input argumenter og hvor mange variabler funksjonen returnerer
: r vi function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater og På de neste linjene kan du beskrive funksjonen din mer nøye. Dette er nyttig både for deg selv og for andre som ønsker å bruke funksjonen din senere Alle linjene med kommentarer, frem til en blank linje eller kommandoene begynner, blir skrevet ut i kommandovinduet når du skriver help funksjonsnavn
: r vi og Skriver du help cart2plr i kommandovinduet dukker beskrivelsen opp >> help cart2plr [theta, r] = cart2plr(x,y) cartesian to polar coordinates konverterer fra kartesiske koordinater til polar koordinater
: r vi og Alle linjene med kommentarer, frem til en blank linje eller kommandoene begynner, blir skrevet ut i kommandovinduet når du skriver help funksjonsnavn function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater % disse linjene kommer ikke med % naar du bruker help kommandoen
: r vi og Det er vanlig å slutte funksjonen med end... men dette er ikke nødvendig function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater r = sqrt(x^2+y^2); theta = atand(y/x); end
: r vi og Selve programmeringskoden du skriver i funksjonen bestemmes av hva du ønsker å beregne eller gjøre 3 nyttige tips: Funksjonen utfører kommandoene sekvensielt fra første programkode i funksjonen frem til kommandoen end eller til funksjonen slutter Kun input argumentene er kjent for funksjonen. Ingen av variablene definert utenfor funksjonen er kjent Alle ouput argumentene må (beregnes og) defineres i funksjonskoden
: og Når vi skal bruke er vi nødt til å vite hvor mange input argumenter som behøves og ikke minst rekkefølgen på argumentene Skal jeg bruke funksjonen cart2plr må jeg sende inn 2 verdier og x-verdien må sendes inn først Her sender jeg inn koordinatene (3,4) >> cart2plr(3,4) Legg merke til at jeg ikke trenger å kalle argumentene jeg sender inn x og y
: Jeg må også vite hvor mange variabler som blir sendt tilbake og I dette tilfellet blir det sendt tilbake 2 variabler; theta og r Skriver jeg kun >> cart2plr(3,4) ans = 53.1301 får jeg bare den første verdien tilbake; verdien til theta
: For å få verdien til både theta og r må jeg skrive og >> [theta, r]=cart2plr(3,4) theta = 53.1301 r = 5
: og Det er utolig viktig å vite hvor mange variabler som skal sendes inn til funksjonen hvor mange variabler som returneres rekkefølgen til variablene (både de som sendes inn og de som returneres) Derfor er H1-line så viktig! >> [theta, r]=cart2plr(3,4) theta = 53.1301 r = 5
: Det finnes flere varianter og Generell form: function[ut1, ut2,..., utn]= funknavn(inn1, inn2,..., innm) Eksempel: function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater r = sqrt(x^2+y^2); theta = atand(y/x); end
: Det finnes flere varianter og Hvis funksjonen kun returnerer en variabel kan vi droppe hakeparentes (vi kan også beholde dem) Eksempel: function r = hypotenus(x,y) % r = HYPOTENUS(X,Y) returnerer hypotenusverdi % funksjonen mottar to katetverdier i en trekant % og returnerer hypotenusverdien r = sqrt(x^2+y^2); end
: Det finnes flere varianter og Hvis funksjonen ikke returnerer variabler holder det å skrive function funknavn(inn1, inn2,...,innm) Eksempel: function addtwo(x,y) % ADDTWO(X,Y) legger sammen to variable % funksjonen legger sammen to tall, vektorer, matriser, o.l. % og skriver ut resultatet i kommandovinduet disp(x+y) end
: Det finnes flere varianter og Hvis funksjonen ikke returnerer variabler og heller ikke tar imot variabler kan vi skrive function funknavn Dette er veldig sjedent Eksempel: function ros % ROS gir deg litt anerkjennelse % denne kan brukes om du trenger en oppmuntring load handel.mat sound(y, Fs*2) end
: Det finnes flere varianter og Enda et eksempel: function du_er_flink % DU_ER_FLINK gir deg enda mer anerkjennelse % enn funksjonen ros % denne kan brukes om du trenger ekstra mye ros! load handel.mat sound(y, Fs*1.5) figure(1) xlim([0 1]) ylim([0 1]) farg= kgmrcg ; yindex=[1 3 1 3 1 3 1 3 1 3 1 3]; for i = 1:10 %plotter firkanter i cyan text(0.25,0.5, \bf DU ER FLINK!!, fontsize,38, Color, farg(yindex(i))) %setter gronn bakgrunnsfarge utenfor figuren %gcf betyr get current figure set(gcf, Color,farg(yindex(i)+1)) %setter magneta bakgrunnsfarge inni figuren set(gca, Color,farg(yindex(i)+2)) pause(0.2) end
: Ett eksempel og En funksjon som regner ut gjenomsnittet, minimums og maksimumsverdi av en vektor function [gjsnitt, minst, maks] = statistikk(x) % [gjsnitt, minst, maks] = STATISTIKK(X) regner ut % statistiske egenskaper til en vektor % funksjonen regner ut og returnerer % gjenomsnittet, minste verdi og storste verdi til en % vektor x gjsnitt = mean(x); minst = min(x); maks = max(x); end
: Oppgave 1 og Lag som leser inn et kronebeløp og omregner beløpet til amerikanske dollar, euro og svenske kroner. Resultatet skal funksjonen skrive ut i kommandovinduet. Omregningen er etter følgende valutakurser: 1USD = 5.7NOK 1EUR = 7.4NOK 1 SEK = 0.85NOK
: Oppgave 2 og Den daglige veksten for penger i banken kan skrives som: x n = x n 1 + p 100 360 x n 1 hvor p er årlig rente og n angir dag nr. n a) Lag, rente, som mottar antall dager pengene har stått på konto N, renten p og startbeløpet x 0. Funksjonen skal returnere x N, som viser kontobeløpet etter N dager b) Se hvor mye beløpet blir om du setter inn 100kr og lar dem stå i 720 dager med en årlig rente på 4%
i m-filer: Oppgave 6.8 i kompendiet og Om du kaster en ball vil den følge en bane gitt av formelen: f (x,θ,v 0,y 0 ) = xtan(θ) 1 2v 0 gx 2 cos 2 (θ) + y 0 der v 0 er starthastigheten (m/s), θ er vinkelen du kaster ballen i forhold til bakken, y 0 er høyden ballen kastes i (x=0) og g er tyngdeakselerasjonen (lik 9.81m/s 2 ) a) Lag som tar i mot θ, v 0 og y 0, regner ut banen til ballen og plotter resultatet. x-verdiene kan du definere i selve funksjonen.
i m-filer: Oppgave 6.8 i kompendiet forts. og b) Lag et program der du bruker funksjonen du lagde i a) og plotter banen til ballen i 3 subplot. Det første subplottet skal vise banen til ballen for 3 ulike verdier av θ, det andre subplottet skal vise banen for 3 ulike verdier av av v 0 og det tredje subplottet skal vise banen til ballen for 3 ulike verdier av y 0.
: og Kommandoen return stopper funksjonen function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater % x og y kan innholde tall eller vektorer if length(x) ~=length(y) return; end r = sqrt(x.^2+y.^2); theta = atand(y./x); end
: og Kommandoen error stopper funksjonen og skriver ut en feilmelding (som du lager) i kommandovinduet function [theta, r] = cart2plr(x,y) % [theta, r] = CART2PLR(X,Y) cartesian to polar coordinates % konverterer fra kartesiske koordinater % til polar koordinater % x og y kan innholde tall eller vektorer if length(x) ~=length(y) error( x og y er ikke samme lengde ) end r = sqrt(x.^2+y.^2); theta = atand(y./x); end