[Innehåll]


6.2.1 - Introduktion
6.2.2 - Start av MATLAB. Variabler - det nödvändigaste.
6.2.3 - Redigering och avbrytande av kommando
6.2.4 - Vektorer och matriser
6.2.5 - Bildande av vektor
6.2.6 - Operationer på vektorer
6.2.7 - Komplexa tal. Strängar
6.2.8 - Grafik
6.2.9 - Hjälp
6.2.10 - Hur vi dokumenterar arbete i MATLAB
6.2.11 - Programmering: snurror och val
6.2.12 - Programmering: egna funktioner
6.2.13 - Interaktiv inmatning
6.2.14 - Övrigt
6.2.15 - Vilka variabler har användaren infört?
6.2.16 - Fler siffror i utskrifterna
6.2.17 - Värdena Inf och NaN
6.2.18 - Vit bakgrund vid ritning på skärmen
6.2.19 - Evaluering av strängar
6.2.20 - Import och export av data
6.2.21 - Bättre och bättre ...
6.2.22 - Bli ännu mer imponerad
6.2.23 - Utnyttja Maple/Mathematica från MATLAB
6.2.24 - Referenser

6 Matematikprogram

6.2 MATLAB

6.2.1 Introduktion

MATLAB, som du kommer att möta i flera kurser under din tid på Chalmers, är ett kraftfullt programsystem för matematiska beräkningar av olika slag. Ursprungligen var det främst tänkt för problem inom linjär algebra, där vektorer och matriser är viktiga ingredienser. Namnet härleds i själva verket från Matrix laboratory. Det kan dock användas till en hel del annat också. Systemet består av ett basprogram och ett antal tilläggsprogram, s k verktygslådor (eng toolbox), för speciella tillämpningar. Som standard finns en sådan verktygslåda med. Extra verktygslådor finns för t ex avancerad signalbehandling och simulering av system. Varje verktygslåda har sin manual.

Ur MATLAB-manualen citerar vi följande: "At the heart of MATLAB is a new language that you'll have to learn before you can fully exploit its power. Don't be intimidated (sv avskräckt) - you can pick up the basics of MATLAB in just a few minutes and mastery comes after only a few hours of use. You'll be rewarded with high-productivity, high-creativity computing power that users say "changes their lives".

Detta citat har visserligen kommersiell bakgrund, men det är ingen tvekan om att det rymmer en verklig sanning.

Vi beskriver den version av MATLAB, version 4.2a, som nu finns för datorerna.

6.2.2 Start av MATLAB. Variabler - det nödvändigaste.

Man startar Matlab genom att antingen ge kommandot matlab (lämpligast från ett nytt fönster) eller med menyvalet Matlab (som ger ett nytt fönster). Man får tämligen kvickt ett meddelande

              < M A T L A B (R) >
  (c) Copyright 1984-94 The MathWorks, Inc.
              All Rights Reserved
                  Version 4.2a
                  May 13 1994
Commands to get started: intro, demo, help help
Commands for more information: help, whatsnew, info 
följt av ett redotecken (eng prompt) i form av

>>
som anger att programmet är berett att ta emot nya uppdrag. För att avsluta MATLAB skriver man kommandot quit, men det gör vi naturligtvis inte nu. Vi kan skriva in matematiska uttryck som beräknas, t ex om vi vill ha värdet av sin(p/4)

>> sin(pi/4)
ans = 0.7071
Värdet skrivs ut föregånget av ett variabelnamn ans (av eng answer). Här och i fortsättningen återger jag användarens inmatning i fetstil. Men vi kan också koppla värden till variabler. Variabler fungerar som i t ex Pascal, men deklareras inte. Exempelvis placerar följande två instruktioner först värdet av p/4 i variabeln t och därefter värdet av sin(t), dvs sin(p/4), i variabeln y.

>> t=pi/4,y=sin(t) 
t = 0.7854
y = 0.7071
Tilldelningstecknet är tydligen "=". Värdet skrivs i båda fallen ut tillsammans med tillhörande variabelnamn. När man som här skriver flera satser (instruktioner, kommandon) på en rad separeras de med kommatecken (,). Om man inte vill ha utskrift avslutar man en sats med ett semikolon, som samtidigt fungerar som separator, t ex

>> t=pi/4;y=sin(t);
>>
Variabelnamn skrivs med bokstäver och siffror. Systemet skiljer på stora och små bokstäver. T ex är Y och y olika variabler. Det finns många fördefinierade namn, vars ursprungliga betydelse förloras om man tilldelar det ett eget värde. Ingen skillnad görs på heltal och allmänna reella tal.

6.2.3 Redigering och avbrytande av kommando

Man kan komma åt tidigare kommandorader och eventuellt modifiera dem innan de utförs på nytt. Detta görs med piltangenternas hjälp, som fungerar precis som man skulle tro. Speciellt kan man lätt korrigera en felaktig rad. T ex

>> x=sinus(2)
??? Undefined function or variable.
Symbol in question ==> sinus
>> 
När man trycker på uppåtpilen övergår den sista raden i

