Tentamen TAIU07 Matematiska beräkningar med MATLAB för

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