Börja programmera Kapitel 4 i kompendiet Jämförande uttryck Villkorssatser Loopar (slingor) Funktioner Läs inte avsnitt 4.2.3 2010-09-23 Datorlära, fysikexperiment - del 4 1
Jämförande uttryck 2010-09-23 Datorlära, fysikexperiment - del 4 2
Jämförande uttryck (2) 2010-09-23 Datorlära, fysikexperiment - del 4 3
Villkorssatser 2010-09-23 Datorlära, fysikexperiment - del 4 4
Villkorssatser (2) if ((a < b) & (a < c)) utför instruktionerna A else utför instruktionerna B end Innebär att om a<b och a<c så är hela utsagan sann och instruktionerna i A utförs - annars utförs instruktionerna i B if ((a == b) (a == 0)) utför instruktionerna A end Innebär att om a=b eller a=0 så är utsagan sann och A utförs. 2010-09-23 Datorlära, fysikexperiment - del 4 5
2010-09-23 Datorlära, fysikexperiment - del 4 6
Övning 1 Skriv en programsnutt som skriver ut Träff! om ett slumptal mellan 0 och 5 är större än 2 men mindre än eller lika med 4 annars Bom!. Skriv även ut slumpvärdet avrundat till närmaste heltal. Tips: 1. Ett slumptal mellan 0 och 1 fås med kommandot rand. 2. Hur får du då ett slumptal mellan 0 och 5? 3. Använd funktionen disp( din text ) för att skriva ut. 4. Använd funktionen num2str(tal) för att konvertera tal (ditt avrundade slumptal) till en textsträng. 5. Sätt samman utskriften på detta sätt (mer om detta senare): 6. disp([ Slumptalet är num2str(tal) : Träff! ]) 2010-09-23 Datorlära, fysikexperiment - del 4 7
Loopar 2010-09-23 Datorlära, fysikexperiment - del 4 8
Loopar (2) 2010-09-23 Datorlära, fysikexperiment - del 4 9
Övning 2 Komplettera ditt tidigare program med slumptal på så sätt att du beräknar 10 000 slumptal mellan 0 och 5 och räknar antalet träffar du får. Tips: 1. Du skall inte skriva ut Träff! eller Bom! denna gång! 2. Skriv ut det totala antalet träffar endast. 3. Det är lämpligt att införa en räknare som initieras till 0 innan loopen. 4. Testkör programmet med ett fåtal loopar i början! 5. Är antalet Träff det du förväntar dig? 2010-09-23 Datorlära, fysikexperiment - del 4 10
Funktioner Vi har redan använt en del fördefinierade funktioner som sin, sqrt, disp, sum etc. Egna funktioner skapas i makrofiler (m-filer) Alla funktioner börjar med definitionen function <utdata> = <namn>(<indata>) Exempel: medelvärdet av data i vektorn x. function res = medel(x) % Beräkna medelvärdet av talen i vektorn x res = sum(x)/length(x); x är indat=argumentet, res är utdata=returvärdet. Funktioner definieras i en makrofil med samma namn som funktionen: medel.m. 2010-09-23 Datorlära, fysikexperiment - del 4 11
Funktioner (2) Fler än ett argument Exempel: räkna ut värdet av en matematisk funktion function y = func(a,b,c) y = a*sin(pi*b)^c Anrop med tre argument func(1.2, 3, 2) Fler än ett returvärde function [m v] = stat(x) m = sum(x)/length(x); v = sum((x - m).^2/(length(x) 1); 2010-09-23 Datorlära, fysikexperiment - del 4 12
Funktioner (3) Antalet argument till funktionen kan variera Funktion nargin anger antalet givna argument Exempel: evaluera polynom upp till graden 2 function f = polynom(x,a,b,c) f = a; if (nargin>2) f = f + b*x; end if (nargin>3) f = f + c*(x.^2); end Funktionen kan nu anropas med 2, 3 eller 4 argument >> polynom(2,3) -> 3 = 3 >> polynom(2,3,1) -> 3+1*2 = 5 >> polynom(2,3,1,4) -> 3+1*2+4*2^2 = 21 2010-09-23 Datorlära, fysikexperiment - del 4 13
Funktioner (4) Att avsluta en funktion Kommandot return avslutar funktionen direkt Exempel: felhantering function f = polynom(x,a,b,c) if (nargin<2) disp( Anropa med minst 2 argument ); return end f = a; if (nargin>2); f = f + b*x; end if (nargin>3); f = f + c*(x.^2); end Se även kommandot break som kan användas i slingor Notera kompaktifieringen av koden ovan 2010-09-23 Datorlära, fysikexperiment - del 4 14
Programstruktur Funktioner eller makron? Till en laboration görs vanligen en makrofil med Mätdata Enklare uträkningar Utskrifter och plottar Anropa egna funktioner Funktioner definieras lämpligen för standardiserade beräkningar Beräkning av specifik funktion, t.ex. fakultet, poisson För kurvanpassning Observera att variabler, inklusive argument och returvaribler i en funktion är lokala! Funktionen dbstep kan användas för att sätt debugga en m-fil. Läs mer om debuggern i kapitel 13 i kompendiet vid behov. 2010-09-23 Datorlära, fysikexperiment - del 4 15
Övning 3 Instuderingsfrågor 2 Gör följande uppgifter ur kompendiet (ComsolScript 1.3) Uppgift 3.9 Uppgift 3.8 Uppgift 4.3 Uppgift 4.4 Uppgift 4.5 2010-09-23 Datorlära, fysikexperiment - del 4 16
Kort om matriser Matriser är tabeller av tal Exempel: en vektor med dimensionen 1 x 3 (1 rad, 3 kolumner) >> x = [1.2 4.5 9.0] Exempel: en vektor (matris) med dimensionen 2 x 3 >> x = [1.2 4.5 9.0; 11-1 1] Exempel: en vektor (matris) med dimensionen 3 x 3 >> x = [1.2 4.5 9.0; 11-1 1; 0 2 0] Elementen hämtas och ändras med index: x(r,k) där r = radnummer och k = kolumnnummer. T.ex. >> x(1,2) = 4.5; En hel rad eller kolumn kan ändras: >> x(1,1:3) = [10 20 30]; eller plockas ut: >> rad3=x(3,1:3); (=[0 2 0]) Operationer - elementvisa: + -.*./.^ Produkten av två vektorer [a b c]*[d e f]' = a*d + b*e + c*f 2010-09-23 Datorlära, fysikexperiment - del 4 17
C» % Formaterad och oformaterad input/output av data C» format short Formaterad I/O C» disp(['1/7 = ' num2str(x)]) 1/7 = 0.14286 % 5 värdesiffror % num2str kan formatera output C» % Funktionen input C» input('a') % input kräver minst ett argument a123 % otydlig inputsignal ans = 123 C» input('a = ') % ger tydligare inputsignal a = 4 ans = 4 C» input('ange ett tal: ') Ange ett heltal: 123 ans = 123 % att föredra C» txt=input('skriv en text: ','s') >> 123 % detta är ett tal men txt = % txt är nu inte ett tal 123 C» txt=input('skriv en text: ') >> '123' % input ser en textsträng på input txt = 123 C» disp(['1/7 = ' num2str(x,'%10.4f )]) 1/7 = 0.1429 % 4 värdesiffror C» disp(['1/7 = ' num2str(x,'%10.14f ')]) 1/7 = 0.14285714285714 % 14 värdesiffror C» disp([num2str(x,'1/7 = %20.4f )]) % formatera i tabellform x= 0.1429 C» disp([num2str(x,'1/7 = %20.14f )]) 1/7 = 0.14285714285714 C» disp([num2str(x,'1/7 = %20.18f )]) 1/7 = 0.142857142857142849 % de 2 minst signifikanta siffrorna % är felräknade (datorn har begränsad % precision). % Det kan ibland vara en fördel att skriva ut resultatet i en textsträng C» % Funktionen sprintf % konverterar tal till text C» txt=sprintf('1/7 = %20.18f,x); % formatet först sedan variabeln C» disp(txt) 1/7 = 0.142857142857142849 C» txt=sprintf('1/7 = %10.6f,%15.6f ',x,x/10000) txt = 1/7 = 0.142857, 0.000014 % otillräcklig precision f -> g format C» % Funktionen num2st r% konverterar tal till text C» x=1/7 x = 0.1429 % endast 4 värdesiffror C» txt=sprintf('1/7 = %10.6f,%15.6g ',x,x/10000) txt = 1/7 = 0.142857, 1.42857e-005 C» 2010-09-23 Datorlära, fysikexperiment - del 4 18
Övning 4 Spara dessa data i filen datafil1.txt 1 2 3 0.1 0.2 0.3-1 -2-3 Läs filen med: C» h=fopen('datafil1.txt') % öppna filen C» data=fread(h) % läs filen med fread C» close(h) % stäng filen Läs filen med: C» data=fscanf(h,'%f') % använd fscanf istället 2010-09-23 Datorlära, fysikexperiment - del 4 19
Spara dessa data i filen datafil1.txt 1 2 3 0.1 0.2 0.3-1 -2-3 Om denna fil läses med C» h=fopen('datafil1.txt') % öppna filen C» data=fread(h) % läs filen C» close(h) % stäng filen kommer data att innehålla ascii-koden för tecknen 1 <blank> 2 etc. C» a=fread(h) a = 49 = 1 32 = <blank> 50 32 51 13 = carriage return 10 = line feed 48 = 46 = punkt fread läser binära data och skall inte användas i detta sammanhang (endast om filen är skriven med fwrite). C» data=fscanf(h,'%f') % använd fscanf data = 1 2 3 0.1000 0.2000 0.3000-1 Data på fil C» data=fscanf(h,'%f',[3 inf]) % formatera input data = 1 0.1000-1 2 0.2000-2 3 0.3000-3 C» C» datb=data' datb = 1 2 3 0.1000 0.2000 0.3000-1 -2-3 C» C» line=fgetl(h) % fgetl läser en rad i taget line = 1 2 3 % men line är en textsträng C» line=fgetl(h) line = 0.1 0.2 0.3 C» line=fgetl(h) line = -1-2 -3 C» num=str2num(line) % str2num konverterar till tal num = 1 2 3 C» line=fgetl(h) % strread kan också användas line = 0.1 0.2 0.3 C» data=strread(line) data = 0.1000 0.2000 0.3000 2010-09-23-2 Datorlära, fysikexperiment - del 4 20-3 % Olämplig struktur i data-vektorn