>> x=sinus(2) 
som man sedan kan redigera till det korrekta med vänsterpil och raderingstangent. När man sedan trycker på returtangenten utförs kommandot.

Ett kommando kan avbrytas med avbrottssignalen som typiskt är Ctrl-C.

6.2.4 Vektorer och matriser

MATLAB kan arbeta med flera tal samtidigt. Talen skall då vara ordnade i en vektor, dvs en följd av tal, eller matris, dvs ett rutnät av tal. I själva verket representeras allt i MATLAB som matriser, dvs egentligen finns bara datatypen matris.

Vektorer och vanliga tal är specialfall av matriser, som illustreras i figuren. En radvektor kan uppfattas som en enradig matris. Ett enda tal kan ses som en enradig matris med en kolumn. Alla variabler innehåller automatiskt uppgift om den aktuella storleken. Alla index löper från 1 och uppåt.

Ett konkret exempel på en vektor är en digitaliserad ljudsignal. En digitaliserad bild är på samma sätt en matris.

Vi sysslar här mest med radvektorer för att hålla nere textmassan.

6.2.5 Bildande av vektor

Givet ett antal tal som skall ingå i vektorn är det lätt att bilda den. Vi räknar bara upp talen i en följd med blanka eller kommatecken som separator och omgärdar följden med hakparenteser, t ex

>> t=[0,0.2,0.3,1]
t = 0 0.2000 0.3000 1.0000
Vi kan nu beräkna sinus för samtliga tal i vektorn med

>> y=sin(t)
y = 0 0.1987 0.2955 0.8415
Är talen i vektorn konsekutiva finns det ännu enklare sätt. Man skriver startvärdet, stegvärdet och slutvärdet, skilda åt med kolon (:). T ex får vi en vektor med de elva elementen 0, 0.1, ..., 1.0 med

>> t=0:0.1:1
t =
Columns 1 through 7
 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
Columns 8 through 11 
 0.7000 0.8000 0.9000 1.0000
Man behöver inte ange något stegvärde om det är 1. Även negativa steg tillåts.

Det finns flera funktioner med vilka speciella vektorer/matriser kan bildas. Samtliga följande kan anropas med parametrar enligt följande modeller

Funktionerna är

Exempel: Vi bildar en radvektor med 5 slumpmässiga tal

>> rand(1,5)
ans = 0.2190 0.0470 0.6789 0.6793 0.9347					
q

Man refererar till ett enstaka vektorelement med vektornamnet följt av index inom vanliga parenteser, t ex t(5). En del av en vektor kommer man åt med t ex t(3:6).

En vektor kan utvidgas dynamiskt på ett par sätt. Om a och b är radvektorer så ger [a,b] en ny vektor som inleds med a:s element och avslutas med b:s. Speciellt är [a] samma vektor som a. Byts kommatecknet mot ett semikolon, dvs [a;b], får man i stället en tvåradig matris. Man kan också ge ett element utanför den ursprungliga vektorn ett värde, varvid mellanliggande element automatiskt tillkommer och nollställes.

Exempel: Dynamisk utvidgning.

Med t som ovan ger (%-tecken inleder kommentarer i MATLAB)

>> a=t(1:6);	     % De 6 första elementen i vektorn t
>> [a;sin(a)]
ans =
 0 0.1000 0.2000 0.3000 0.4000 0.5000
 0 0.0998 0.1987 0.2955 0.3894 0.4794
>> a=[7,3,12]
a = 7 3 12
>> a(7)=1
a = 7 3 12 0 0 0 1		
q

6.2.6 Operationer på vektorer

Vi tar här bara upp s k elementvisa operationer, som utföres på varje vektorelement för sig eller parvis mellan motsvarande vektorelement. Operationerna *, / och ^ har speciell betydelse för vektorer och matriser, vilket tas upp i kursen i linjär algebra. Vi måste i stället använda .*, ./ respektive .^ för att få elementvisa operationer (tal*vektor, vektor*tal och vektor/tal går dock bra). Vid elementvisa operationer på två vektorer måste vektorerna vara lika långa.

Exempel: Några vektoroperationer.

Här görs först en elementvis addition. Sedan ett försök att multiplicera med den vanliga *, vilket ger felmeddelande, beroende på att * som sagt har speciell betydelse. Man måste använda .*, vilket vi gör till sist.

>> a=[1,2,3];b=[4,5,6];
>> a+b
ans = 5 7 9


>> a*b
??? Error using ==> *
Inner matrix dimensions must agree.
>> a.*b
ans = 4 10 18	
q

Som vi redan sett kan man applicera en funktion på samtliga element i en vektor på en gång

>> sin(a)
ans = 0.8415 0.9093 0.1411
Det finns också ett antal
reducerande funktioner, som arbetar på en vektor och returnerar ett tal. Bl a

Exempel: Vi beräknar summan för n=100.

