F8: Resterna Substitutionschiffer (Lab 3) Permutationer Rekursion Formelbehandling Simulering Iteration, frekvens-dubbling och kaos Radplanering p 1 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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 4] txt2 = alfab(indx(txt)) % hur översätta tillbaka? p 2 (21) Staffan Romberger, CSC, KTH, 2011-09-22
iindx(indx)=1:4 %invers-permutationen: %iindx(indx)=indx(iindx)=1:4 txt3 = alfab(iindx(txt2)) p 3 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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 4 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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 end p 5 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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; end Denna är mycket snabbare än rand_perm2. Det beror på den dynamiska minnesallokeringen som krävs vid borttagningen av element (rad (*)). Tidtagning och användning av profil-verktyget bekräftar denna hypotes. Det senare visar att 70% av tiden i rand_perm2 ägnas åt borttagningen! p 6 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Permutationer och rekursion Hur generera en lista över alla permutationer av talen 1..n? Det är ganska enkelt att göra en rekursiv algoritm. * 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. * Om bara ett objekt finns har listan bara ett element. 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 1,2,3,4: 4 3 2 1; 3 4 2 1; 3 2 4 1; 3 2 1 4; p 7 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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 end for k = 1:n-1 end A = [A;... [B(:,1:k),col,B(:,k+1:end)]]; % n-1 next blocks p 8 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Rekursionen kräver att hela tillståndet för funktionen sparas för n, n-1,, tills man kommer till n = 1. Då först sänds något tillbaka och listorna växer. Men här är tillståndet litet: data växer först i else-delen ovan. p 9 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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. 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 10 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Formelbehandling forts. >>D = diff(log(a)) % obs... komponentvis ln 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 11 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Formelbehandling forts. I laboration 5 finns en differensapproximation till derivatan av en funktion i dess vänstra ändpunkt. 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 ʹ x ) = ( u u ) / h ( 0 1 0 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 B (x 0 +kh,u k ), k = 0,1,2: p 12 (21) Staffan Romberger, CSC, KTH, 2011-09-22
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; >> e.b ans = 1/2*(-3*u0-u2+4*u1)/h Det stämmer med formeln i labb 5. Man kan göra motsvarande för funktionens högra ände. p 13 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Formelbehandling forts. 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 14 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Simulering Pachinko Gör ett program som simulerar en Pachinko-maskin. Se t ex Wikipedia för detaljer om pachinko, som är mycket populärt i Japan. Figur: Vänster, förkrigs mekanisk pachinko-maskin, höger vår maskin. p 15 (21) Staffan Romberger, CSC, KTH, 2011-09-22
En kula faller ner genom en labyrint av spikar i ett regelbundet mönster så att vid varje spik väljer kulan med lika sannolikhet vänster eller höger. Längst ner samlas kulorna upp. Här har tre kulor ramlat igenom och en är på väg ner. Tips: Spikmattan är ett statiskt grafikobjekt som kan genereras med en slinga. Varje kula är ett eget grafikobjekt som genereras när den startar längst upp h = plot(.);. Sedan flyttas den genom set(h, xdata,x, ydata,y). En tabell bins samlar ihop ett histogram över kulornas slutlägen. Matlab kan spela ljud, men det räcker att pipa (beep) när en kula träffar en spik och göra en kort paus ( pause(0.1)) innan den flyttas till någon av de två möjliga spikarna i nästa rad. När kulan ramlat ner görs lite längre paus innan nästa kula startas. Utvidgning: Låt spelaren vinna om kulan träffar vissa speciella spikar; den försvinner då och maskinen betalar ut en vinst och spelar en låt. help sound! För den statistik-intresserade: Vad blir fördelningen för antalet kulor i lådorna? p 16 (21) Staffan Romberger, CSC, KTH, 2011-09-22
%Pachinko clear all N = 10; nballs = 50; ybot = -5; bins = zeros(1,2*n+1); % bins % number of rows of nails % number of balls to play % plot the grid of nails figure(1) clf axis([0 2*N+1 ybot N+1]) hold on for k = 0:N-1 plot(-k+n:2:k+n,n-k-0.3,'.k','markersize',5) % - every second in x! end % drop the balls for m = 1:nballs x = N;y = N; % starting position h =... plot(x,y,'ok','linewidth',2,'markersize',10); % new graphics object beep, pause(0.1) for y = N-1:-1:0 x = x+2*(rand > 0.5)-1; set(h,'xdata',x,'ydata',y) % move ball to here beep, pause(0.1) p 17 (21) Staffan Romberger, CSC, KTH, 2011-09-22
end end bins(x)=bins(x)+1; % collect ball in bin set(h,'xdata',x,'ydata',ybot+bins(x)*0.5) % and plot it pause(0.5) p 18 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Iteration, frekvensdubbling och... kaos Logistiska ekvationen (Verhulst/Perl) Eulers metod: yn+ 1 = yn + Δt ( yn yn ) y 2 n + n 1 = p ( yn yn ) :? 2 yʹ = y y : Om p liten, y n -> 1. Kontraktionssatsen? Men p stor? Prova: clear all figure(1),clf,hold on n = 400; for p = linspace(1,4,100) x = linspace(0,1,n); for k = 1:2*n x = K*x.*(1-x); end plot(p*ones(1,n),x,'.') end 2 p 19 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Det finns mer i Matlab Ni kan fördjupa det ni redan har sett. Ni kan lära känna Matlabs verktygslådor. Ni kan lära er objektorienterad programmering med Matlab. Kursen fortsätter med Programmeringslaborationer Numeriska metoder inkl. laborationer Projektet Tentan p 20 (21) Staffan Romberger, CSC, KTH, 2011-09-22
Hur går du vidare? Använd Matlab i nummedelen och i andra kurser. Läs kursen Tillämpad datalogi (tilda). p 21 (21) Staffan Romberger, CSC, KTH, 2011-09-22