• No results found

Viktad anpassning till r¨ at linje

10.2 Mer om programmering och funktioner

10.2.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 =

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,

10.2. MER OM PROGRAMMERING OCH FUNKTIONER 99 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 10.2.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 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.

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:

10.2. MER OM PROGRAMMERING OCH FUNKTIONER 101

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.

10.3 Ovningsuppgifter ¨

1. 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!

L˚at programmet l¨asa in hur m˚anga termer som skall finnas med i summan, och skriv sedan i kommandof¨onstret ut hur m˚anga termer som summerats, och skillnaden mellan approximationen och exp(1), genom en l¨ampligt formaterad textstr¨ang.

2. Modifiera programmet s˚a att det ist¨allet fr˚agar efter hur liten liten mellan approxima-tionen och exp(1) som efterstr¨avas och sedan ber¨aknar hur m˚anga termer som beh¨ovs innan approximationen blir tillr¨ackligt bra.

3. 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!

4. Skriv en funktionsfil som utf¨or en viktad minsta kvadratanpassning till ett f¨orstagradspolynom (y = a + b · x), p˚a samma s¨att som beskrivs i avsnitt 9.5 i kompendiet. Funktionsfilens f¨orsta rad kan vara n˚agot i stil med

function [A, deltaA] = minstakv(X, Y, deltaY).

5. Kronan p˚a verket blir att skriva en funktion som med matrismetoden g¨or en minsta kvadratanpassning till ett polynom med godtyckligt gradtal. Indata till funktionen ¨ar en vektor med y-v¨arden, en med x-v¨arden och en vektor med os¨akerheten i y-v¨ardena.

Dessutom m˚aste vi vid anropet ange till vilket gradtal anpassningen skall g¨oras. Utdata

¨

ar vektorn med parameterv¨ardena och covariansmatrisen. Den felkontroll som beh¨over g¨oras ¨ar att antalet y-v¨arden ¨ar minst lika stort som antalet parametrar som skall anpassas och att inget av felen ¨ar noll.

Appendix A

Syntax f¨ or formler i OpenOffice

A.1 Unary and binary operators

103

A.2 Relations

A.3. SET SYMBOLS 105

A.3 Set symbols

A.4 Functions

A.5. OPERATORS 107

A.5 Operators

A.6 Attributes

A.7. OTHERS 109

A.7 Others

A.8 Brackets

A.9. FORMATTING 111

A.9 Formatting

Appendix B

ComsolScripts Debugger

F¨or att underl¨atta fels¨okning i komplicerade programm finns i de flesta datormilj¨oer ett de-bugverktyg som p˚a olika s¨att underl¨attar fels¨okningen i program. Vi skall i det h¨ar kapitlet illustrera hur man kan arbeta med ComsolScripts debugger genom att korrigera ett felaktigt program f¨or att ber¨akna primtalsfaktorer. Programmet s¨oker primtalsfaktorer i variabeln x som antas finnas lagrad i workspace. I variabeln AntalFaktorer lagras hur m˚anga faktorer som finns i x, variabeln Faktor inneh˚aller de olika primtalsfaktorerna

AntalFaktorer=0;

i=2;

while (i < x) kvot = x/i;

rest = i*floor(kvot) - x;

% om rest ¨ar noll g˚ar divisionen j¨amnt ut if(rest==0)

AntalFaktorer = AntalFaktorer +1;

Faktor(AntalFaktorer) = i;

end if(i==2)

i=i+1;

else

i=i+2;

end end

AntalFaktorer Faktor

L¨agg m¨arke till att det inte r¨acker att g˚a upp till i < sqrt(x), om talet har primfaktorer s˚a m˚aste minst en av dem vara l¨agre ¨an roten ur talet, men andra faktorer kan vara st¨orre.

Det r¨acker allts˚a att loopa upp till roten ur x om vi bara vill veta om x ¨ar ett primtal eller inte, men om vi vill hitta alla primfaktorer s˚a m˚aste vi g˚a hela v¨agen.

B.1 Debuggning med breakpoints

L˚at oss illustrera processen med hj¨alp av programmet p˚a f¨oreg˚aende sida f¨or att ber¨akna primtalsfaktorer. Skriv in koden i en m-fil och spara den med namnet prim1.m i den aktuella katalogen.

