• No results found

Spara i pdf-format

N¨ar du vill vara s¨aker p˚a att andra m¨anniskor kan l¨asa det du skriver . b¨or du skicka filen i pdf-format. Det g¨or du enklast genom att klicka p˚a verktygsknappen “Export

Directly As PDF”. Du kan ocks˚a g˚a in i menyn “File”, och v¨alja “Export as PDF. . . ” PDF-formatet ¨ar det du normalt anv¨ander f¨or att l¨amna in labrapporter.

5.16 Ovningsuppgifter ¨

G¨or f¨oljande uppgifter i en fil i OpenOffice Writer;

1. F¨ors¨ok g¨ora f¨oljande tabell (inklusive tabelltext). Den f¨orsta kolumnen ¨ar 2 cm bred och de ¨ovriga ¨ar 3 cm breda. Tabellen ska vara centrerad p˚a sidan.:

Tabell 1. Det h¨ar ¨ar den f¨orsta testtabellen.

2. G¨or f¨oljande ekvationer i ekvationshanteraren. Observera att beteckningarna f¨or grund¨amnena ej ska vara kursiva:

a2+ b2 = c2

209Bi +58Fe →266109Mt +1n Cn,

n+

3. F¨ors¨ok ˚aterskapa f¨oljande formler:

K0x2 =R0J0xt2 1+tt2dt

N

Xxk¯h

k=0

4. Skriv in dessa formler i ekvationshanteraren. Notera att ordet for ej ska vara kursivt.

2 −1 5. ˚Aterskpa f¨oljande formel:

dPdz = 32πσδc2 HC µ ωc2

6. Skriv f¨oljande ekvation, d¨ar A och n ska vara i fetstil:

A = n × ∇tΨ 7. Inf¨or sidnumrering

8. Spara filen och omvandla den till en PDF-fil.

Kapitel 6

N¨ ar det blir fel

N¨astan inga program blir helt r¨att fr˚an b¨orjan. N¨ar det uppst˚ar fel i enklare program kan man ofta hitta orsaken bara genom att g˚a igenom programmet en g˚ang till med vetskap om vad som gick fel. Men i takt med att programmen blir st¨orre och mer komplicerade blir denna procedur mer och mer besv¨arlig och tidskr¨avande.

Ett fel i ett datorprogram kallas p˚a engelska ”bug”. Detta uttryck s¨ags h¨arstamma fr˚an datorernas barndom. Vid ett tillf¨alle hade ett team som jobbade med en av de f¨orsta stora ber¨akningsmaskinerna (r¨orbestyckad) l¨ange f¨ors¨okt att ta reda p˚a vad som gick fel i ett program. Till slut uppt¨ackte man att orsaken inte l˚ag i programmet utan att en d¨od insekt inuti maskinen hade orsakat en kortslutning. Denna historia m˚a vara sann eller inte, men ett fel i ett datorprogram heter p˚a engelska ”bug”, och processen att hitta och korrigera fel heter de-bugging. P˚a svenska s¨ager man oftast bugg och debugga, men ibland kan man m¨ota termen ”avlusa”.

I n¨astan alla programmeringsmilj¨oer finns det speciella verktyg att anv¨anda f¨or att leta efter fel i sina program, s˚a kallade debuggers. Gemensamt f¨or de flesta ¨ar att man med hj¨alp av verktyget kan k¨ora sitt program rad f¨or rad och vid valfri tidpunkt stanna upp och inspektera v¨ardet p˚a det variabler som finns i programmet. Man kan ocks˚a k¨ora programmet tills v¨ardet p˚a en viss variabel ¨andras. Med hj¨alp av s˚adana verktyg kan man n¨asta alltid hitta ˚atminstone de fel i ett program som orsakas av att man t¨ankt fel n¨ar man skrivit programmet.

Att anv¨anda en debugger kr¨aver en hel del tr¨aning f¨or att det skall bli effektivt. I den h¨ar kursen ser vi detta som ¨overkurs, de som ¨ar intresserade eller verkligen beh¨over g˚a igenom ett buggigt program h¨anvisas till introduktionen i Appendix B

I st¨allet ger vi h¨ar n˚agra enkla tips om hur man med hj¨alp av de felmeddelanden vi kan se i kommandof¨onstret kan komma en bra bit p˚a v¨agen f¨or att avhj¨alpa de vanligaste nyb¨orjarfelen.

• A = Inf

A har ber¨aknats p˚a ett s¨att som “ger o¨andligheten”, ett fel som n¨astan alltid uppst˚ar f¨or att man f¨ors¨oker dividera med noll.