>> sum(ones(1:100)./[1:100].^2)
% Först skapas en vektor med idel ettor och längden 100
% Därpå en med elementen 1,2,3,4,...,100, vilka kvadreras
% Sedan divideras den första elementvis med den andra
% Slutligen summeras termerna
ans = 1.6350	
Det går också att skriva på följande vis. Observera dock att 1 inte står för en vektor utan för ett tal, som sedan delas med vart och ett av talen i vektorn [1:100].^2).

>> sum(1 ./[1:100].^2)					
q

Till slut nämner vi ett par kraftfulla funktioner som arbetar på vektorer och ger vektorer som resultat.

Exempel:
Sortering av vektor.

>> sort([7,9,1,3,12,4])
ans = 1 3 4 7 9 12
q

Exempel: Nollställen till polynomet

>> roots([1,7,3,9])  %Högstagradskoefficienten först
ans =
 -6.7531
 -0.1234 + 1.1478i
 -0.1234 - 1.1478i		
q

Matriser bildas och hanteras på ett likartat sätt. T ex ger följande rad en tvåradig matris. Man separerar alltså matrisraderna med semikolon. Samtliga rader måste vara lika långa.

>> a=[1,2,3;7,1,9]
a = 1 2 3
    7 1 9
>> sin(a)
ans = 0.8415 0.9093 0.1411
      0.6570 0.8415 0.4121
Lösningen till ett linjärt ekvationssystem med lika många ekvationer som obekanta skrivet på matrisform Ax=y löses enkelt med x=A\y.

Exempel: Lös ett slumpmässigt valt 5x5-system.

>> A=rand(5,5);y=rand(5,1);
>> x=A\y         
x =
   -0.9415
   -0.3964
   -0.2770
    0.8923
    1.6482
q

6.2.7 Komplexa tal. Strängar

MATLAB gillar komplexa tal som skrivs på formen a+bi, där a och b är reella. Alla vanliga operationer fungerar på dessa och på matriser av sådana, t ex

>>(1+i)*(2+3i)
ans = -1.0000+5.0000i
Olyckligtvis är i en vanlig variabel (eller funktion om man nu skall vara petig), vars fördefinierade värde kan ändras. Det kan ställa till trassel, så undvik att använda det variabelnamnet för eget bruk. Den ursprungliga betydelsen kan alltid återställas med tilldelningen i=sqrt(-1).

Funktionerna real resp imag tar ett komplext tal som parameter och ger realdel respektive imaginärdel.

Strängar finns också och skrivs som i Pascal, dvs med omgivande apostrofer. De lagras som vektorer och man kommer följaktligen åt enskilda element som när det gäller vektorer.

>> s='Fredrika';
>> s(5:7)
ans = rik

6.2.8 Grafik

Grovt sett bygger all grafik på att man själv först diskretiserar, dvs omvandlar uttryck till vektorer eller matriser.

Den tillgängliga funktionen för 2D-ritning heter plot och kan anropas på ett flertal olika sätt, bl a

Man får automatisk skalning efter vad som finns i vektorerna, men det går också att bestämma en egen skalning (kommandot axis).

Exempel: Vi vill rita upp kurvan y=sin(x)/x på intervallet [-20,20].

Vi börjar med att diskretisera det intervallet och räknar sedan ut motsvarande y-värden. Självfallet blir den faktiskt uppritade kurvan mjukare om man väljer x-värden tätt.

>> x=-20:0.1:20;
>> y=sin(x) ./ x ;
Warning: Divide by zero
Varningen som inte är så oväntad kan vi ignorera. Funktionens matematiska värde för x=0 är ju 1, men MATLAB räknar ut det som 0/0, som i allmänhet är odefinierat, och MATLAB ger därför värdet NaN, som står för NotANumber. Sedan begär vi uppritning med

>> plot(x,y)
vilket resulterar i att det dyker upp ett ritfönster (Figure) om det inte redan fanns framme och kurvan ritas.

Bild 12. sin(x)/x

q

Begärs ny ritning kommer det gamla fönstret att raderas. Dock bibehålles det gamla innehållet med kommandot

>> hold on
som kan återtas med

>> hold off
Man kan skriva text i ritfönstret med

>> text(xpos,ypos,'Det som skall skrivas')
där (xpos,ypos) anger startpositionen uttryckt i den skala som gäller för stunden. Man raderar ritfönstret utan att ändra skalan med

>> clf      %clear figure, hette förut clg
Skalan sätts automatiskt och är normalt inte likformig längs de båda axlarna. Med kommandot
axis (gör help axis för detaljer) kan du få annat beteende.

MATLAB har också en del funktioner som arbetar på litet högre nivå. En sådan är fplot som tar ett funktionsnamn skrivet som en sträng och en vektor som anger x-intervallet som parametrar och ritar kurvan. Om t ex sinc är funktionen sin(x)/x (hur man gör egna sådana tas upp längre fram), så ritas samma kurva med (diskretiseringen är dock som standard grövre)

>> fplot('sinc',[-20 ,20])

Personligen skulle jag hellre vilja kunna skriva t ex

>> myplot('sin(x) ./ x',xmin,xmax)
dvs ange uttrycket som en sträng utan att behöva införa en särskild funktion. Det är inte alltför svårt att tillverka ett sådant verktyg.

