Matlab-repetition. p 1 (25) Staffan Romberger, CSC, KTH,

Relevanta dokument
F8: Resterna. Substitutionschiffer. Permutationer. ASCII och char. Substitutionschiffer (Lab 3) Permutationer Rekursion

F8: Resterna. Substitutionschiffer (Lab 3) Permutationer Rekursion Formelbehandling Simulering Iteration, frekvens-dubbling och kaos Radplanering

Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen. Tabell på skärmen, test

Komplexa tal. F4 (5): Datastrukturer (kap. 6 7)

Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen

MMA132: Laboration 2 Matriser i MATLAB

1, 2, 3, 4, 5, 6,...

Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen. save

F4: Datastrukturer (kap. 6 7) Komplexa tal Ö3: 5.2, 5.7, 5.14, 5.20

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

Tentamen del 2 SF1511, , kl , Numeriska metoder och grundläggande programmering

TDDC74 Lab 02 Listor, sammansatta strukturer

Matriser och linjära ekvationssystem

Textsträngar från/till skärm eller fil

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

2 februari 2016 Sida 1 / 23

Grundkurs Programmering

Fler uppgifter på andragradsfunktioner

Användarmanual till Maple

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Rekursion och induktion för algoritmkonstruktion

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Laboration: Vektorer och matriser

2. (a) Skissa grafen till funktionen f(x) = e x 2 x. Ange eventuella extremvärden, inflektionspunkter

PROGRAMMERING-Java Omtentamina

Beräkningsverktyg HT07

HI1024 Programmering, grundkurs TEN

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 8 december 2015 Sida 1 / 22

DN1212/numpm Numeriska metoder och grundläggande programmering Laboration 1 Introduktion

TAIU07 Matematiska beräkningar med Matlab

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Föreläsning 5. Rekursion

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Rekursion och induktion för algoritmkonstruktion

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Tentamen: Programutveckling ht 2015

Matlabövning 1 Funktioner och grafer i Matlab

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

TDDC74 Programmering, abstraktion och modellering. Tentamen

TMV166 Linjär algebra för M. Datorlaboration 2: Matrisalgebra och en mekanisk tillämpning

Tentamen i Introduktion till programmering

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

% Föreläsning 4 22/2. clear hold off. % Vi repeterar en liten del av förra föreläsningen:

Programmeringsteknik med C och Matlab

Användarhandledning Version 1.2

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Datastrukturer och Algoritmer D0041D

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Sökning och sortering

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

SF1905 Sannolikhetsteori och statistik: Lab 2 ht 2011

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

MMA132: Laboration 1 Introduktion till MATLAB

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

SF1900 Sannolikhetsteori och statistik, HT 2017 Laboration 1 för CINEK2

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Datorövning 1 Fördelningar

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

PROGRAMMERING-JAVA TENTAMINA

Block 5: Ickelineära. ekvationer? Läroboken. Löpsedel: Icke-lineära. ekvationer. Vad visade laborationen? Vad visade laborationen?

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 26 november 2015 Sida 1 / 28

Dagens föreläsning Programmering i Lisp Fö 5

Variabler. TANA81: Beräkningar med Matlab. Matriser. I Matlab skapas en variabel genom att man anger dess namn och ger den ett värde:

Tentamen i Beräkningsvetenskap I/KF, 5.0 hp,

Föreläsning 3, Matematisk statistik Π + E

TDDC74 Programmering, abstraktion och modellering DUGGA 1

Logik och Jämförelser. Styrsatser: Villkorssatsen if och repetitonssatsen for. Scriptfiler. Kommentarer. Tillämpningar: Ett enkelt filter.

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

MMA132: Laboration 1 & 2 Introduktion till MATLAB

Lösningar och kommentarer till uppgifter i 3.1

Föreläsning 6: Introduktion av listor

Datalogi, grundkurs 1 Övningsuppgifter i Scheme. Serafim Dahl, Carina Edlund, m.fl.

TANA17 Matematiska beräkningar med Matlab

Exempelsamling Assemblerprogrammering

Länkade strukturer. (del 2)

Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson Plot och rekursion

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Lösningsforslag till tentamen i SF1624 den 22/ e x e y e z = 5e x 10e z = 5(1, 0, 2). 1 1 a a + 2 2a 4

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Grundläggande datalogi - Övning 1

PROGRAMMERING-Java TENTAMINA

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

TANA17 Matematiska beräkningar med Matlab