Om vi nu i kommandof¨onstret skriver x=9 f¨or att ladda ned det v¨ardet i workspace och sedan k¨or programmet, enklast genom att skriva prim1 s˚a ser vi att programmet uppenbarligen inte fungerar som det var t¨ankt, AntalFaktorer ¨ar lika med ett och inte tv˚a. F¨or att unders¨oka

113

vad som h¨ander s¨atter vi en s˚a kallad ”break-point” i programmet. Detta g¨or vi genom att skriva dbstop prim1. Vi kan kontrollera att det fungerar genom att klicka p˚a fliken

“Breakpoints” l¨angst ned i Skrivobrdsf¨onstret. N¨ar vi nu exekverar prim1.m genom att skriva prim1 s˚a g˚ar ComsolScript in i Debug-mod, vilket visas genom att prompten C  byts ut mot D . I debug-mod stannar program-exekveringen d¨ar man satt sin break-point, i det h¨ar fallet i b¨orjan av programmet prim1 (man kan genom att ge kommandot dbstop prim1

# d¨ar # ¨ar en siffra instruera ComsolScript att s¨atta en break-point vid rad # i en given rutin). N¨ar programmet stannar s˚a skrivs f¨orst radnumret och sedan kommandot som ges p˚a den raden ut. Samtidigt ¨oppnas filen i editor-f¨onstret. Genom kommandot dbstep kan vi stega igenom filen steg f¨or steg. Hela tiden kan vi f¨olja med i editorf¨onstret och se hur l˚angt vi kommit i programmet. Vi kan vid varje rad kontrollera v¨ardet p˚a variabler i programmet genom att bara skriva namnet p˚a variabeln, jfr exemplet:

C clear all

prim1 5 rest = i*floor(kvot) - x;

D kvot kvot = 4.5000

Det h¨ar visar n˚agot som ¨ar viktig att komma ih˚ag: n¨ar vi stannar vid en punkt i programmet och ComsolScript skriver ut kommandot i kommandof¨onstret s˚a har kommandot ¨annu inte utf¨orts. S˚a n¨ar vi stannar vid rad 4 s˚a ¨ar kvot ¨annu inte definierad eftersom divisionen inte utf¨orts.

Det kan bli ganska omst¨andigt att stega igenom varje kommando i ett program, ofta vill man ist¨allet t ex stanna till en g˚ang i varje loop. Det kan vi g¨ora genom att utnyttja m¨ojliheten att st¨atta en break-point p˚a godtyckligt st¨alle i en fil. Vi g˚ar ur debug-mode genom att ge dbquit, tar bort v˚ar gamla break-point med dbclear och s¨atter en vid b¨orjan av while-loopen med dbstop prim1 4. N¨ar vi sedan k¨or prim1 stannar ComsolScript i debug-mod vid rad 4, dvs f¨orsta g˚angen vi ¨ar “inuti” while-loopen. Vi kan nu unders¨oka v¨ardet p˚a v˚ara variabler genom att t.ex. skriva x eller i i kommandof¨onstret. G¨or vi det ser vi att allt verkar normalt, x ¨ar 9 och i ¨ar 2, precis som f¨orv¨antat. Vi forts¨atter nu genom att ge

B.1. DEBUGGNING MED BREAKPOINTS 115 kommandot dbcont. Det kommandot inneb¨ar att exekveringen av programmet forts¨atter tills man kommer fram till n¨asta break-point (det g˚ar bra att s¨atta mer ¨an en break-point i ett program). Vi ger dbcont en g˚ang till f¨or att se vad som h¨ander n¨asta varv i loopen. Vi ser att i stegas upp till 3, x ¨ar fortfarande 9, vi tar ett varv till och finner x = 9, i = 5 och AntalFaktorer = 1. H¨ar har vi felet! Programmet har visserligen “sett” att 3 ¨ar en faktor i nio, men vi testar inte om faktorn finns mer ¨an en g˚ang: variabeln stegas upp till 5 utan att testa om 3 f¨orekommer som faktor mer ¨an en g˚ang. Vi m˚aste allts˚a l˚ata bli att stega upp i

s˚a att inte i stegas upp om den ¨ar en faktor i x. Vi korrigerar detta och verifierar att programmet ger r¨att resultat. F¨or att slippa stega oss fram tar vi d˚a bort v˚ar tidigare break-point, enklast genom att skriva dbclear, clear all f¨oljt av x = 9 och k¨or sedan genom att ge prim1: N¨ar vi g¨or det intr¨affar n˚agot som h¨ander litet d˚a och d˚a: n¨ar vi trycker p˚a return f¨orsvinner prompten och ingenting h¨ander, ingen output, och ingenting h¨ander om vi f¨ors¨oker skriva in kommandon. Oftast ¨ar det h¨ar beteendet f¨ororsakat av att programmet har hamnat i en o¨andlig loop d¨ar villkoret f¨or att loopen skall avbrytas aldrig blir sant.

F¨or att kunna ˚atg¨arda felet m˚aste vi f¨orst och fr¨amst f˚a ComsolScript att sluta med loopan-det, det ˚astadkommer vi genom att klicka i kommandof¨onstret och trycka ctrl-C, dvs vi trycker samtidigt in control-tangenten och c. Som svar p˚a ctrl-C avbryter ComsolScript utf¨orandet av det program som k¨or och l¨amnar tillbaka kontrollen till kommandof¨onstret. Vi g¨or clear all f¨or att bli av med eventuellt skr¨ap och s¨atter x=9. Vi kan unders¨oka var felet ligger med hj¨alp av en annan av metoderna i debuggern. S¨att tillbaks en break-point p˚a samma st¨alle och skriver prim1 stannar vi vid v˚ar break-point igen.

Vi kan nu forts¨atta h¨arifr˚an en rad i taget genom skriva dbstep. N¨ar vi g¨or det flyttas vi stegvis genom programmet. Det h¨ar illustrerar ett annat s¨att att utnyttja debuggern, vi kan se exakt i vilken ordning raderna i programmet utf¨ors - speciellt som den aktuella raden alltid visas i editor-f¨onstret - och p˚a s˚a s¨att se exakt hur vi r¨or oss genom komplicerade if-strukturer. Vid varje punkt kan i programmet kan vi dessutom som vanligt unders¨oka/s¨atta v¨ardet p˚a variabler i programmet. M¨ark ocks˚a att n¨ar vi ¨ar inne i debuggern s˚a kan vi fliken

“DEbug” l¨angst ned p˚a skrivbordet f˚a upp knappar f¨or de vanligaste kommandona och t.ex.

stega fram bara genom att klicka med musknappen. Genom att stega oss fram fr˚an v˚ar

break-point kan vi se hur programmet korrekt detekterar att 2 inte ¨ar en faktor i 9, hur i stegas upp fr˚an 2 till 3 och hur vi sedan testar om 3 ¨ar en faktor i 9. Efter att ha “sett” att s˚a ¨ar fallet, och korrekt stegat upp AntalFaktorer forts¨atter programmet, och eftersom tre var en faktor stegas i inte upp.

Du skall nu med hj¨alp av debuggern ge dig i kast med ¨ovningsuppgift 1 d¨ar uppgiften ¨ar att genom att forts¨atta att stega dig fram˚at dels finna orsaken till den o¨andliga loopen, dels f¨ors¨oka korrigera ytterligare ett ˚aterst˚aende fel i programmet som g¨or att ¨aven n¨ar du kurerat den o¨andliga loopen s˚a f˚ar vi fortfarande inte r¨att svar f¨or antalet faktorer.

Mer hj¨alp om debuggern kan du f˚a i on-line hj¨alpen via ?/ComsolScript/The Program-ming Language/Debugging/Debug Commands

B.2. OVNINGSUPPGIFTER¨ 117

B.2 Ovningsuppgifter ¨

1. Anv¨and ComsolScripts debugger f¨or att f¨orst˚a hur den o¨andliga loopen uppst˚ar och korrigera programmet s˚a att det p˚a ett korrekt s¨att ber¨aknar primtalsfaktorerna i godtyckliga tal.

Appendix C

Svar och l¨ osningar

C.2 Svar till kapitel 2

1. a) 8.7000 b) 0.8660 c) 123.3333 2. 9