När det gäller 3D-grafik är MATLAB från och med version 4 kraftfull men tvingar användaren till en mängd svårförståeliga åtgärder. Acceptera inte det! Jag erbjuder dig i stället en specialfunktion (procedur) för ritning av funktionsytor (källkoden anges längre fram) som i varje fall är lättanvänd.

Exempel: Vi vill rita upp ytan z=sin(r)/r där r=sqrt(x^2+y^2).

Den är en motsvarighet till den tidigare uppritade funktionskurvan. Vi gör det över kvadraten -8x8, -6y6. Vi använder min specialfunktion.

>> myplot3d('sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2)',
   -8,8,-6,6)
Warning: Divide by zero
och får den ofta visade hatten, sombreron. Axeltexterna i figuren tillverkades med

>> xlabel('x-axeln');ylabel('y-axeln')

Bild 13. sin(r)/r, r=sqrt(x^2+y^2).

Med modifieringar i specialfunktionen kan man få ytan färglagd på olika sätt.

q

Anmärkning: Ritningen i den nämnda specialfunktionen bygger på att man diskretiserar funktionsytan över ett rutnät, dvs beräknar f(x,y) i ett antal punkter. Vi får då en matris av funktionsvärden. Och matriser är något som MATLAB kan visualisera, med en inbyggd funktion mesh. Nedan skapas t ex matris av ordning 15x15 med två icke-nollelement, som sedan ritas upp

>> a=zeros(15); a(5,5)=1; a(12,4)=0.6;
>> mesh(a)
vilket resulterar i bilden (man kan påverka tittriktning m m med andra kommandon)

Bild 14. Matris av ordning 15x15 visualiserad. Till höger antyds uppritningssättet: a(i,j) förbinds med elementen i de fyra markerade punkterna med räta linjer.

Byts mesh mot surf får man en färglagd yta och inte bara en massa streck.

6.2.9 Hjälp

MATLAB har ett inbyggt hjälpsystem som reducerar behovet av vanliga manualer. Vi kan få hjälp med hur en konstruktion utnyttjas och vad den innebär genom att skriva help följt av konstruktionens namn eller beteckning.

Exempel: Vi begär hjälp kring sin-funktionen.

>> help sin
SIN SIN(X) is the sine of the elements of X.
q

I hjälptexterna står namnen med stora bokstäver i avsikten att framhäva dem. Men - och detta är förvirrande - du skall skriva dem med små.

För en del operatorer krävs för närvarande två steg, t ex

>> help +
Du hänvisas vidare till arith
>> help arith
+   Plus.
X + Y adds matrices X and Y.  X and Y must have the same dimensions unless one is a scalar (a 1-by-1 matrix).A scalar can be added to anything.

Naturligtvis kan man även få upplysningar om kommandot help:

>> help help
HELP   On-line documentation. 
HELP, by itself, lists all primary help topics.  Each primary topic corresponds to a directory name on MATLABPATH.
"HELP topic" gives help on the specified topic.  The topic can be a command name or a directory name.  If it is a command name, HELP displays information on that command.  If it is a directory name, HELP displays the Table-Of-Contents for the specified directory.
For example, "help general" lists the Table-Of-Contents for the directory toolbox/matlab/general.
etc 

Om vi inte känner till namnet på en konstruktion kan vi därför eventuellt hitta den genom att be MATLAB ge oss en lista. Med enbart kommandot help får vi ett antal ämnesområden. Rikedomen framträder tydligt.

>> help
HELP topics:
matlab/general      -  General purpose commands.
matlab/ops          -  Operators and special characters.
matlab/lang          -  Language constructs and debugging.
matlab/elmat        -  Elementary matrices and matrix
                       manipulation.
matlab/specmat      -  Specialized matrices.
matlab/elfun        -  Elementary math functions.
matlab/specfun      -  Specialized math functions.
matlab/matfun       -  Matrix functions - numerical
                       linear algebra.
matlab/datafun      -  Data analysis and Fourier
                       transform functions.
matlab/polyfun      -  Polynomial and interpolation matlab/funfun       -  Function functions - nonlinear
                       numerical methods.
matlab/sparfun      -  Sparse matrix functions.
matlab/plotxy       -  Two dimensional graphics.
matlab/plotxyz      -  Three dimensional graphics.
matlab/graphics     -  General purpose graphics
matlab/color        -  Color control and lighting model 
matlab/sounds       -  Sound processing functions.
matlab/strfun       -  Character string functions.
matlab/iofun        -  Low-level file I/O functions.
matlab/demos        -  Demonstrations and samples.
etc
For more help on directory/topic, type "help topic".
Låt oss t ex se efter vad det finns för några elementära funktioner.