Tentamen i Grundläggande Programvaruutveckling, TDA548

Ordinära differentialekvationer,

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Laboration 2 M0039M, VT2016

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Datastrukturer och algoritmer

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Föreläsning 11 Datastrukturer (DAT037)

Transkript:

Matlab-repetition Substitutionschiffer Permutationer Rekursion Function functions Fil-skrivning och läsning med formatstyrning Formelbehandling Ank-race p 1 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Substitutionschiffer Caesar-rullning Ex. Alfabete: 1234; text: 2 3 1 1 2; Substitution: Ett stegs cykliskt skift 1->2 2->3 3->4 4->1 % subst-chiffer alfab = [1 2 3 4]; indx = [2 3 4 1]; % en permutation av 1..n txt = [2 3 1 1 2] txt2 = alfab(indx(txt)) % hur översätta tillbaka? p 2 (25) Staffan Romberger, CSC, KTH, 2012-09-19

ASCII och char Alla tecken : % alla ASCII tecken indx = 1:256; char(indx) pause txt = ' hej hej ö #Å' txt2 = char(indx(double(txt))) pause indx = rand_perm(256); % slump-permutation txt3 = char(indx(double(txt))) pause iindx(indx)=1:256; % invers-permutationen txt4 = char(iindx(double(txt3))) p 3 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Permutationer och rekursion Exempel 1: Beräkning av fakulteter, n! = n (n-1)!; 1! = 1 Rekursion: function nfac = fact_rec(n) % compute n factorial = 1 2 3... n % by recursion %---------------------------------- if n == 1 nfac = 1; else nfac = n*fact_rec(n-1); p 4 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Det är enkelt att konstruera en icke-rekursiv algoritm, nfac = 1; for k = 2:n nfac = nfac*k; som implementeras av matlabs prod-funktion, nfac = prod(1:n); p 5 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Exempel 2: Beräkna det n:te Fibonacci-talet, f n = fn 1 + fn 2; f1 = 1; f2 = 2; 1. Hur ser en rekursiv algoritm ut? 2. Iterativ: function fn = fibo(n) % assume n is a positive integer if n == 1, fn = 1; elseif n == 2, fn = 2; else f1 = 1; f2 = 2; for k = 3:n Formel: fn = f1 + f2; f1 = f2; % no need to save all fk, f2 = fn; % just the two last f n 3 + = 5 + 5 5 1 + 5 2 n 2 + 5 + 1 5 2 5 n 3 + 5 + 5 5 1 + 5 2 n n >> 1 p 6 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Permutationer Hur generera en slumpmässig permutation av n objekt talen 1,2,,n? 1. Dragning utan återläggning : Tag objekt slumpmässigt tills inga är kvar: rand_perm2 2. Kortblandning : Byt obj 1 mot slumpmässigt annat, sedan 2 mot annat, etc. Upprepa n gånger: rand_perm function indx = rand_perm2(n) % by selection w/o return tmp = 1:n; L = n; % number of items indx = tmp; for k = 1:n k1 = floor(l*rand)+1; % random selection indx(k)= tmp(k1); % save the item tmp(k1)= []; % remove it from list (*) L = L-1; % length decreases by 1 p 7 (25) Staffan Romberger, CSC, KTH, 2012-09-19

function indx = rand_perm(n) % indx is a random permutation of 1...n % algorithm: do n times % swap two elements indx = 1:n; for k = 1:n k1 = floor(n*rand)+1; % swap indx(k1), indx(k) tmp = indx(k1); indx(k1)= indx(k); indx(k)= tmp; Denna är mycket snabbare än rand_perm2. Det beror på borttagningen av element (rad (*)) som kräver omflyttning. Tidtagning och användning av profil-verktyget bekräftar denna hypotes: 70% av tiden i rand_perm2 ägnas åt borttagningen! p 8 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Exempel 3 Generera lista med alla permutationer av elementen i en vektor v(1:n) Det är ganska enkelt att göra en rekursiv algoritm. * Om bara ett objekt finns har listan bara ett element. * Givet en lista över permutationer av n-1 objekt, så får man listan för n genom att ersätta var och en av dem med de n olika man får genom att sätta det nya objektet i position 1, 2,, n. 1: 1 1,2: 2 1; 1 2 1,2,3: 3 2 1; 2 3 1; 2 1 3; 3 1 2; 1 3 2; 1 2 3 p 9 (25) Staffan Romberger, CSC, KTH, 2012-09-19