4. en m¨ojlig l¨osning ¨ar:

% Hej.m

Namn=’Hej Sten Hellman’ ; disp(Namn);

6. en m¨ojlig l¨osning ¨ar:

disp(’1’) pause(3) disp(’2’) pause(3) disp(’3’) pause(3) disp(’4’) pause(3) disp(’5’)

C.3 Svar till kapitel 3

1. a) y=3*x.^2+4*x (y = 7 39 95 175 )

b) yPrim = yPrim = 6*x + 4 (yPrim = 10 22 34 46) 2. y=2*x.^3 + 4*x - 3 (y = 3.0000 49.5938 131.2380 210.0720) 3. a1 = [2;-5;2] ; a2 = [3 ; 2 ; -4]; a3 = [1 ; 0 ; 2]

A = [a1 a2 a3]

A2 = [a2’ ; a3’ ; a1’]

4. b = [1.4:1.8:7.6]’

5. A + B =

4 -7 9 2

119

-1 -5 -1 7

1 -2 6 12

A-B =

-2 1 5 -2

5 -3 -1 5

-5 2 0 -2

A’*B =

-9 -2 -4 -10

3 16 -6 -10

33 -33 23 34

-3 -16 15 41

6. S = [0.5 1.0 0.25 2.0]

V = diag(S.ˆ(-2))