>> help elfun
Elementary math functions.

 Trigonometric.
   sin         - Sine.
   sinh        - Hyperbolic sine.
   asin        - Inverse sine.
   asinh       - Inverse hyperbolic sine.
   cos         - Cosine.
   cosh        - Hyperbolic cosine.
   acos        - Inverse cosine.
   acosh       - Inverse hyperbolic cosine.
   tan         - Tangent.
   tanh        - Hyperbolic tangent.
   atan        - Inverse tangent.
   atan2       - Four quadrant inverse tangent.
   atanh       - Inverse hyperbolic tangent.
   sec         - Secant.
   sech        - Hyperbolic secant.
   asec        - Inverse secant.
   asech       - Inverse hyperbolic secant.
   csc         - Cosecant.
   csch        - Hyperbolic cosecant.
   acsc        - Inverse cosecant.
   acsch       - Inverse hyperbolic cosecant.
   cot         - Cotangent.
   coth        - Hyperbolic cotangent.
   acot        - Inverse cotangent.
   acoth       - Inverse hyperbolic cotangent.

 Exponential.
   exp         - Exponential.
   log         - Natural logarithm.
   log10       - Common logarithm.
   sqrt        - Square root.

 Complex.
   abs         - Absolute value.
   angle       - Phase angle.
   conj        - Complex conjugate.
   imag        - Complex imaginary part.
   real        - Complex real part.

 Numeric.
   fix         - Round towards zero.
   floor       - Round towards minus infinity.
   ceil        - Round towards plus infinity.
   round       - Round towards nearest integer.
   rem         - Remainder after division.
   sign        - Signum function.

De inbyggda funktionerna ingår i själva MATLAB-programmet, medan de övriga ligger som filer precis som de funktioner man tillverkar själv. Vill du studera källkoden till en sådan funktion går det - som redan nämnts - bra med type-kommandot inuti MATLAB (de kan naturligtvis också inspekteras med ett vanligt redigeringsprogram). Det är dock få som är korta och lättbegripliga.

Ett annat hjälpkommando är lookfor som letar upp alla kommandon som i sin hjälptext innehåller en angiven söksträng, t ex

>> lookfor mesh
MESHDOM  Generate X and Y arrays for 3-d plots.
MESHGRID Generation of X and Y arrays for 3-D plots.
UNMESH   Convert a list of mesh edges to a graph or
         matrix.
HIDDEN   Mesh hidden line removal mode.
MESH     3-D mesh surface.
MESHC    Combination MESH/CONTOUR plot.
etc

Som hjälpkommandon kan vi även räkna info, computer och demo. Gör exempelvis help computer om du vill veta mer.

6.2.10 Hur vi dokumenterar arbete i MATLAB

Frågan är nu hur man får text och bilder från MATLAB in i ett dokument.

Text kan markeras och kopieras som när det gäller alla andra fönster. Bilder fordrar däremot betydligt mer arbete. Det finns två sätt.

  1. Bäst kvalitet fås om man sparar bilden i grafikfönstret som en PostScript-fil. Detta görs från och med version 4.1 på följande sätt.

>> print -deps -epsi filnamn
Denna rad skapar en fil filnamn.eps, som kan importeras till FrameMaker (på skärmen ser kanske resultatet i FrameMaker inte så bra ut, men utskriften blir superb).

Med program som gs eller ghostview kan du beskåda bilden som lagrats i filnamn.eps.

2. Tag en rasterkopia av skärmen (se UNIX-kapitlen; kan också göras från FrameMaker) och importera den i ditt dokument. Då blir bildens kvalitet i den slutliga utskriften som på skärmen. Många laserskrivare misslyckas med eller tar lång tid på sig för motsvarande filer (speciellt från färgskärmar).

Vill du bara ha utskrift på papper av bilden i ritfönstret kan du skriva

>> print
Ritning på skärmen sker mot en svart bakgrund, men denna byts mot vitt vid såväl pappersutskrift som när PostScript-fil sparas. Importerade bilder i denna skrift har i allmänhet skalats med faktorn 50 % i FrameMaker med kommandot Bild/Skala.

6.2.11 Programmering: snurror och val

MATLAB har precis som många andra interaktiva verktyg ett programspråk. Det är tämligen rudimentärt men tillhandahåller FOR- och WHILE-snurror samt IF-konstruktioner. Dessa fungerar och ser ut ungefär som i Pascal, men vissa skillnader finns.

Exempel: Låt oss börja med ett exempel kring FOR.

Säg att vi vill initiera de fem första elementen i en vektor a till 1, 1/2, 1/3, 1/4 respektive 1/5. Det kan ske med

>> for i=1:5
 		a(i)=1/i;
end
Här sägs att variabeln i skall genomlöpa värdena 1 till och med 5 (steget 1) och att för varje gång a(i) skall ges värdet 1/i. Inget händer förrän man skrivit end och tryckt på returtangenten. Utan semikolonet skulle vi fått utskrift av vektorn a i varje varv. Det går bra att skriva allt på en rad men då måste som vanligt kommatecken stoppas in som separator om det inte redan finns ett semikolon, t ex

>> for i=1:5, a(i)=1/i; end
Observera att om vektorn a inte finns, så skapas en ny vektor som successivt utökas till att ha 5 element. Vi kan kontrollera resultatet med