function A = recperm(v) % generate all permutations of elements in % array v by recursion %--------------------------------------------------- n = length(v); if n == 1 % just return V A = v; else B = recperm(v(1:n-1)); % permute all % but the last, col = v(n)*ones(size(b(:,1))); % make a column of % correct size A = [col,b]; % first block of % rows of A for k = 1:n-1 A = [A;... [B(:,1:k),col,B(:,k+1:)]]; % n-1 next blocks p 10 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Rekursionen kräver att hela tillståndet för funktionen sparas för n, n-1,, tills man kommer till n = 1. Men här är tillståndet litet: data växer först i else-delen ovan. Då först sänds något tillbaka och listorna växer. Övning: Hur mycket lagras med recperm(n)? Visa, att S n n = k k! = 1+ 2.2 + 3.6 + 4.24 +... = ( n + 1)! 1 k= 1 p 11 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Skrivning och läsning med formatstyrning Läs en text-fil med fileread(filnamn) som ger filens innehåll som en sträng. Använd uigetfile: >> fname = uigetfile('*') % * - filter för vilka filnamn % som ska visas, ex. *.m fname = fiboan.m >> txt = fileread(fname) txt = function f = fiboan(n) fi = (sqrt(5)+1)/2; Skrivning som text med filreferens: fprintf(filreferens,formatsträng,uttryck, ) Utelämnad filreferens = standard output = skärm sprintf(formatsträng, uttryck, ) returnerar en sträng p 12 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Funktion som parameter (function functions) I många tillämpningar har man en metod (function method) som man ska kunna använda med många olika funktioner 1 Uttryck som text och eval Fil: method2a.m function method2a(f) for x=3:3:10 eval(f); Fil: use2a.m use2a.m m_line = 'disp([''f2 x='' num2str(x)]);'; method2a(m_line); ============ p 13 (25) Staffan Romberger, CSC, KTH, 2012-09-19

>use2a f2 x=3 f2 x=6 f2 x=9 p 14 (25) Staffan Romberger, CSC, KTH, 2012-09-19

2 Enkel funktionsreferens (function handle) Fil: use3a.m f=@f3a; method3a(f); Fil: f3a.m function f3a(x) disp(['f3a x='num2str(x)];); Fil: method3a.m function method3a(f) for x=3:3:10 f(x); >use3a f3a x=3 f3a x=6 f3a x=9 p 15 (25) Staffan Romberger, CSC, KTH, 2012-09-19

