6.6 Mer om programmering och funktioner
6.6.2 Viktad anpassning till r¨ at linje
N¨asta uppgift blir att med utg˚angspunkt i samma schema designa och skriva en funktion som g¨or en viktad anpassning till en r¨at linje, y=a + bx.
Algoritm
Parametrarna a och b, samt os¨akerheten i dessa ges av:
a =
Pwix2i Pwiyi−Pwixi Pwixiyi
∆ och b =
Pwi Pwixiyi−PwixiPwiyi
∆
σa= s
Pwix2i
∆ σb =
sP wi
∆ d¨ar wi = 1
σi2 och ∆ =Xwi
Xwix2i −Xwixi
2
62 KAPITEL 6. PROGRAMMERING Gr¨anssnitt och syntax
Indata till funktionen ¨ar l¨ampligen tre vektorer, en med x-v¨arden, en med y-v¨arden och en med felen i y-v¨ardena. Vilka resultat vi vill f˚a ut ur funktionen kan variera en del. Vi kommer alltid att vilja se de anpassade v¨ardena f¨or parametrarna a och b, samt os¨akerheten i dessa.
Eventuellt vill vi ocks˚a f˚a en uppfattning om kvaliteten i anpassningen, det vill s¨aga chi-kvadratsumman per frihetsgrad och antalet frihetsgrader. Eftersom det, i motsats till lincorr ovan, inte ¨ar n¨odv¨andigt att r¨akna ut dessa senare tal f¨or att funktionen skall kunna k¨ora, s˚a l¨onar det sig att testa med nargout om dessa v¨arden verkligen ¨ar efterfr˚agade eller inte innan de ber¨aknas. Syntaxen f¨or funktionen blir d˚a: function [parA, sigmaA, parB, sigmaB, ChiSquared, Dof] =linfit(x, y, sigma).
Felkontroll
Ett m¨ojligt fel som m˚aste kollas ¨ar om de tre vektorerna som ¨ar argument till funktionen inte har samma l¨angd. Vidare b¨or man kontrollera att ∆ inte ¨ar noll s˚a att divisionerna ger ett odefinierat resultat. Om chi-kvadrat skall ber¨aknas m˚aste vi ocks˚a kontrollera att det finns minst tre m¨atta punkter, annars kommer divisionen n¨ar chi-kvadrat per frihetsgrad ber¨aknas att bli odefinierad, samt att inget av m¨atfelen felaktigt ¨ar angivet som 0, i vilket fall bidraget till chi-kvadratsumman fr˚an den punkten blir odefinierat.
Testa funktionen
Du kan testa den f¨ardiga funktionen p˚a datam¨angden x =[1.097 1.700 3.39 1.399 3.70 2.190 2.5 4.00];
x=x*0.001;
y =[0.429 0.668 1.328 0.547 1.445 0.856 0.973 1.557];
dy =[0.001429 0.001668 0.0020 0.0015 0.0020 0.0010 0.0020 0.0030];
Svaret skall bli: a = (1.9347 ± 1.540)10−3, b = (389.99 ± 0.665), N = 6, χ2/d.o.f. = 2.38 6.6.3 Viktad anpassning och plottning av r¨at linje.
H¨ar skall vi skriva en funktion som levererar en graf med data plottade med felstaplar och i samma graf den r¨ata linjen som ¨ar ett resultat av anpassningen till en r¨at linje, med parametrarna f¨or anpassningen utskrivna.
Algoritm
Anpassningen till en r¨at linje ¨ar inte n˚agot problem, vi l˚ater bara denna funktion i sin tur anropa linfit som vi skrev i f¨orra avsnittet. Det g¨aller sedan ”bara” att f˚a grafen att se snygg ut utan att g¨ora n˚agra antaganden i f¨orv¨ag om hur data ser ut. Det kan man
˚astadkomma genom att f¨orst plotta data, sedan flytta ut axlarna med 10% av det v¨arde som den automatiska skalningen ger f¨or att se till att alla punkter ligger v¨al inne i grafen.
D¨arefter drar vi den r¨ata linjen som definieras av anpassningen.
Om det anges i den kallande rutinen s˚a skall linplot skriva ut parametrarna fr˚an anpass-ningen. F¨or att skriva ut parametrarna formaterar vi med formatet %0.3g f¨or att det skall se snyggt ut oberoende av vilket resultatet av anpassningen blir. Vi vill sedan att texten skall hamna p˚a ett vettigt st¨alle och v¨aljer d¨arf¨or att b¨orja skriva 5% av grafens totala bredd in fr˚an v¨ansterkanten och ¨oversta raden 5% fr˚an toppen. Om riktningskoefficienten fr˚an anpassningen ¨ar negativ kommer datapunkter att ligga i det ¨ovre v¨anstra h¨ornet, vi v¨aljer d˚a ist¨allet att i horisontell ledd b¨orja att skriva i mitten av grafen. (Ett alternativ till denna algoritm kan vara att l¨agga till extra 20% i h¨ojdled n¨ar vi skalar om vertikalt och anv¨anda
6.6. MER OM PROGRAMMERING OCH FUNKTIONER 63 denna area till att placera in texten.) Vi b¨or d¨aremot undvika att anv¨anda kommandon som p˚averkar var grafen plottas, som figure(#) och subplot, det ¨ar b¨attre att det kallande programmet g¨or s˚adana val, eftersom ¨onskem˚alen kan vara vitt skilda f¨or olika till¨ampningar.
Gr¨anssnitt och syntax
Gr¨anssnittet f¨or den h¨ar funktionen ¨ar detsamma som f¨or linfit, de parametrar som skall skickas vidare till linfit, vektorerna x, y och sigma m˚aste ges som argument i anropet till linplot. En lyx-variant av funktionen skulle kunna ha som tillval att man ¨aven ger en str¨ang som anger hur grafen skall plottas av plot-kommandot, som till exempel ’-or’, men i f¨orsta omg˚angen bryr vi oss inte om det. D¨aremot m˚aste vi skicka med tre textstr¨angar som ger text-str¨angar f¨or titel, x-etikett och y-etikett. Om vi vill kunna v¨alja om parameterv¨arden skrivs ut i plotten eller inte s˚a m˚aste vi s¨atta in flaggor f¨or detta i argumenten till funktionsanropen, parflag som ¨ar 1 om vi vill att parameterv¨ardena skall skrivas in och 0 annars, chiflag styr p˚a samma s¨att om chi-kvadrat och frihetsgrader skall skrivas ut (kom ih˚ag att variabler inte skall ha samma namn som funktioner, vi kan allts˚a inte anv¨anda title och xlabel som namn p˚a variablerna). Utdata fr˚an linplot ¨ar de samma som f¨or linfit, allts˚a i f¨orsta hand v¨ardet p˚a parametrarna och os¨akerheten i dessa, samt som tillval chi-kvadratsumman och antalet frihetsgrader. Vi kan dessutom t¨anka oss att linplot ibland kommer att kallas utan att den kallande rutinen anv¨ander utdata alls, i de fall det intressanta bara ¨ar att f˚a en graf. Syntaxen f¨or funktionen blir d˚a : function [parA, sigmaA, parB, sigmaB, ChiSquared, Dof]
=linfit(x, y, sigma, titel, labelx, labely, parflag, chiflag)
Eftersom linplot skall kalla linfit m˚aste vi ocks˚a fundera ¨over gr¨anssnittet mellan dessa b¨agge funktioner. I princip ¨ar det ju inget som hindrar linplot fr˚an att kalla linfit med alla sex utdata parametrarna i anropet. Men om linplot inte ¨ar kallad med parametrarna ChiSquared och Dof, och om chiflag ¨ar noll s˚a beh¨over man ju inte ber¨akna chi-kvadratsumman i linfit. Att ¨and˚a kalla linfit med alla sex utdata parametrar betyder d˚a att programmet spenderar tid p˚a att ber¨akna saker som aldrig kommer att anv¨andas, vilket ¨ar sl¨oseri. Vi m˚aste allts˚a i linplot testa om s˚a ¨ar fallet eller inte och bara anropa linfit med alla sex utdata parametrar om det ¨ar n¨odv¨andigt, annars anv¨ander vi [parA, sigmaA, parB, SigmaB]
Felkontroll
Det fel vi beh¨over testa f¨or ¨ar om vektorerna x, y och sigma har samma l¨angd, i annat fall kraschar errorbar-kommandot. Man kan tycka att vi inte beh¨over testa f¨or det i linplot eftersom linfit testar f¨or det. Men man skall f¨ors¨oka att skriva varje funktion s˚a komplett och sluten som m¨ojligt. Det kan ju h¨anda att vi i framtiden vill anv¨anda linplot s˚a att den kallas av n˚agon annan funktion ¨an linfit, i en s˚adan situation kan det vara om¨ojligt att minnas att vi m˚aste kolla om den nya funktionen g¨or den n¨odv¨andiga testen.
64 KAPITEL 6. PROGRAMMERING Testa funktionen
Om funktionen fungerar b¨or kodsnutten nedan clear all;
x =[1.097 1.700 3.39 1.399 3.70 2.190 2.5 4.00];
x=x*0.001;
y =[0.429 0.668 1.328 0.547 1.445 0.856 0.973 1.557];
dy =[0.001429 0.001668 0.0020 0.0015 0.0020 0.0010 0.0020 0.0030];
dy=dy*10;
clf
[parA, sigmaA, parB, sigmaB, chi, N] = linplot . . . (x, y, dy,’Resistor 1’,’Str¨om (A)’,’Sp¨anning (V)’,1,1)
skapa en graf som ser ut som:
testa ocks˚a att texten dyker upp p˚a r¨att st¨alle n¨ar riktningskoefficienten ¨ar negativ, och att vi kan sl˚a av och p˚a utskrift av parameterv¨arden med flaggorna som det ¨ar t¨ankt.
6.7. OVNINGSUPPGIFTER¨ 65
6.7 Ovningsuppgifter ¨
1. Skapa en vektor med tio element som best˚ar av likformigt f¨ordelade slumptal (minns sektion 5.3.2) som antar heltalsv¨arden fr˚an 1 till 6.
2. Skriv ett program som med hj¨alp av en for-slinga genererar utskriften:
Hej - nu ar X:
1.200
Hej - nu ar X:
2.400
Hej - nu ar X:
3.600
3. 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()
4. Skriv en programsnutt som anv¨ander en while-slinga f¨or att r¨akna hur m˚anga g˚anger du kallat slumptalsgeneratorn innan slumptalet blir st¨orre ¨an 0.75.
5. 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
6. 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.
66 KAPITEL 6. PROGRAMMERING 7. Skriv ett program som ber¨aknar en approximation till e, basen f¨or den naturliga
loga-ritmen, fr˚an summan.
e =
∞
X
k=0
1 k!
8. Skriv tv˚a funktionsfiler, medel och standavv, som ber¨aknar medelv¨arde och stan-dardavvikelse f¨or en vektor. Kontrollera att de ger samma resultat som mean och std!
Kapitel 7
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 sOctaveom 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 debugging. 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 de 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. 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: ’x’ undefined near line n column m error: called from:
error: Z:\slash...\slash funk.m at line n column m
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 (x = konstant) eller ber¨akning (x
= 3*y). F¨ors¨oker vi anv¨anda en variabel innan den definierats f˚ar vi felmeddelandet 67
68 KAPITEL 7. N ¨AR DET BLIR FEL ovan. Octave 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.
• error: operator * : nonconformant arguments (op1 is nxm, op2 is mxn) error: called from:
error Z:\slash...\slash funk.m
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.
• error: for A^b, A must be square
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 ofta 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.
• Syntax error parse error:
syntax error
>>> 3+/ 3
^
Syntax error kan vi f˚a p˚a m˚anga andra s¨att, varje g˚ang vi inte f¨oljer Octaves spr˚akliga regler, dvs reglerna f¨or hur vi skall formera v˚ara rader s˚a kommer vi att f˚a ett syntaxfel.
• error: invalid call to cos. Correct usage is:
-- Mapping Function: cos(X)
Detta felmeddelande ¨ar ocks˚a l¨att att f¨orst˚a. Vi har f¨ormodligen gl¨omt att Octave anv¨ander decimalpunkt och inte decimalkomma, s˚a n¨ar vi skriver till exempel cos(2,4) tolkas det som tv˚a tal, och eftersom cosinusfunktionen bara accepterar ett argument s˚a f˚ar vi ett fel.
Kapitel 8
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.
69
70 KAPITEL 8. 2D-GRAFIK
8.1 Kurvor i tv˚ a dimensioner
Att skapa enklare tv˚a-dimensionella plottar i Octave ¨ar relativt enkelt. En skillnad mellan Octave och en del andra grafikprogram ¨ar att vi inte kan instruera Octave att till exempel rita kurvan y=sin(x). Ist¨allet m˚aste vi ge Octave en upps¨attning punkter med en x-koordinat och en y-koordinat. Octave 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 Octave 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)
8.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, Octaves 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.
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.
8.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 p˚a
1Eftersom det Octave 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.
8.1. KURVOR I TV˚A DIMENSIONER 71 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 Octaves plot-kommando vektorer d¨ar punkterna ligger ganska t¨att. Det g¨ors enklast om vi anv¨ander oss av Octaves vektorfunktioner. Antag till exempel att vi vill plotta y=x2mellan 0 och 4.5. Vi kan d˚a antingen anv¨anda kolonoper-atorn 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.
8.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
1/r red * star
2/g green s square 3/b blue v triangle 4/m magenta o circle
5/c cyan + plus
y yellow . dot
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
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