>> a
a = 1.0000 0.5000 0.3333 0.2500 0.2000
Det bör observeras att det oftast (speciellt för långa vektorer) går väsentligt snabbare när man använder vektoroperationer, t ex kan ovanstående göras som visades i vektoravsnittet.

>> a=ones(1,5) ./ (1:5)
a = 1.0000 0.5000 0.3333 0.2500 0.2000
Härvid bildas först en radvektor med 5 ettor, vilken sedan divideras elementvis med vektorn 1:5, dvs [1,2,3,4,5]. Parenteserna är prioritetsparenteser (det skulle även gått bra med hakparenteser eftersom [1:5] är samma vektor som 1:5). Utan dessa får man på grund av något förrädiska prioritetsregler

a = 1 2 3 4 5					
q

Formen för FOR-snurran är

eller om du vill ha en en-radare (trots den sämre läsbarheten)

där satsseparatorn alternativt kan vara semikolon. Variabeln genomlöper i tur och ordning de värden som finns i vektorn och för varje gång utförs satserna mellan for och end. Om vektorn är 1:10 genomlöpes således 1,2,3,...,10. Om den är 0:0.1:1 genomlöpes 0,0.1,0.2,...,1.0. Om den är [7,3,9] genomlöpes 7,3,9. FOR-snurran är tydligen något kraftfullare än i Pascal. Notera för övrigt att inget then begin förekommer som i Pascal.

WHILE-snurrans form är likartad:


Satserna utförs så länge som villkoret är uppfyllt (sant). I sammanhanget måste påpekas att likhetsjämförelse skrivs == i MATLAB och att "skilt från" skrivs ~=. Vidare att det inte finns några logiska värden, utan varje värde skilt från noll räknas som sant och noll som falskt. Inget hindrar att man själv gör definitionerna true=1, false=0. T ex ger jämförelsen

>> 1==2
ans = 0
Slutligen illustreras IF-konstruktionens kapacitet med några varianter

WHILE- och IF-konstruktionerna kan också skrivas på en rad, men glöm då inte kommatecken eller semikolon efter satserna före t ex else och end och inte heller efter t ex WHILE-delen.

Exempel: If

Följande enradiga (notera att alla kommatecken är nödvändiga) IF-konstruktion ger resultatet 4 om a är skild från 0 och 7 enbart om a har värdet 0.

>> if a,4,else 7,end
ans = 7				
q

6.2.12 Programmering: egna funktioner

MATLAB har många inbyggda funktioner och ytterligare finns i olika verktygslådor. Man kan också skapa egna funktioner som anropas precis som de inbyggda. Sådana funktioner måste skapas utanför MATLAB med ett valfritt textredigeringsprogram och sparas som filer med namnet funktionsnamnet.m (dvs ett s k suffix .m efter funktionsnamnet). De kallas ofta för m-filer.

Låt oss titta på en av de funktioner som finns i den verktygslåda som alltid ingår i MATLAB, nämligen sinh-funktionen. Medan sin är en inbyggd funktion hör sinh alltså till en verktygslåda. Källtexten till verktygslådefunktionerna och egna funktioner kan man titta på inifrån MATLAB genom att använda kommandot type (man kan naturligtvis även använda ett redigeringsprogram, i det här fallet på filen sinh.m i lämplig katalog).
Anm. Från version 4 är denna funktion omständligare men bättre.

>> type sinh
function y = sinh(x)
%SINH SINH(X) is the hyperbolic sine of the elements of X.
y = (exp(x) - exp(-x))/2;
>>
Först i varje funktion finns en rad som inleds med ordet function och avslutas med funktionsnamnet och en lista med inparametrar. Däremellan finns eventuellt en utparameterlista omgärdad av hakparenteser och följd av =. I sinh-exemplet finns bara en utparameter y och då behövs inte de omgärdande hakparenteserna.

Om funktionen inte skall returnera något värde (och då närmast är att betrakta som en sorts procedur), förekommer ingen utparameter och då slopas hakparenteser såväl som likhetstecken. Funktionen behöver inte ha några inparametrar och då slopas parenteserna. Inledningsraden kan sägas beskriva anropssättet. En funktion anropas enligt

Utparametrarna som nämns, i exemplet enbart y, skall någonstans i funktionen ges värden och det är de värdena som blir funktionens värde. Parametrarna och alla i funktionen införda variabler är lokala, dvs inga konflikter utåt uppstår. Den andra raden i vårt exempel är en kommentarrad. Alla kommentarrader direkt efter function-raden skrivs ut när man skriver help funktionsnamnet, dvs de bör innehålla en kort beskrivning av funktionen. Därefter följer en eller flera satser. Som vanligt sätter man ut semikolon för att undertrycka utskrift.

Exempel: Funktioner

Funktionen strunt nedan skall demonstrera möjligheterna. Den finns som en fil strunt.m. Först listar vi den inuti MATLAB, sedan begär vi hjälp och slutligen ger vi exempel på några korrekta och felaktiga anrop.

>> type strunt
function [a,b]=strunt(x,y)
% STRUNT [a,b]=strunt(x,y) returns 2*x in a and 2*y in b
a=2*x; b=2*y;
>> help strunt
STRUNT [a,b]=strunt(x,y) returns 2*x in a and 2*y in b
>> [p,q]=strunt(3,5)
p = 6
q = 10

