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, 13:e Mars, 2018 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 Fatemeh Ghasemi (telefon 282657) och Nils Hassan Quttineh (telefon 282185) Besök av jourhavande lärare sker ungefär 15.15 och 16.45. Lösningsförslag finns på kurshemsidan efter tentans slut. 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 skapa tre slumpmässiga heltal och sedan kontrollera om alla är lika: function t = draw() d1=randi([1 6],1); d2=randi([1 6],1); d3=randi([1 6],1); if d1 == d2 == d3 t=1; else t=0; Förklara tydligt vad som går fel och gör lämpliga ändringar så att funktionen ger förväntat resultat. (3p) 2: Vi vill studera funktionen f(x) = cos(2 x)+x 2, på intervallet 0 x 1, och undersöka var dess maximum inträffar. a) Skapa en vektor x som innehåller N = 50 jämt utspridda tal på intervallet [0, 1]. Beräkna även en vektor f med motsvarande funktionsvärden och utnyttja dessa vektorer för att plotta funktionen på aktuellt intervall. b) Använd Matlabkommandot min för att hitta det minsta värdet i vektorn f. Detta approximerar funktionens minsta värde på intervallet. Hitta även det x-värde där funktionen antar sitt minsta värde. c) Markera punkten (x min,f min ) du hittat i b) i den graf du ritat upp i a) med ett rött x. (3p) 3: Skapa ett tredjegradspolynom p(x) med rötter x 1 = 0.3, x 2 = 1.5 och x 3 = 2.9 genom att använda polyfit för att hitta det polynom av grad 3 som interpolerar tabellen x 0 0.3 1.5 2.9 y 1.0 0.0 0.0 0.0 Plotta även polynomet på intervallet 0 x 3 som en blå heldragen linje och rita in punkterna (x i,y i ) i samma graf med röda x så att det tydligt syns att polynomet får rätt rötter. 2
(3p) 4: Talföljden 6 12 7 14 9 18 13... fås genom att omväxlande multiplicera med 2 och subtrahera med 5. En sådan talföljd är växande om den startar med 6 eller ett större tal. Skriv ett Matlab program som, givet ett startvärde, beräknar antalet tal i följden som är mindre än 1000. Gör en utskrift enligt mönstret: 2*10=20 20-5=15 2*15=30 30-5=25 : 2*325=650 650-5=645 2*645=1290 Antalet tal mindre än 1000 är 16 där startvärdet är 10. Du behöver inte tänka på att ditt program skall ge vettiga resultat för de fall då talföljden inte blir växande. Tips Utskriften kan göras med hjälp av att kombinera num2str med textbitar. Sista raden kan exempelvis skapas med >> disp([ Antalet tal mindre än 1000 är,num2str(n)]) (3p) 5: Vi vill lösa en ekvation Gör därför följande: g(x) = 1 x 0 f(t)dt = 0, där f(t) = 2exp( t/2). a) Skapa ett funktionshandtag som motsvarar funktionen f(t) ovan. Funktionshandtaget skall klara att t är en vektor. b) Använd funktionen integral för att beräkna 0.6 0 f(t)dt, Är x 0 = 0.6 en bra uppskattning av roten x till ekvationen ovan? c) Skapa ett funktionshandtag som beräknar funktionen g(x) för ett givet värde x. Använd även kommandot fzero, och start gissningen x 0 = 0.6, för att hitta roten till ekvationen g(x) = 0. 3
(4p) 6: 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 ett i. Skriv en funktion DiagonalDominant med en matris A som inparameter som retunerar sant (dvs 1) om A är diagonaldominant, och falskt (dvs 0) annars. Du skall kunna anropa din funktion som >> A = [ 3 1 0 ; 1 2 1 ; 0 0 1 ] >> DiagonalDominant( A ) ans = 1 där funktionen alltså returnerar 1 då matrisen i detta fallet är diagonaldominant. 4
Lösningsförslag till tentan 13:e Mars 2018. 1: Problemet är att jämförelser måste utföras på två av talen i taget. Vi gör två jämförelser och kombinerar med &. function t = draw() d1=randi([1 6],1); d2=randi([1 6],1); d3=randi([1 6],1); if ( d1 == d2 ) & ( d2 == d3 ) t=1; else t=0; 2: a) Vi skapar vektorn, beräknar funktionsvärden, och plottar med kommandona >> N=50; x=linspace(0,1,n); >> f=cos(2*sqrt(x))+x.^2; >> plot(x,f) b+c) Vi hittar minimum med kommandot 3: Programmet blir >> [m,k]=min(f);disp(m),disp(x(k)) >> hold on,plot( x(k),f(k), rx );,hold off >> x=[0 0.3 1.5 2.9]; >> y=[1 0 0 0]; >> p=polyfit(x,y,3); >> p=polyfit(x,y,3); >> xx=0:0.01:3; >> plot(xx,polyval(p,xx)) >> hold on, plot(x,y, rx ),hold off 4: Programmet blir x=10;n=1; while x<1000 disp([ 2*,num2str(x), =,num2str(2*x)]) x=x*2;n=n+1; if x>1000, break, disp([num2str(x), -5=,num2str(x-5)]) x=x-5;n=n+1; disp([ Antalet tal mindre än 1000 är,num2str(n)]) 5
5: Vi löser uppgiften genom att skriva >> f=@(t) 2*exp(-t/2); >> integral( f,0,0.6) ans = 1.0367 Alltså är x 0 = 0.6 en bra uppskattning då g(0,6) 0.0367. skapa nu handtaget för g(x) och lös ekvationen >> g=@(x) 1 - integral(f,0,x); >> fzero(g,0.6) ans = 0.5754 Testar vi så blir integral(f,0,0.5754) väldigt nära 1. 6: På filen DiagonalDominant.m skriver vi function [D]=DiagonalDominant( A ) [n,m]=size(a); EnStrikt=0; % Sann om vi hittat en strikt olikhet AllaSanna=1; % Sätt till falsk ifall vi hittar en ogiltig olikhet for i=1:n % beräkna summan över raden S=0; for j=1:m, S=S+abs(A(i,j));, if S>2*abs(A(i,i)), % diagonal elementet ingår i S AllaSanna=0; break if S<2*abs(A(i,i)) % hittat en strikt olikhet EnStrikt=1; if EnStrikt & AllaSanna % Alt D = EnStrikt & AllaSanna; D=1; else D=0; 6