7. x = alfa*pi/180 (x = 0 0.5236 1.0472 1.5708)

s = sin(x) ( s = 0 0.5000 0.8660 1.0000 )

c=(1-s.^2).^0.5 ( c = 1.0000 0.8660 0.5000 0 )

A=[alfa’ s’ c’]

( A =

0 0 1.0000

30.0000 0.5000 0.8660 60.0000 0.8660 0.5000

90.0000 1.0000 0 )

8. massa = [2.0 1.5 3.0 2.0 2.5];

hastighet = [ 2.0 4.0 -3.0 1.0 6.0];

T = 0.5*massa.*hastighet.^2

(T = 4.0000 12.0000 13.5000 1.0000 45.0000 totT = sum(T) (totT = 75.5000)

C.4 Svar till kapitel 4

1. r = ceil(6*rand(1,10))

2. Ett f¨orslag till l¨osning kan vara:

function y = slumptal()

%

% producerar ett slumpat heltal mellan 1 och 100

%

y = 1 + floor(100*rand(1,1));

3. Ett f¨orslag till l¨osning ¨ar:

C.7. SVAR TILL KAPITEL 7 121

% function to compute square root of x, using Newtons formula

% y(k+1) = 0.5*(y(k) + x/y(k)) with y(1) = 1

y = ( round(10000*ynew) / 10000)

C.7 Svar till kapitel 7

en kod som producerar det ¨ar t.ex:

t = [71 71 73 73 73 74 74 74 74 74 75 75 75 75 76 77 77 77 78 80];

figure(1)

mycenter1 = 71:80;

hist(t,mycenter1) figure(2)

mycenter2 = 71.5:2:79.5;

hist(t,mycenter2) figure(3)

clf

mycenter3=65.5:10:85.5;

hist(t,1) figure(3) axis

axlar=axis()

axlar(1)=axlar(1)-1;

axlar(2)=axlar(2)+1;

axis(axlar)

2. Det vi ser ¨ar hur serieutvecklingen av sinusfunktionen successivt n¨armar sig funktionen vartefter man tar med fler och fler termer i summan. Grafen b¨or se ut ungef¨ar s˚a h¨ar:

0 1 2 3 4 5 6 7

−4

−3

−2

−1 0 1 2 3 4 5 6 7

grad 1 grad 3 grad 5 grad 7 grad 9 sinus

som kan kodas s˚a h¨ar:

x = 0:0.2:6.2;

C.9. SVAR TILL KAPITEL 9 123

legend(Text1, Text2, Text3, Text4, Text5, Text6)

C.9 Svar till kapitel 9

1. O = 5 −1 9 2.5

!

Vilket f˚as genom att koda:

>> I= [3 4 ; -2 1];

vilket f˚as ur: >> clear all

>> B= [22 ; -21 ; 17];

>> A = [4 -5 3 ; 1 5 -6 ; 3 1 4];

>> inv(A)*B ans =

2.0000 -1.0000 3.0000

3. Det r¨acker med att l¨agga till raderna Deltaa = sqrt(sumwx2/delta);

Deltab = sqrt(sumw/delta);

C.10 Svar till kapitel 10

1. En m¨ojlig l¨osning ¨ar:

% exponent.m

% computes approximation to exp(x) from serial

% expansion

% Sten Hellman 2005-03-03 clear all;

disp(’En approximation till e berknas genom serieutveckling’);

Termer=input(’Upp till vilken term skall summeringen g? \n’);

Faktor=1;

Approx = 1;

% this establishes the zero-term for index=1:Termer

Faktor = Faktor * index;

Approx = Approx + 1/Faktor;

end

Diff = exp(1) - Approx;

out = sprintf(’Efter %g termer r approximationen= %g, skillnaden r %g’,...

%index,Approx,Diff);

disp(out)

2. Eftersom vi inte p˚a f¨orhand vet hur m˚anga termer som kommer att beh¨ovas s˚a m˚aste vi ers¨atta for-loopen med en while-loop. Vi justerar dessutom in/output satserna:

% exponent2.m

C.10. SVAR TILL KAPITEL 10 125

% computes approximation to exp(x) from serial

% expansion

% Sten Hellman 2005-03-03 clear all;

disp(’En approximation till e berknas genom serieutveckling’);

Delta=input(’Upp till vilken noggrannhet summeringen g? \n’);

Faktor=1;

Approx = 1;

Diff = exp(1) - Approx;

index = 0;

% this establishes the zero-term while (Diff >= Delta)

index = index + 1;

Faktor = Faktor * index;

Approx = Approx + 1/Faktor;

Diff = exp(1) - Approx;

end

out = sprintf(’Efter %g termer r approximationen= %g, skillnaden r %g’,...

%index,Approx,Diff);

disp(out)

3. en m¨ojlig l¨osning ¨ar:

function m = medel(x) if (length(x) == 0)

disp (’Cannot compute average for empty vector’) m = 0;

else

m = sum(x) / length(x);

end och

function s = standavv(x) if (length(x) < 2)

disp(’Cannot compute std dev for less than two numbers’) s = 0;

else

m = sum(x) / length(x);

diff = x - m;

s = sqrt( (sum(diff.∧2)) / (length(x) - 1));

end

4. En m¨ojlig l¨osning ¨ar:

function [A, deltaA] =minstakv(x, y, sigma) if(length(x) ~= length(y))

error(’dimension of x and y do not match’) elseif (length(x) ~= length(sigma))

error(’dimension of x and sigma do not match’) end

weights=sigma.^(-2);

sumw=sum(weights);

sumwx=sum(weights.*x);

sumwy=sum(weights.*y);

sumwx2=sum(weights.*x.^2);

sumwxy=sum(weights.*x.*y);

Delta = sumw*sumwx2-sumwx^2;

parA=(sumwx2*sumwy - sumwx*sumwxy)/Delta;

deltaparA=sqrt(sumwx2/Delta);

parB=(sumw*sumwxy-sumwx*sumwy)/Delta;

deltaparB=sqrt(sumw/Delta);

A = [parA parB];

deltaA = [deltaparA deltaparB];

C.10. SVAR TILL KAPITEL 10 127

C.11 Svar till Appendix B

1 Felet med programmet ¨ar att variabeln x inte ¨andras n¨ar vi har hittat en prim-talsfaktor. Varje g˚ang vi till exempel testar om 9 ¨ar j¨amnt delbart med 3 s˚a stegas AntalFaktorer upp med en enhet, men x ¨ar fortfarande 9 n¨asta g˚ang vi testar. N¨ar vi hittar en primfaktor till x m˚aste vi dividera bort den ur x innan vi forts¨atter att s¨oka fler faktorer, till exempel s˚a h¨ar:

AntalFaktorer=0;

i=2;

while(i<= x) kvot = x/i;

rest = i*floor(kvot)-x;

if(rest ==0)

AntalFaktorer = AntalFaktorer + 1 Faktor(AntalFaktorer) = i

x = kvot;

else

if(i==2) i=i+1;

else i=i+2;

end end

end

AntalFaktorer Faktor

Index

st¨ang av eko av kommandon, 14 ekvationer

f¨argskala

fler grafer i samma f¨onster, 69 fler kurvor i samma graf, 69 flytta till andra program, 67

INDEX 131

nollst¨allen f¨or polynom, 85 num2str, 77

pdf-format i OpenOffice, 55