TAIU07 Matematiska beräkningar med Matlab Datorlektion 2. Villkor och Repetition 1 Logiska uttryck Uppgift 1.1 Låt a=3 och b=6 Vad blir resultatet av testerna a<=b, a==b och a>b? Uppgift 1.2 Låt a, b, och c vara reella tal. Ange ett uttryck som ger resultatet sant då alla talen är lika, och falskt annars. Pröva om ditt uttryck är korrekt genom att testa några olika värden på parametrarna a, b, och c. Uppgift 1.3 Låt a, b, och c vara reella tal. Ange ett uttryck som ger resultatet sant då alla talen är olika, och falskt annars. Pröva om ditt uttryck är korrekt genom att testa några olika värden på parametrarna a, b, och c. Uppgift 1.4 Låt x vara ett reelt tal. Skriv ett logiskt uttryck som ger värdet sant om 0<x 10. Uppgift 1.5 Skriv in följande data: 2 1 3 A= 2 1 1, och, B= 1 0 3 Vad blir resultatet av testerna A==B, A =B, och A<=B? 1 1 0 2 1 0 2 1 3. Vad blir resultatet av uttrycket A>B A<B? Kan samma uttryck skrivas på ett enklare sätt? Som vi sett blir resultatet av jämförr mellan matriser och vektorer en ny vektor eller matris med nollor eller ettor beroe på om jämförn är sann eller falsk för respektive element. Exempelvis så visar kommandot >> [ 1, 0, -1] > [ 0, 2, 3] ans = 1 0 0 att jämförn är sann ast för det första elementet. Detta kan utnyttjas för beräkningar. Uppgift 1.6 Låt x vara en vektor med n = 10 element. Använd en jämför operation och kommandot sum för att hitta antalet positiva element i vektorn x.
Uppgift 1.7 Antag att y är en vektor som innehåller n stycken tal. Vi har tidigare använt min för att hitta det minsta elementet i vektorn. Hitta ett sätt att räkna hur många gånger det minsta talet förekommer i vektorn y. I exemplet >> y = [ 1, 3, -1, 4, -1, 5, 3, -1] så skall vi få svaret 3 då talet 1 förekommer på tre platser. Uppgift 1.8 Antag att vi har en vektor x och vill kontrollera om den är sorterad i stigande ordning. Hur skall sum användas tillsammans med en jämföroperation för att testa detta? Tips Med kolon-notation så ger x(2:) en vektor som innehåller allt utom första elementet i vektorn x. 2 Villkorssatser Uppgift 2.1 Antag att vi har beräknat en konstant C. Vi vet att konstanten måste vara positiv. För att vara säker på att beräkningen blev korrekt vill vi testa detta genom att skriva en villkorssats som testar om C verkligen är positiv. Om så inte är fallet skall en varning skrivas ut. Tips Använd disp( Varning: C ej positiv ). Utskrift av text återkommer senare i kursen. Uppgift 2.2 Funktionen f(x) ges av uttrycket x 2, x<0 f(x)= sin(x), 0 x< π 2 1, x π 2 Skriv en villkorssats som beräknar y = f(x) för ett givet x värde. Det är lämpligt att skriva din villkorssats i en M fil. I MATLAB finns en fördefinierad funktion pi som returnerar värdet på π. Testa att ditt program fungerar! Uppgift 2.3 Antag att a = 5 och att variabeln flagga har värdet falskt (dvs flagga=0 i MATLAB). Vad händer i följande fall? if flagga if flagga if a<10 if a<10 a=a+1 a=a+1 a=a-1 a=a-1 Pröva om du är osäker! Uppgift 2.4 Vad skulle ha hänt i uppgiften ovan om a=5, men variabeln flagga istället hade haft värdet sant? 2
3 Repetionssatsen for Uppgift 3.1 Skriv ett program som beräknar summan S = 100 k=1 k. Uppgift 3.2 Vad blir x(5) då följande program exekveras? x=zeros(5,1); for k=2:1:5 x(k)=x(k-1)+k Pröva om du är osäker! Uppgift 3.3 (Svår) Exponentialfunktionen kan approximeras bra genom att använda serien e x = 1+x+ x2 2 + x3 6 +... n där vi alltså tar med de första n+1 termerna i summan. Välj n = 10 och skriv en for loop som beräknar summan ovan. Testa ditt program genom att beräkna e 2 genom dels standard funktionen exp och dels ditt program. Tips Då du beräknar termerna i summan behöver du k fakultet. Utnyttja att k! = (k 1)!k och inför en extra variabel där k! lagras och som uppdateras i varje steg i for loopen. Uppgift 3.4 Skriv ett program som bildar den så kallade Hilbert matrisen, dvs en n n matris H, vars element ges av H(i,j) = 1/(i + j 1). Du kan tilldela parametern n ett värde överst i ditt program. Tips Det finns en inbyggd standard funktion, hilb, i MATLAB som du kan använda för att kontrollera att ditt program fungerar. Uppgift 3.5 Antag att vi har en vektor x som innehåller n element. Använd en for-loop för att hitta det minsta elementet i vektorn. Tips Skapa en test vektor x=rand(5,1) och testa så att ditt program fungerar. Uppgift 3.6 Låt c = (1, 2, 1.5) T. Vi vill beräkna polynomet p(x), som ges av n 1 p(x) = c k x k, k=0 för ett antal x-värden sparade i en vektor x. Använd en for-loop för att beräkna polynomets värden. Använd length(c) för att bestämma hur många koefficienter som finns (och därmet polynomets gradtal). Då du är färdigt skall du använda ditt program för att rita en graf över polynomet p(x) = 1 2x+ 1.5x 2 på intervallet 0 x 2. k=0 x k k!. 3
Uppgift 3.7 Låt a och b vara två vektorer med n element, och antag att alla element i vektorn b är positiva. Skriv ett program som beräknar värdet, M= max a i. 1 i n b i Uppgift 3.8 Låt A vara en n m matris som innehåller både positiva och negativa element. Beräkna summan av de positiva elementen i matrisen. Tips Som exempel kan du bilda en testmatris med A=rand(5,4)-0.5. Använd [n,m]=size(a); i ditt program för att ta reda på hur stor matrisen är.. Uppgift 3.9 (Svår) En matris sägs vara diagonaldominant om n j=1,j i a ij a ii, i=1,2,...,n, med sträng olikhet för åtminstone en rad i. Skriv ett program som kontrollerar om en matris A är diagonal dominant. Ifåfall skall en utskrift göras till skärmen. Uppgift 3.10 (Svår) Multiplikation mellan två matriser A och B definieras som att C = AB, där c ij = n a ik b kj. k=1 Skriv ett program som beräknar matrisen C. Produkten AB är ast definierad om A och B har dimensioner som passar ihop. Ditt program skall innehålla en villkorssats som testar detta. 4 Simulering och Sannolikhetslära I Matlab finns flera funktioner för att skapa slumptal. Ett exempel är rand som skapar matriser där elementen är slumptal. Skriver vi >> P = rand(10,3); så skapas en 10 3-matris där elementen är likformigt fördelade på intervallet [0, 1]. Det finns även en funktion randi som skapar slumpmässiga heltalsvärden. Uppgift 4.1 Antag att vi kastar 5st tärningar. Hur många sexor kan vi förvänta oss att få? Svara på frågan genom att skapa en 5 1000-matris P där varje element är ett slumpmässigt heltal mellan 1 och 6. Varje kolumn P(:,i) representerar då ett kast med fem tärningar. Använd sum och en jämför för att skapa en 1 1000 vektor där varje element är summan av antalet sexor för respektive omgång med fem tärningskast. Använd sedan mean för att beräkna det genomsnittliga antalet sexor man får vid kast med fem tärningar. 4
Uppgift 4.2 (Svår)Antag att en hink innehåller totalt 8 bollar, varav fem är svarta och tre är vita. Vi drar två bollar från hinken och undersöker hur stor sannolikhet det är att vi drar två vita bollar. För att simulera en omgång då vi drar två bollar skall vi göra följande: Då första bollen dras är det 5/8 chans att få en svart och 3/8 chans att få en vit. Använd rand eller randi för att simulera första bollen vi drar. Då vi skall plocka den andra bollen från hinken så beror sannolikheterna på vilken boll vi redan plockat upp. Använd en if-sats för skilja på de två fallen (dvs första bollen blev antingen vit eller svart) och simulera vad som händer när den andra bollen plockas upp. Tips Använd utskrifter av typ disp( Två vita bollar ) för att visa vad som händer. Enklast är att använda nästlade if-satser. 5
TAIU07 Matematiska beräkningar med Matlab Facit till Datorlektion 2. 1 Logiska uttryck Uppgift 1.1 Uttrycket a<=b ger resultatet 1, dvs sant, a==b ger 0, dvs falskt. Uttrycket a>b ger falskt. Uppgift 1.2 Exempelvis ( a==b ) & ( a==c ) & ( b==c ). Uppgift 1.3 Exempelvis ( a =b ) & ( a =c ) & ( b =c ). Uppgift 1.4 Uttrycket blir ( 0<x )&( x<=10 ). Uppgift 1.5 De logiska uttrycken ger matriser som svar. De är: 0 0 0 0 1 0, 0 0 1 1 1 1 1 0 1, och 1 1 0 0 1 0 1 1 0 1 0 1 Uttrycket kan skrivas som A =B. Resultatet blir 1 1 1 1 0 1. 1 1 0 Uppgift 1.6 Använd >> AntalPositiva = sum( x > 0 ); Uppgift 1.7 Raderna >> y=[1 3-1 4-1 5 3-1] >> n = sum( y == min(y) ) ger svaret n = 3. Uppgift 1.8 Skriv >> sum( x(2:)-x(1:-1) < 0 ) då vektorn x(2:)-x(1:-1) är positiv om x k x k 1 > 0 för alla k, dvs om vektorn är sorterad i stigande ordning. Testa med >> x = 0:10 så fås svaret 0 vilket beryder att inget element ligger i fel ordning.. 6
2 Villkorssatser Uppgift 2.1 Använd if C<0 disp( Varning: C ej positiv ) Uppgift 2.2 Exempelvis kan filen funktion.m innehålla raderna: if ( x < 0 ) y=x^2; if ( x < pi/2 ) y=sin(x); y=1; disp(y) Uppgift 2.3 I första fallet fås a=5. I andra fallet fås a=4. Uppgift 2.4 Nu fås istället a=6 i bägge fallen. 3 Repetionssatsen for Uppgift 3.1 Följande MATLAB kommandon beräknar summan S=0; for k=1:100 S=S+k; ; disp(s) % <- används för att lagra en partialsumma Uppgift 3.2 Programmet skapar en kolumnvektor x = (0 2 5 9 14) T. x(5) blir alltså 14. Uppgift 3.3 Vi sparar en variabel kfak för att spara k!. Programmet blir x=0.7; % Eller det x-värde man är intresserad av kfak=1;s=1;n=10; for k=1:n kfak=kfak*k; % Blir 1*1 första gången! S=S+x^k/kfak; disp(s) Uppgift 3.4 För att skapa Hilbert matrisen H kan följande program användas. 7
N=5; H=zeros(N,N); for i=1:n for j=1:n H(i,j)=1/(i+j-1); ; ; Uppgift 3.5 Vi sparar en variabel x_min som innehåller det hittils minsta elementet vi hittat. Programmet blir då x_min=x(1); n = length(x); for k=2:n if x(k)<x_min x_min=x(k); % Hittat mindre! Uppdatera x_min. disp(x_min) Uppgift 3.6 Vi skapar vektorn c, en vektor med x-värden och beräknar polynomet med c=[1-2 1.5]; x=0:0.01:2; p=c(1)*x.^0; for k=2:length(c) p=p+c(k)*x.^k; plot(x,p) % ger första termen. elementvis op. ty x är vektor. Uppgift 3.7 Vi skriver M = abs(a(1)/b(1)); for k=2:length(a) if abs(a(k)/b(k))>m M = abs(a(k)/b(k)); disp(m) Uppgift 3.8 Vi använder size för att hitta matrisens storlek. Summan beräknas med [n,m]=size(a);s=0; for i=1:n for j=1:m if A(i,j)>0 S=S+A(i,j); 8
disp(s) Uppgift 3.9 Vi behöver två logiska variabler: Den första AllaMindre skall bli falsk om någon rad bryter mot olikheten. Den andra EnStrikt skall bli sann så snart vi hittar en strikt olikhet på någon rad. Programmet blir [n,m]=size(a); AllaMindre = 1; % Alla rader vi undersökt hittils uppfyller olikheten. EnStrikt = 0; % Vi har ännu inte hittat någon strikt olikhet for i=1:n % Undersök rad i. S=0; for j=1:m S=S+abs(A(i,j)); % S blir radsumman ; if S<2*abs(A(i,i)) % Vi har A(i,i) i S också. EnStrikt = 1; if S > 2*abs(A(i,i)) AllaMindre = 0; % Hittat en ogiltig olikhet! break; % Vi behöver inte fortsätta. Vet nu att falskt! % Nu lägger vi ihop resultatet i en ny logisk variabel. DiagDom = AllaMindre & EnStrikt ; if DiagDom, disp( Matrisen är diagonal dominant ), Uppgift 3.10 Givet två matriser A och B skriver vi [n1,m1]=size(a);[n2,m2]=size(b); if m1 ~= n2 % I detta fallet fungerar det inte disp( dimensioner passar ej ); C=zeros(n1,m2); % Skapa C med rätt storlek for i=1:n1 for j=1:m2 % beräkna C(i,j) med formeln. for k=1:m1 C(i,j)=C(i,j)+A(i,k)*B(k,j); 9
4 Simulering och Sannolikhetslära Uppgift 4.1 Följande steg löser uppgiften. N=1000; P=randi( [1,6],5,N); % 5xN matris med heltal 1,..,6 V=sum( P == 6, 1 ); % summera över första dimensionen. Dvs raderna. mean(v) Genomsnittet blir ungefär 0.83 sexor. Uppgift 4.2 Programmet I = randi([1 8]); if I <= 5 % Första bollen blev svart. 7 bollar kvar. 4 svarta. I = randi([1 7]); if I <= 4 disp( Två svarta bollar. ) disp( En vit och en svart boll. ); % Första bollen blev vit. 7 bollar kvar. 5 svarta I = randi([1 7]); if I <= 5 disp( En vit och en svart boll. ) disp( Två vita bollar ); 10