• B = NaN

B ¨ar “not a number”, resultatet av en operation som inte ¨ar definierad, som t.ex. 0/0 eller cos(8/0),

• Error: Unknown function a.

fredag 6 P = 3*a

Detta fel uppst˚ar n¨ar vi f¨ors¨oker anv¨anda en variabel som inte ¨ar initialiserad. En variabel m˚aste definieras antingen genom tilldelning (a = 4) eller ber¨akning (a = 3*b).

57

F¨ors¨oker vi anv¨anda en variabel innan den definierats f˚ar vi felmeddelandet ovan. Com-solScript kan inte riktigt avg¨ora om vi f¨ors¨oker anv¨anda en icke-definierad variabel eller en icke-definierad funktion. Att det st˚ar “function” i felmeddelandet skall man allts˚a inte ta f¨or bokstavligt.

Notera hur ComsolScript ger en v¨aldigt detaljerad anvisning till var felet finns: “fredag”

¨

ar namnet p˚a den m-fil som k¨ordes n¨ar felet uppstod, felet finns i rad 6 i den filen, och vi f˚ar till och med inneh˚allet i denna rad - “P = 3*a “ - utskrivet.

• Error: Incompatible dimensions in matrix multiplication.

Error in built-in function mtimes.

fredag 13 Z = x*y

Detta fel uppst˚ar n¨ar vi f¨ors¨oker multiplicera tv˚a matriser som inte har korrekta di-mensioner med varandra, dvs. antalet kolumner i den v¨anstra matrisen ¨ar inte lika med antalet rader i den h¨ogra. N¨ar ComsolScript h¨anvisar till “Error in built-in function...” s˚a betyder det att felet detekteras i n˚agon av de funktioner som Com-solScript kallar f¨or att utf¨ora en operation. Det kan d˚a vara v¨aldigt sv˚art att ens veta vilken denna interna funktion ¨ar. Men eftersom vi ocks˚a f˚ar den rad d¨ar felet uppst˚ar utskriven s˚a kan man oftast lista sig till vad som g˚ar fel.

• Error: Matrix power is only defined for square matrices.

Error in built-in function mpower.

fredag 13 Z = x^2

Igen ser vi i hyfsad klartext var felet ligger. H¨ar vill man g¨ora endera av tv˚a saker.

Antingen att ta skal¨arprodukten av x med sig sj¨alv, i vilket fall vi m˚aste komma ih˚ag att transponera en av vektorerna. Men oftast uppkommer det h¨ar felet n¨ar vi gl¨omt att ta med punkten i den elementvisa operationen. Ofta ¨ar det ist¨allet x.∧2 vi vill ber¨akna.

• Felmatchade paranteser

Error: Unmatched parenthesis.

Line: 15 Column: 11

Function: fredag

