TAIU07 Föreläsning 4 Repetitonssatsen while. Avbrott med break. Exempel: En Talföljd och en enkel simulering. Egna funktioner. Skalärprodukt. Lösning av Triangulära Ekvationssystem. Programmeringstips. 2 februari 2016 Sida 1 / 23
Repetitionssatser Kommandot while exekverar en satsgrupp så länge som ett logiskt villkor är sant. Den generella formen är: while <logiskt villkor> <satsgrupp> Det är viktigt att en while sats kan avbrytas. Falskt Villkor Sant Kommandon 2 februari 2016 Sida 2 / 23
Exempel Fibonacci talen ges av F 1 = 0, F 2 = 1, och F n = F n 1 + F n 2. Vilket är det största talet F k som forfarande är mindre än 100? I Matlab skriver vi: F(1)=0;F(2)=1;n=2; while ( F(n)< 100 ) n=n+1; F(n)=F(n-1)+F(n-2); n-1,f(n-1) Repetitionssatsen avbryts när n = 13 så det största talet blir F 12 = 89. 2 februari 2016 Sida 3 / 23
Exempel Exponentialfunktionen kan beräknas genom Taylor serien, e x = 1+x+ x2 2 + x3 6 +... Skriv ett program som beräknar e x för ett givet värde x. Avbryt summeringen då nästa term inte längre påverkar resultatet. Om S är en vektor med logiska värden så ger all(s) sant om samtliga elemement i S har värdet sant; och falskt annars. Uttrycket any(s) ger värdet sant om något element i S har värdet sant. Använd all() för att förändra programmet så att det kan beräkna e x för alla värden i en vektor x. 2 februari 2016 Sida 4 / 23
Att avbryta en repetitionssats Kommandot break avbryter en while eller for sats direkt. Exempel I ett spel försöker vi slå en tärning högst 10 gånger i följd. Målet är att få samma resultat två gånger i rad. Skriv ett Matlab program som simulerar en sådan spelomgång. För varje lyckad omgång skriver vi ut antalet kast som krävdes. Övningar Rita först upp ett flödesschema som beskriver hur simuleringen skall genomföras. Skriv sedan lämpliga Matlab kommandon. 2 februari 2016 Sida 5 / 23
Exempel En talföld {x k } k=0 genereras ifrån ett positivt heltal x 0 enligt följande regler: 1. Om x k udda så fås nästa tal som x k+1 = 3x k + 1. 2. Om x k är jämnt fås x k+1 = x k /2. Om vi startar med talet 6 får vi talföljden: 6 3 10 5 16 8 4 2 1. Övning Vi antar att att alla sådana talföljder slutar med 1. Skriv ett program som verifierar detta för startvärden mellan 1 and 100. Hitta dessutom det startvärde som ger den längsta talföljden. 2 februari 2016 Sida 6 / 23
Funktioner i MATLAB En funktion har ett antal inagrument och beräknar ett antal utargument. Exempel Funktionen zeros har som inparameter två heltal N och M. Utparameter är en matris av dimension N M med nollor. >> Z = zeros( N, M ); 2 februari 2016 Sida 7 / 23
Funktioner skapas genom att man samlar kommandon på en fil, exemelvis min_funktion.m. Dessutom skall man skriva ett funktionshuvud. % % Inledande kommentar % function [ut1,ut2]=min_funktion( in1,in2,in3 ) <beräkna ut1,ut2 givet in1,in2,in3> En funktion kan ha godtyckligt antal in-, respektive ut-parametrar. Den inledande kommentaren skrivs ut om man skriver >> help min_funktion 2 februari 2016 Sida 8 / 23
Exempel På filen funk.m har vi skrivt function [f]=funk(x,y) y=2*x+y; f=x^2+2*y; Vad händer om vi skriver följande kommandon >> x=1;y=2; >> x=funk( x, y ); >> disp(x),disp(y) 2 februari 2016 Sida 9 / 23
Exempel På filen serie.m har vi skrivt function [S]=serie(N) S=0; for k=1:n,s=s+1/k^2;, Skriver vi följande kommandon >> S=serie( 100 ); >> disp(s) 1.6350 >> disp(k) Undefined function or variable k. Variabler är lokala. Skapas, eller ändras, en variabel i en funktion är det en lokal kopia som ändras. Då funktionen avslutas är det ast utparametrar som sparas. 2 februari 2016 Sida 10 / 23
Exempel Skalärprodukten mellan två vektorer x och y kan beräknas med formeln n x y = x i y i. Skriv en funktion som beräknar skalärprodukten. Funktionen skall användas enligt i=1 >> S = ScalarProd( x, y ); 2 februari 2016 Sida 11 / 23
På filen ScalarProd.m skriver vi: % ScalarProd: Beräkna skalärprodukt mellan två v % y. Anropas enligt: % % >> S = ScalarProd( x, y ); % function [S]=ScalarProd( x, y ) n=length(x); S=0; for i=1:n S=S+x(i)*y(i); ; Kommentar Då x y = x T y kan vi skriva funktionen enklare. Det finns även en fördefinierad funktion dot(). 2 februari 2016 Sida 12 / 23
Rekursiva funktioner En funktion som anropar sig själv kallas rekursiv. Vid varje funktionsanrop skapas nya lokala kopior av variabler. Exempel Fakulteten är definerad genom att n! = n (n 1)!, 0! = 1. Skriv en MATLAB funktion som beräknar n! för ett givet heltal n. 2 februari 2016 Sida 13 / 23
På filen Fakultet.m skriver vi function [F]=Fakultet(N) if N==0, F=1; else F=N*Fakultet(N-1); ; Vad händer om vi skriver >> Fakultet( 4 ); 2 februari 2016 Sida 14 / 23
Tillämpning: Triangulära ekvationssystem Exempel Ett undertriangulärt ekvationssystem Lx = b har följande struktur l 11 0 0 0 x 1 b 1 l 21 l 22 0 0 x 2 l 31 l 32 l 33 0 x 3 = b 2 b 3. l 41 l 42 l 43 l 44 x 4 b 4 Frågor När är ett undertriangulärt ekvationssystem lösbart? Hur skall lösningen beräknas. 2 februari 2016 Sida 15 / 23
Lemma Ett undertriangulärt ekvationssystem Lx = b har en unik lösning om alla diagonalelement l ii, i = 1,...,n är nollskiljda. Uppgift Skriv en funktion IsNonSingular som undersöker om alla diagonal elemement i matrisen L är noll-skiljda. Funktionen skall kunna användas som L=[1 0 0 ; -2 3 0 ; 2 4-1 ]; if IsNonSingular( L ) disp( Finns unik lösning ) 2 februari 2016 Sida 16 / 23
Lemma Ett undertriangulärt ekvationssystem Lx = b kan lösas med frammåtsubstitution. Ekvationssystemet Lx = b löses en obekant i taget. Givet att vi beräknat x 1, x 2,...,x i 1 fås nästa obekant genom x i = b i k 1 j=1 l ij x j /l ii. Uppgift Skriv en Matlab funktion TriangleSolv som löser ett godtyckligt undertriangulärt ekvationssystem. 2 februari 2016 Sida 17 / 23
På filen TriangleSolv.m skriver vi function [x]=trianglesolv( L, b ) [n,m]=size(l); % Kontrollera matris storlek x=zeros(n,1); for i=1:n % Beräkna lösningskomponenten x(i) x(i)=b(i); for j=1:i-1 x(i)=x(i)-l(i,j)*x(j); x(i)=x(i)/l(i,i); Vi kan nu använda våra funktioner! 2 februari 2016 Sida 18 / 23
I Matlab L=[1 0 0 ; -2 3 0 ; 2 4-1 ]; b=[3-1 2] ; if IsNonSingular( L ) x = TriangleSolv( L, b ); b2=l*x; disp( b2 ) else disp( Ej säkert lösbart ); Detta ger utskriften 3-1 2 Vi kar alltså fått rätt lösning! 2 februari 2016 Sida 19 / 23
Programmeringstips Exempel Vi vill beräkna en approximation av derivatan f (2) då f(x) = 1+x med formeln f (2) f(2+h) f(x h), h > 0. 2h Beräkna felet som funktion av h för h = 1/n, n = 10, 20,..., 100. Plotta sedan resultatet med loglog. Lösning Gör följande steg 1. Skapa en vektor h med alla h-värden. Skapa en vektor Df med nollor. 2. En for-loop där Df(i) beräknas som derivata approximationen för steglängd h(i). 3. Beräkna en vektor med fel. Plotta i log-skala. 2 februari 2016 Sida 20 / 23
I Matlab skriver vi n=10:10:100; % Får n=( 10 20 30... 100 ) h=1./n; % Får h=(1/10 1/20... 1/100 ) Df = zeros(size(h)); for i=1:length(h) % Beräkna Df(i) med steg h(i) Df(i)=( f(2+h(i)) - f(2-h(i)) )/2/h(i); e=abs(df - 1/2/sqrt(3) ); loglog( h, e, b+- ) Vi väljer först h vektorn. I for-loopen använder vi ett värde h i i taget. Undvik for-loopar där loop-variabeln inte kan ses som ett index eller heltalig räknevariabel. Använd variabelnamn som är naturliga för uppgiften h, Df, etc. 2 februari 2016 Sida 21 / 23
Felet vid derivata beräkning som funktion av h uppritat i log-skala. 10-4 10-5 10-6 10-7 10-2 10-1 Taylor-utveckling visar att detta approximation har ett fel e(h) Ch 2. Då log(e(h)) = log(c)+2 log(h) fås en rät linje med riktningskoefficient 2. 2 februari 2016 Sida 22 / 23
För att få lättlästa program bör man vara konsekvent med hur variabler namnges Regler - Index variabler för loopar: i, j, k. - Vektorlängd, Matrisstorlek, Antal: n, m, N, M - Reella tal: t, x, y, z, u, v - Matriser: A, B, C,... - Vektorer: x, y, b,... - Funktionsvärden: f, g, q, w,... Undvik att använda l, o, O, 0 ty svåra att se skillnad på. Långa förklarande namn blir tydliga men jobbiga att skriva. 2 februari 2016 Sida 23 / 23