>> strunt(3,5) 			% No actual outparameters => only first
               % part of the value returned
ans =6
>> p=strunt(3) 			% Too few actual inparameters
??? Input argument is undefined.
Symbol in question ==> y
Error in ==> strunt.m
On line 3 ==> a=2*x; b=2*y;
>> p=strunt(3,5,6)			% Too many actual inparameters
??? Error using ==> strunt
Too many input arguments.				
q

Det finns många fördefinierade namn i MATLAB och dess verktygslådor och användaren kan som sagt införa egna variabler och funktioner. Det vore orimligt om användaren skulle behöva komma ihåg alla fördefinierade namn. Därför följer MATLAB en prioriteringslista vid tolkningen av ett namn. Om svaret på en av frågorna är ja, så följs motsvarande tolkning.

  1. Är namnet en variabel?

    2. Är det en inbyggd funktion?

    3. Är det en funktion i aktuell katalog (dvs i den som MATLAB startades ifrån eller till vilken man gjort cd(MATLAB-kommando) senast)?

    4. Är det en funktion i standardverktygslådan?

    5. Är det en funktion i den gemensamma lokala MATLAB-katalogen (vanligen ..../matlab/toolbox/local)?

    6. Är det en funktion i någon verktygslåda?

    7. Är det en funktion i användarens MATLAB-katalog (vanligen ~/matlab)? Det är lämpligt att ha en sådan katalog hos sig och antingen utföra allt MATLAB-arbete där eller åtminstone spara viktigare egna funktioner där.

Sökordningen bland 4-7 är normalt den angivna, men kan eventuellt vara annorlunda. Ordningen kan avläsas med kommandona help eller path. Den kan också i viss mån påverkas med en systemvariabel kallad MATLABPATH.

Anmärkning: MATLAB är ett professionellt system. Men just funktionen sinh, som vi såg på i början av avsnittet, är ett exempel på amatörmässighet. Den fungerar utmärkt för de flesta x-värden, men inte för små värden på grund av s k kancellation. Om t ex x=0.000000001 får man med lång utskrift (se senare avsnitt)

>> sinh(x) 
ans =1.000000027229220e-09
vilket är precis vad formeln i funktionen ger. Detta värde är felaktigt redan i 9:e siffran (vilket kanske inte stör dig). Det hade varit lätt att skriva funktionen så att den alltid ger bortåt 16 riktiga siffror. Det har man också gjort i version 4. Vi hänvisar till numerisk analys för detaljer.

Det finns ytterligare en sorts m-filer, som bara består av ett antal rader med MATLAB-kommandon. En sådan m-fil, som ibland kallas kommandofil, namnges och anropas som en funktion. Vid anropet utförs kommandona i filen som om man skrivit in dem.

Exempel: myplot3d

Till sist får du utan närmare kommentarer källkoden till den i grafik-avsnittet nämnda funktionen (proceduren) myplot3d. Den första parametern måste vara en sträng som innehåller ett uttryck i x och y!

function myplot3d(expr,x0,x1,y0,y1)
N=80;   	% Antal steg i respektive riktning. Alternativt parameter.
stepx=(x1-x0)/N;stepy=(y1-y0)/N;
[x,y]=meshgrid(x0:stepx:x1,y0:stepy:y1);			
z=eval(expr);
mesh(x,y,z)   		% Eller surf(x,y,z)som ger en riktig yta		
q

6.2.13 Interaktiv inmatning

MATLAB har några funktioner som gör att man kan skapa interaktiva program i form av funktioner, dvs program som kommunicerar med användaren under körningen. Den första av dessa, input, skriver ut en sträng, väntar på att användaren skall mata in något och returnerar svaret. T ex

>> a=input('Ange tal!')
Ange tal!345
a =345
>> 
Den andra, pause, låter användaren beskåda ett mellanresultat i lugn och ro

>> pause
>>
Först när användaren trycker på någon tangent kommer redotecknet.

Den tredje, ginput, låter oss markera punkter med musen i ett ritfönster och returnerar punkternas koordinater uttryckta i fönstrets aktuella koordinatsystem i två vektorer. T ex om vi begär två punkter.

>> [x,y]=ginput(2)
x = 7.1399
    -1.1952
y = -0.3164
    -0.8709
X-koordinaterna hamnar i vektorn x och y-koordinaterna i y. Vi kan sedan rita in dessa punkter ovanpå den befintliga figuren med

>> hold on 			% Om det inte redan är gjort
>> plot(x,y,'+')
Med viss ansträngning går det med hjälp av ginput att göra musstyrda interaktiva program, t ex program för elkretskonstruktion.

6.2.14 Övrigt

MATLAB innehåller mycket mer. Utrymmet tillåter oss inte att gräva djupare. Bara några saker till som kanske kan ha intresse. Mest givande är nog avsnittet 6.2.22.

6.2.15 Vilka variabler har användaren infört?