Det h¨ar ¨ar ocks˚a ett v¨aldigt tydligt felmeddelande, vi har inte gjort r¨att med v˚ara paranteser. I det h¨ar fallet f˚ar vi ¨annu mer information fr˚an ComsolScript om var felet uppst˚ar, vi f˚ar namnet p˚a funktionen och rad och kolumn d¨ar ComsolScript de-tekterat felet. Anv¨ander vi ComsolScripts inbyggda editor s˚a syns rad och kolumn numret l¨angst ned i arbetsf¨onstret, det ¨ar bara att placera mark¨oren p˚a r¨att st¨alle, den parantes som st˚ar till h¨oger om pekaren ¨ar den f¨orsta icke-matchade h¨ogerparantesen, som t.ex. i raden x = cos(4)). Om vi d¨aremot har fler v¨ansterparanteser ¨an h¨ogerparanteser s˚a g˚ar det inte n¨ar man skannar igenom en rad att avg¨ara exakt vilken av v¨ansterparanterserna som inte ¨ar matchad, s˚a skriver vi raden x = cos((4) s˚a f˚ar vi ist¨allet felmeddelandet:

Error: Syntax error.

Line: 15

59 Column: 12

Function: fredag

Syntax error kan vi f˚a p˚a m˚anga andra s¨att, varje g˚ang vi inte f¨oljer ComsolScripts spr˚akliga regler, dvs reglerna f¨or hur vi skall formera v˚ara rader s˚a kommer vi att f˚a ett syntaxfel. Om vi till exempel skriver plot (x,y) f˚ar vi ocks˚a ett syntaxfel, eftersom det inte ¨ar till˚atet med mellanslag mellan funktionsnamn och argumentlistan.

• Error: 1 input argument expected, 2 input arguments given.

Error in built-in function cos.

fredag 20 D = cos(2,4)

Ar ocks˚¨ a l¨att att f¨orst˚a. Vi har gl¨omt att ComsolScript anv¨ander decimalpunkt och inte decimalkomma, s˚a n¨ar vi skriver cos(2,4) tolkas det som tv˚a tal, och eftersom cosinusfunktionen bara accepterar ett argument s˚a f˚ar vi ett fel.

• Error: Malformed expression.

Line: 23 Column: 5

Function: fredag

Anger att vi inte anv¨ander operatorerna p˚a det s¨att det var t¨ankt, som t.ex. i uttrycket k =3+/4.

Kapitel 7

2D-Grafik

I det h¨ar passet kommer vi att koncentrera oss p˚a att skapa grafik: histogram, plottar och annat som kan anv¨andas f¨or att ˚ask˚adligg¨ora experimentella resultat. Vi skall f¨ors¨oka avst˚a fr˚an frestelsen att komma med pekpinnar om hur grafik skall utformas f¨or att vara bra, utan i st¨allet koncentrera oss p˚a att g˚a igenom tekniken, s˚a att vi kan ˚astadkomma grafik som ser ut som vi vill.

Efter att ha g˚att igenom det h¨ar passet skall du sj¨alv kunna producera en plot som den ovan och ocks˚a kunna b˚ade skriva ut den och kopiera in den i ett dokument f¨or att bifogas i en lab-rapport.

7.1 Kurvor i tv˚ a dimensioner

Att skapa enklare tv˚a-dimensionella plottar i ComsolScript ¨ar relativt enkelt. En skillnad mellan ComsolScript och en del andra grafikprogram ¨ar att vi inte kan instruera ComsolScript

61

att till exempel rita kurvan y=sin(x). Ist¨allet m˚aste vi ge ComsolScript en upps¨attning punkter med en x-koordinat och en y-koordinat. ComsolScript ritar sedan upp en kurva som f¨orbinder punkterna. Vill vi rita upp y = sin(x) m˚aste vi d¨arf¨or f¨orst sj¨alva skapa en x-vektor och sen en y-vektor1 d¨ar y=sin(x) och instruera ComsolScript att rita en kurva mellan de punkter som beskrivs av dessa vektorerna. L˚at oss b¨orja med n˚agot enkelt som att rita grafen f¨or y = 2x + 3.

x = [1 8];

 y = 2*x + 3;

 plot (x,y)

7.1.1 Att v¨axla mellan f¨onster, och st¨ada i f¨onster.

N¨ar vi trycker p˚a return efter att ha givit plot kommandot ¨oppnas ett nytt f¨onster, ComsolScripts grafikf¨onster d¨ar plotten visas. N¨ar vi jobbar med grafik kommer vi att vilja pendla mellan m˚anga f¨onster. Ofta kommer vi att utf¨ora samma lunk mellan editorns f¨onster d¨ar vi just ¨andrat n˚agon detalj i en m-fil till kommandof¨onstret f¨or att k¨ora filen till grafikf¨onstret f¨or att se hur det blev. Det finns flera metoder f¨or att snabbt v¨axla mellan f¨onster, vilken som passar b¨ast just f¨or stunden beror litet p˚a exakt vad man h˚aller p˚a med och hur man f¨oredrar att jobba.

• Det kanske enklaste s¨attet ¨ar att helt enkelt l¨agga f¨onstren bredvid varandra, eller i alla fall se till inget f¨onster ligger helt bakom de andra. Genom att klicka och dra p˚a kanten av ett f¨onster kan du flytta det vart du vill p˚a datorns skrivbord, och genom att klicka och dra i ett aktivt f¨onsters nedre h¨ogra h¨orn kan du ¨andra dess storlek. Om du l¨agger upp de f¨onster du jobbar i s˚a att det alltid sticker fram n˚agon bit av f¨onstret

¨

aven n¨ar det ¨ar de andra f¨onstren som ¨ar aktiva s˚a kan du enkelt byta f¨onster bara genom att klicka med musen i det f¨onster du vill skall bli det aktiva.

• I windows finns det en funktion f¨or att bl¨addra mellan alla f¨onster som ¨ar ¨oppna p˚a datorns skrivbord. H˚all ”alt”-tangenten nedtryckt och tryck p˚a TAB tangenten. Varje g˚ang du trycker ned TAB bl¨addras ett nytt f¨onster fram som aktivt, vilket f¨onster som g¨ors aktivt visas i en liten ruta. Befinner du dig i ComsolScripts kommandof¨onster och vill till grafikf¨onstret kan du skriva ”figure(1)” i kommandof¨onstret, d˚a blir f¨onstret med det namnet aktivt. Vill du tillbaks fr˚an grafikf¨onstret till kommandof¨onstret trycker du bara p˚a return.

Vill du st¨ada upp i grafikf¨onstret skriver du (i kommandof¨onstret) clf (CLear Figure window), vill du st¨ada upp i kommandof¨onstret ger du kommandot clc (CLear Command window).

Du kan st¨anga grafikf¨onstret genom att ge kommandot close.

7.1.2 plot-kommandot

L˚at oss prova att plotta en litet mer komplicerad kurva, y = x2. Pr¨ova

 clear all;

 x = [1 4];

 y = x.∧2;

 plot(x,y)

Resultatet blir inte direkt vad vi v¨antat oss, men egentligen ¨ar det inte s˚a m¨arkligt: plot kommandot ser ju bara de punkter vi vill rita en graf mellan och har ingen aning om huru-vida de tv˚a punkterna (1,1) och (4,16) ¨ar tv˚a punkter p˚a kurvan y=x2, eller om de ligger

1Eftersom det ComsolScript anv¨ander i plottandet ¨ar punkter, vars x- och y-koordinater kommer fr˚an vektorerna x och y s˚a m˚aste vektorerna ha samma antal element.

7.1. KURVOR I TV˚A DIMENSIONER 63 p˚a kurvan y = 5x-4. Mer information m˚aste allts˚a till, pr¨ova att l¨agga till punkten ( x,y) = (2,4). Inte heller s¨arskilt imponerande. F¨or att kurvan skall bli j¨amn och fin och f¨olja det funktionssamband vi ¨onskar m˚aste vi ge ComsolScripts plot-kommando vektorer d¨ar punkterna ligger ganska t¨att. Det g¨ors enklast om vi anv¨ander oss av ComsolScripts vektorfunktioner. Antag till exempel att vi vill plotta y=x2 mellan 0 och 4.5. Vi kan d˚a antingen anv¨anda kolonoperatorn f¨or att skaffa oss en x-vektor d¨ar elementen har v¨arden fr˚an 0 till 4.5 med vilket avst˚and vi vill, till exempel 0.1: x = 0:0.1:4.5; (n¨ar vektorerna f˚ar s˚a h¨ar m˚anga element vill man g¨arna st¨anga av ekot genom att ge semikolon efter kommandot).

Alternativt kan vi anv¨anda linspace f¨or att skapa 50 punkter mellan 0 och 4.5: x = linspace(0,4.5,50); ger oss ocks˚a en anv¨andbar x-vektor. N¨ar x-vektorn ¨ar klar skapar vi en y-vektor med y = x.∧2 och plottar resultatet.

Prova nu att plotta n˚agra andra funktioner som polynom och sin(x) f¨or att se att resultatet blir som du f¨orv¨antar dig.

7.1.3 Styra utseendet p˚a grafiken

Det mesta av den tid man spenderar p˚a att g¨ora grafer tenderar att l¨aggas p˚a att f˚a lay-outen att bli vad man har t¨ankt sig. Eftersom korrekt och tydlig lay-out ¨ar ett viktigt verktyg f¨or att ˚astadkomma grafik av h¨og kvalitet kan det vara v¨art besv¨aret att redan fr˚an b¨orjan f¨ors¨oka l¨ara sig de kommandon som kr¨avs f¨or att man skall kunna styra programmet dit man vill.

Linjef¨arg, linjetyp och mark¨orer

Kommandot plot kan ges med tre argument: plot(x,y,S). Argumentet S ¨ar en textstr¨ang som anger hur linjen som ritas skall formateras. Det finns tre typer av information att styra, f¨argen p˚a linjen, hur linjen dras (heldragen, prickad mm), och slutligen mark¨or, eller vilken symbol som skall ritas ut i de punkter som anges av vektorerna. Skriver du help plot kan du bland annat hitta f¨oljande lista p˚a vilka m¨ojligheterna ¨ar:

Linjef¨arg Mark¨or Linjetyp

y yellow . dot - solid

m magenta o circle : dotted

c cyan + plus -. dashdot

r red * star - - dashed

g green s square (none) ingen linje b blue v triangle

k black p pentagram

Man kan i plot kommandot anv¨anda en godtycklig kombination av dessa (men bara ett val f¨or varje kategori!). Prova med litet olika kombinationer f¨or att se hur det fungerar, en gul kurva med heldragen linje mellan sm˚a cirklar ges t.ex av plot(x,y,’yo-’). M¨ark att om man ger formatkommandot f¨or linjef¨arg och mark¨or men inte n˚agon kod f¨or linjetyp som t.ex. plot(x,y,’bo’) s˚a ritas endast punkterna ut utan n˚agon sammanbindande linje.

Rutn¨at

Ibland vill man l¨agga in ett rutn¨at ¨over grafen f¨or att underl¨atta avl¨asningen av koordinater.

Detta g¨ors med kommandot grid on. F¨or att sl˚a av ett rutn¨at anv¨ander du grid off.

Ger man bara kommandot grid s˚a v¨axlar man mellan dessa tillst˚and (engelskans toggle).

7.1.4 Koordinataxlar

Om vi inte ger n˚agot kommando f¨or att speciellt formatera koordinataxlarna v¨aljer ComsolScript axlar s˚a att hela grafen lagom ryms i grafikf¨onstret. M˚anga g˚anger vill man sj¨alv best¨amma hur koordinataxlarna l¨aggs ut, antingen f¨or att man vill zooma in ett intressant omr˚ade, eller f¨or att man vill l¨agga in litet luft, plotta till exempel y=x2 mellan -2 och 3, det ser inte snyggt ut just kring origo. F¨or att styra detta ger vi kommandot axis([xmin xmax ymin ymax]) d¨ar xmin ¨ar minimiv¨ardet p˚a x-axeln och s˚a vidare. Kommandot axis skall ges efter plot-kommandot, testa med ny = [-2 3 -.5 10] f¨oljt av axis ( ny ) p˚a v˚ar andragradskurva! Det kan verka en smula omst¨andigt att axis kommandot tar sitt argument i formen av en vektor, vilket g¨or att vi f¨orst m˚aste konstruera vektorn innan vi skriver in kommandot. R¨att anv¨ant kan dock just detta faktum spara mycket arbete, s¨arskilt n¨ar vi skriver m-filer som skall producera grafik. Den enklaste varianten ¨ar att vi ist¨allet f¨or att ange sifferv¨arden lagrar siffrorna i en vektor och ger den som argument till axis kommandot.

Prova till exempel

 stor = [-5 10 -5 25];

 axis(stor);

 liten = [-0.5 2.1 0 3.1];

 axis(liten);

Tappar vi tr˚aden kan vi se vilken inst¨allning som f¨or ¨ogonblicket g¨aller genom att ge kom-mandot axis utan argument. ComsolScript skriver d˚a ut den aktuella vektorn. (Notera att ibland f˚ar vi bara svaret -1 1 0 20 0, i det l¨aget kan vi f˚a tillbaks v¨ardena p˚a axlarna genom att ge kommandot Figure(X) d¨ar X ¨ar numret p˚a det grafikf¨onster vi arbetar med, innan vi ger axis-kommandot.) Vi kan ¨aven spara en inst¨allning genom att ge kommandot vektor = axis, d¨ar vektor ¨ar ett godtyckligt namn p˚a en vektor i vilken de aktuella v¨ardena sparas. Ett anv¨andningsomr˚ade f¨or detta trick ¨ar om vi skriver en allm¨an m-fil f¨or att plotta data och allts˚a inte i f¨orv¨ag vet vilka x- och y-v¨arden som blir aktuella. Om vi ¨and˚a vill plotta kurvan med litet luft ikring kan vi anv¨anda en variant av f¨oljande sekvens:

 x = -1.5: .05 : 1.5;

 y = sin(x);

 plot(x,y)

 current=axis;

 mellanrum=0.3

 ny(1) = current(1) - mellanrum;

 ny(2) = current(2) + mellanrum;

 ny(3) = current(3) - mellanrum;

 ny(4) = current(4) + mellanrum;

 axis(ny);

 figure(1)

Axis har en hel del special-argument, f¨or en fullst¨andig lista skriv help axis, n˚agra av de mer anv¨andbara ¨ar:

• AXIS(’auto’) g¨or att axlarnas gr¨anser s¨atts r¨aknas om n¨ar nya kurvor l¨aggs till i samma graf.

• AXIS(’manual’) s¨atter axelgr¨anserna i manuellt l¨age, s˚a att gr¨anserna inte ¨andras n¨ar nya kurvor l¨aggs till i samma graf.

• AXIS(’equal’) s¨atter axlarnas gr¨anser s˚a att skalindelningen blir lika i x- och y-led.

• AXIS(’normal’) motsatsen till AXIS(’equal’). H¨ar kan x- och y-axeln ha olika skalor.

• AXIS(’tight’) krymper gr¨anserna p˚a axlarna s˚a att plotten precis ryms i grafen.