2b Funktionsreferens med parameter Fil: use3b.m for y = [5 10] f = @(x)f3b(x,y); method3b(f); Fil: f3b.m function f3b(x,y) disp(['f3b x=' num2str(x) ' y=' num2str(y)]); Fil: method3b.m function method3b(f) for x=3:3:10 f(x); >use3b; f3b x=3 y=5 f3b x=6 y=5 f3b x=9 y=5 f3b x=3 y=10 f3b x=6 y=10 f3b x=9 y=10 p 16 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Formelbehandling Med Matlabs»Symbolic algebra toolbox» kan man göra formelbehandling. Matlab känner till deriverings- och integrationsregler och kan göra viss formelförenkling. Med syms deklarerar man vilka variabler som ska vara symboliska. S = solve('eqn1','eqn2',...,'eqnn',... 'var1','var2',...'varn') löser {vari},i=1:n ur ekvationssystemet {eqni } som S.vari. subs(f, {v1 v2 vn}, {e1, e2,, en}) ersätter i formeln f variablerna vi med uttrycken ei. simplify(f) förenklar formeln f. Se hjälpen för information om hur man kan styra förenklingen. p 17 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Exempel n = 4; syms x; A = x.^((0:n)'*(0:n)) A = [1, 1, 1, 1, 1] [1, x, x^2, x^3, x^4] [1, x^2, x^4, x^6, x^8] [1, x^3, x^6, x^9, x^12] [1, x^4, x^8, x^12, x^16] p 18 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Formelbehandling forts. >>D = diff(log(a)) D = [0, 0, 0, 0, 0] [0, 1/x, 2/x, 3/x, 4/x] [0, 2/x, 4/x, 6/x, 8/x] [0, 3/x, 6/x, 9/x, 12/x] [0, 4/x, 8/x, 12/x, 16/x] >>syms a b; expand((a^3+b^2)^3) ans = a^9+3*a^6*b^2+3*a^3*b^4+b^6 p 19 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Formelbehandling forts. I en numme-laboration finns en differensapproximation till derivatan av en funktion i dess vänstra ändpunkt. Vi ska beräkna koefficienterna i den. Låt funktionsvärdena på gitter-punkterna vara u i = u(x i ), x i = ih, i = 0,1,,N-1, N där h=l/n. Om vi approximerar funktionen med en rät linje får vi u ( x0) = ( u1 u0) / h med fel prop. h 2 Approximera istället med en parabel (x 0 = 0!) 2 u ( x) = A( x x0 ) + B( x x0) + C, u ( x) = 2A( x x0) + och bestäm A, B, och C så att parabeln går genom (x 0 +kh,u k ), k = 0,1,2: B p 20 (25) Staffan Romberger, CSC, KTH, 2012-09-19

syms A B C u0 u1 u2 h d e e = solve('a*0 +B*0 +C = u0',... 'A*h^2 +B*h +C = u1',... 'A*(2*h)^2+B*(2*h)+C = u2','a','b','c'); d = 2*A*0+B % the derivative at x = 0 e.b === == d = B ans = -(3*u0-4*u1 + u2)/(2*h) Det stämmer med formeln i labb 5. Man kan göra motsvarande för funktionens högra ände. p 21 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Formelbehandling forts. Man kan lösa polynomekvationer. Exempel: Fibonacci-talen. f n+1 f n f n-1 = 0 ger karakteristisk ekvation x 2 x 1 = 0 med rötter x 1, x 2. Då är f n = A x 1 n + B x 1 n där A, B väljs så att det stämmer för n = 0 (f 0 = 1) och n = 1 (f 1 = 1) p 22 (25) Staffan Romberger, CSC, KTH, 2012-09-19

syms x A B fibo xs = solve('x^2 - x - 1 = 0','x') x1 = xs(1); x2 = xs(2); coeff = solve('a*x1^0 + B*x2^0 = 1',... 'A*x1^1 + B*x2^1 = 1','A','B') n = 7; fibo = coeff.a*x1^n+coeff.b*x2^n expand(fibo) simplify(fibo) double(subs(fibo)) p 23 (25) Staffan Romberger, CSC, KTH, 2012-09-19

Ankrace 1000 badankor åker i virvlande ström; ibland framåt, ibland bakåt. Svårt att känna till virvlarna i detalj, så vi gör en modell meds slump-hopp. I varje tidssteg kan en anka hoppa fram ett steg, bakåt ett, eller stanna kvar, med sannolikheter p, q, och 1-p-q. Om p > q kommer de netto att åka nedströms. a) Hur ser flocken ut efter 500 tidssteg? Rita ett histogram som ger hur många ankor det finns i varje steg av forsen b) Hur är tids-fördelningen när de passerar målbron, 100 steg nedströms? Rita ett diagram över hur många ankor som passerat som funktion av tiden ===== Olika angreppssätt: 1. Följ alla ankorna, tidssteg för tidssteg 2. Följ en anka i taget för alla tidssteg Vi visar här 1. p 24 (25) Staffan Romberger, CSC, KTH, 2012-09-19

% Ankrace: m ankor, n steg % I varje steg: +1 med sannolikhet p, -1 med sannolikhet q clear all, close all p = 0.8; q = 0.18; % stor variation n = 1000; % antal steg m = 1000; % antal ankor % Följ alla ankor på en gång, % "histogram" N över ank-lägena X i varje steg X = zeros(m,n+1); X(:,1) = n; % alla startar i 0 N = zeros(2*n+1,n+1); N(n+1,1) = m; % alla startar i 0 for tid = 2:n+1 % kör n steg X(:,tid) = X(:,tid-1); % antag att alla stannar, % rätta till felen: z = rand(m,1); im1 = z<q; ip1 = z>1-p; X(im1,tid) = X(im1,tid-1)-1; % de hoppar bakåt X(ip1,tid) = X(ip1,tid-1)+1; % de hoppar fram % Räkna ankorna i varje position for anka = 1:m var = X(anka,tid); N(var,tid) = N(var,tid)+1; ; subplot(121); bar(n(:,800)); subplot(122); mesh(n/m); shading interp % logical index (0 0 0 1 0 0 1 0 ) p 25 (25) Staffan Romberger, CSC, KTH, 2012-09-19