Om ett variabelnamn sammanfaller med namnet på en funktion som man tänkt använda, blir funktionen otillgänglig (precis som i Pascal). Du kan ta reda på vilka variabler som införts med kommandot who och ta bort en variabeldefinition med kommandot clear. T ex

>> who
Your variables are:
a b c
>> clear b
>> who
Your variables are:
a c 

6.2.16 Fler siffror i utskrifterna

Du som vill ha annan utskriftsdisposition, t ex fler siffror, kan ta till kommandot format. Man kan till och med få utskrift på hexadecimal form.

Exempel:

>> format long 								% enbart format återställer
>> y=sin(t)
y = 0.70710678118655

>> format hex
>> x=1
x = 3ff0000000000000
Alla beräkningar genomförs med ungefär 16 decimala siffror oberoende av utskriftsformatet.

6.2.17 Värdena Inf och NaN

MATLAB kan räkna med som betecknas Inf. T ex

>> x=1/0
Warning: Divide by zero
x = Inf
>> 1/x
ans = 0
Vi har också tidigare som hastigast nämnt NaN (NotANumber) som dyker upp när resultatet inte är matematiskt definierat, t ex

>> 0/0
Warning: Divide by zero
ans = NaN

6.2.18 Vit bakgrund vid ritning på skärmen

Normalt är, som nämnts, bakgrunden i ritfönstret svart. Vill du i stället ha vit, så kan du före första ritkommando ge kommandot

>> whitebg
Samma kommando byter tillbaka. Ges kommandot efter första ritkommandot kan färgvalet bli litet tokigt.

6.2.19 Evaluering av strängar

En rolig funktion är eval som beräknar värdet av ett uttryck på strängform med hänsyn till ingående variablers värden, t ex

>> a=1;b=2;x=3;eval('a+b*x')
ans = 7

6.2.20 Import och export av data

Man kan spara variabler från en körning av MATLAB till en annan. Detta sker med

>> save namn 
varvid samtliga variabler sparas i filen namn.mat (en sådan fil kallas mat-fil). Även enstaka variabler kan sparas (se help save). Inläsning av variablerna sker sedan med

>> load namn
I detta fall sker lagringen på ett format som inte är direkt mänskligt läsbart. Med viss möda kan man från egna program (skrivna i t ex Pascal) läsa och skriva filer på detta format, vilket ger en möjlighet till import/export, t ex för att utnyttja beräkningskraften eller visualiseringsförmågan i MATLAB. Enklare är dock oftast att i stället gå via vanliga textfiler. Enstaka variabler kan nämligen också sparas på textform och senare återhämtas. T ex

>> a=[1,2;3,4];			% En variabel	
>> save namn.dat a /ascii /double 
% Sparar a i filen namn.dat
>> clear a 			% Radera a
>> load namn.dat 			% Läs in a igen
>> a % Värdena finns inte som variabeln a utan som
     % variabeln namn
??? Undefined function or variable.
>> namn
namn =
 1 2
 3 4
I detta fall är filen en s k dat-fil, som kan läsas och redigeras med vilket redigeringsprogram under UNIX som helst, t ex (> är redotecknet i UNIX)

> cat namn.dat
 1.00000000000000e+00 2.00000000000000e+00
 3.00000000000000e+00 4.00000000000000e+00

6.2.21 Bättre och bättre ...

Från och med version 4 kan man tillverka MATLAB-program med knappar, menyer och riktig mushantering. Men det är knappast något för nybörjare.

6.2.22 Bli ännu mer imponerad

Till MATLAB hör en mängd demonstrationsprogram i form av m-filer som visar olika tillämpningar. Du kommer åt dessa via menyer/knappar genom att ge kommandot >> demo. Vill du se en förteckning över de olika programmen kan du skriva >> help demos och vill du sedan köra ett enstaka exempel eller se på källkoden för det kan du som vanligt skriva >> namn respektive >> type namn. De flesta exemplen har för övrigt ett modernt användarsnitt, dvs använder finesserna i föregående avsnitt.

6.2.23 Utnyttja Maple/Mathematica från MATLAB

Det finns en version av MATLAB som innehåller Maple och som gör det möjligt att utföra symboliska beräkningar i MATLAB. CTH har dock inte den. Däremot kan du med hjälp av fri programvara anropa Mathematica från MATLAB. Det är dock litet obekvämt på grund av en del särdrag hos Mathematica. Som exempel beräknar vi nedan först p med 50 decimaler. Därpå beräknas derivatan till funktionen och ritas upp på intervallet [0,2].

>> MATH('N[Pi,50]') % MATH är finns nog ej automatiskt
ans=3.14159265358979323846264338327950288419716939937510
>> s=MATH('D[Exp[x]*Cos[x*x],x]')
s=e.^x.*cos(x.^2)-2.*e.^x.*x.*sin(x.^2)
>> e=exp(1);        % e är inte fördefinierad i MATLAB
>> x=0:0.1:2;
>> plot(x,eval(s))

6.2.24 Referenser


Kent Petersson - 29 SEP 95

[Innehåll]

Generated with CERN WebMaker