TEKNISKA HÖGSKOLAN I LINKÖPING Matematiska institutionen Beräkningsmatematik/Fredrik Berntsson Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI Tid: 14-18, 14:e Mars, 2017 Provkod: TEN1 Hjälpmedel: Inga. Examinator: Fredrik Berntsson Maximalt antal poäng: 18 poäng. För godkänt krävs 8 poäng. Jourhavandelärare Fredrik Berntsson (telefon 28 28 60) Besök av jourhavande lärare sker ungefär 15.15 och 16.45. Lösningsförslag finns på kurshemsidan efter tentans slut. Visning av tentamen sker på Examinators kontor Måndag den 27:e Mars, klockan 12.15-13.00 (Hus B, Ing. 23-25, Plan-3, A-korr). Lycka till! Redovisning Lös först uppgifterna i Matlab. När du har en färdig lösning skriv ner de kommandon du använde på papper. Redovisa även eventuella resultat då du körde dina Matlabkommadon. Grafer behöver inte redovisas. (2p) 1: Följande funktion är tänkt att kontrollera om en vektor x är sorterad i stigande ordning function s = sorterade(x) for i = 1:length(x)-1 if x(i) > x(i+1) s = 0; else s = 1; end end Förklara tydligt vad som går fel och gör lämpliga ändringar så att funktionen ger förväntat resultat. (2p) 2: Vi vill beräkna en integral Z 1 I= f (x)dx, f (x) = cos(x)e−2x − 2x. 0 Gör därför följande: a) Skapa ett funktionshandtag som motsvarar funktionen ovan. Din funktion skall klara att inargumentet x är en vektor. Skapa även en vektor x med 100 jämt utspridda tal på intervallet [0, 1] och utnyttja den för att plotta f (x) på aktuellt intervall. b) Använd kommandot integral för att beräkna integralen ovan. (3p) 3: Vi vill slå tärningar tills summan av tärningskasten överstiger 20. Skriv ett program som simulerar detta genom att beräkna slumptal mellan 1 och 6 med randi ända tills summan överstiger 20. Programmet skall även göra utskrifter så att det tydligt syns vad som händer. Den totala summan och det antal tärningskast som krävdes skall sparas och redovisas på slutet. Utskrift skall ske enligt följande mönster: Tärningskast: 3 Tärningskast: 6 Tärningskast: 3 Tärningskast: 1 Tärningskast: 5 Tärningskast: 3 Summan blev 21 efter 6 kast. Tips Utskriften kan göras med hjälp av att kombinera num2str med textbitar. Sista raden kan exempelvis skapas med >>disp([’Summan blev ’,num2str(summan),’ efter ’,num2str(antalet),’ kast’]) 2 (3p) 4: Vi vill skriva en funktion som kan derivera polynom. Vi vill dessutom att vår funktion skall kunna användas tillsammans med den inbyggda funktionen polyval. Vi påminner oss därför om att ett polynom pn (x) = cn xn + cn−1 xn−1 + . . . + c0 , i Matlab skall representeras av vektorn c = (cn , cn−1, . . . , c0 ). Vi sparar alltså den högsta ordningens koefficient först. Skriver vi >> c = [2 -3 0 1 0]; >> polyval( c , 2.1 ) ans = 13.2132 så beräknas värdet av polynomet p(x) = 2x4 − 3x3 + x för x = 2.1. Gör följande a) Skriv en funktion PolynomDerivata med en vektor c, som innehåller polynomets koefficienter, som inparameter, och som beräknar en vektor d med koefficienterna för derivatan p′ (x) = ncn xn−1 + (n − 1)cn−1 xn−2 + . . . + c1 . b) Utnyttja funktionen från a) för att beräkna derivatan av polynomet p(x) = 2x4 − 3x3 + x. Använd sedan polyval för att plotta derivatan på intervallet −0.3 ≤ x ≤ 1.2. Tips I Matlab finns en inbyggd funktion polyder som utför precis denna beräkning. Du kan använda den för att kontrollera att du gjort rätt men får inte utnyttja den för att lösa uppgiften. (4p) 5: Vi vill pröva två olika sätt att beräkna summan S= 100 X 1 + k2 k=1 1 + k3 . och verifiera att resultatet blir detsamma. Gör följande: a) Utnyttja elementvisa operationer och kommandot sum för att beräkna summan. Du får inte använda for eller while loopar. b) Utnyttja en for-loop för att beräkna summan. Här får ditt program istället inte innehålla några vektorer. 3 (4p) 6: Vi vill skriva ett simuleringssystem som kan användas för att undersöka tärningsspelet Yatzy. Systemet skall kunna simulera ett stort antal spelomgångar och bestämma sannolikheten för att olika kombinationer dyker upp. Som en del i projektet att utveckla systemet skall följande uppgifter lösas. a) Skriv en Matlabfunktion som simulerar en spelomgång. Funktionen skall returnera en vektor innehållande resultatet från fem tärningskast. Funktionen skall kunna användas på följande sätt >> x = YatzyOmgang x = 4 6 1 3 1 där alltså vektorn x tilldelas 5st slumpmässiga heltal mellan 1 och 6. Använd antigen rand eller randi för att skapa slumptalen. b) Att få Kåk innebär att två av tärningarna ger samma resultat och att dessutom de övriga tre tärningarna ger samma resultat. Exempelvis har vi Kåk om >> x = YatzyOmgang x = 4 3 3 4 3 Ger alla tärningar samma resultat är det istället Yatzy och det räknas inte som kåk. Skriv en funktion KontrolleraYatzy, med en vektor som representerar en spelomgång som inparameter, som kontrollerar om vi har fått Kåk. Funktionen skall ha en utparameter som ges värdet sant om vi har Kåk och falskt annars 4 Lösningsförslag till tentan 20:e Mars 2015. 1: Problemet är att om sista två elementen ligger i rätt ordning så blir s = 1 oavsett vad som hänt tidigare. Enklast är att ändra alltså till. function s = sorterade(x) s=1; for i = 1:length(x)-1 if x(i) > x(i+1) s = 0;break; end end Då avbryts loopen så snart vi hittat ett par av tal som ligger i fel ordning. 2: Vi skapar först funktionen och plottar med >> f=@(x)cos(x).*exp(-2*x)-2*x; >> n=100;x=linspace(0,1,n); >> plot(x,f(x)) Integralen beräknas sedan med >> I=integral( f,0,1 ) I = -0.6065 3: Programmet blir summan=0;antalet=0; while summan<20 kast=randi([1 6],1); disp([’Tärningskast: ’,num2str(kast)]); antalet=antalet+1; summan=summan+kast; end disp([’Summan blev ’,num2str(summan),’ efter ’,num2str(antalet),’ kast’]) 4: Funktionen blir function [d]=PolynomDerivata(c) n=length(c);d=zeros(1,n-1); for i=1:n-1 d(i)=c(i)*(n-i); end end 5 vilket ger >> d = PolynomDerivata( c ) d = 8 -9 0 1 >> x=-0.3:0.01:1.2; >> plot( x , polyval( d , x)) 5: Vi skapar först en vektor med heltalen 1, 2, . . . , n och beräknar sedan summan med >> n = 100; k = 1:n; >> S = sum( (1+k.^2)./(1+k.^3) ) S = 5.2990 För att göra samma beräkning med en for-loop skriver vi n = 100; S=0; for k=1:n S=S+(1+k^2)/(1+k^3); end disp(S) Detta ger även det resultatet S = 5.2990. 6: Använder vi funktionen randi blir Yatzy funktionen function [ Kast ]=YatzyOmgang() Kast = randi( [1 6],5,1); end För att kontrollera om vi fått kåk räknas vi antal förekomster av utfallen 1, 2, . . . , 6 och kontrollerar ifall ett utfall förekommer 2ggr och ett annat 3ggr. function [Test]=KontrolleraYatzy( Kast ) % Börja med att räkna efter hur många vi fick av varje typ. AntalAvVarje=zeros(6,1); for i=1:5 AntalAvVarje(Kast(i))=AntalAvVarje(Kast(i))+1; end % Kåk betyder att ett resultat komm upp två gånger och % ett annat tre gånger. Det finns alltså både en tvåa % och en trea i vektorn AntalAvVarje FinnsTvaa=0;FinnsTrea=0; for i=1:6 if AntalAvVarje(i)==2,FinnsTvaa=1;,end 6 if AntalAvVarje(i)==3,FinnsTrea=1;,end end; Test=0; if FinnsTvaa & FinnsTrea Test=1; end end 7