TEKNISKA HÖGSKOLAN I LINKÖPING Matematiska institutionen Beräkningsmatematik/Fredrik Berntsson Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI Tid: 8-12, 19:e Mars, 2019 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 282860) Besök av jourhavande lärare sker ungefär 14.45 och 16.45. 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 ast innehåller positiva tal. function [test] = Positiv(x) for i=1:length(x) if x(i)>0 test=1; else test=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) = 2e 2x sin(πx) 2 x/2, på intervallet 0 x 1, och undersöka var dess nollställe 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 tillsammans med funktionen abs för att hitta det värde i f vektorn med minst absolutbelopp. Detta approximerar funktionens nollställe. Hitta även motsvarande x-värde. c) Markera punkten (x noll,f noll ) du hittat i b) i den graf du ritat upp i a) med ett rött +. (3p) 3: Normen av en vektor beräknas enligt formeln x 2 = x 2 1 +x 2 2 +...+x 2 n, där n är vektorns längd. a) Skriv en Matlabfunktion MinNorm med en vektor x som inparameter och resultatet av normberäkningen som utparameter. b) Skapa de två vektorerna x = (0,2, 3,6) T och y = ( 1,2,6) T i Matlab och använd funktionen MinNorm för att beräkna deras normer. Tips I Matlab finns en inbyggd funktion norm 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. 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 är diagonaldominant om det, för varje rad, gäller att a ii j i a ij, i = 1,2,...,n. Dessutom skall strikt olikhet( dvs <) gälla för minst en rad. Skriv en funktion DiagDom med en matris A som inparameter, och en logisk variabel som utparameter. Funktionen skall kontrollera om matrisen är diagonaldominant och returnera sant eller falskt. Använd funktionen för att testa om matrisen 3 1 2 A = 1 2 1 0 2 2 är diagonaldominant eller inte. 4
Lösningsförslag till tentan 19:e Mars 2019. 1: Problemet är att ast sista testen räknas. Enklast är att avbryta om ett negativt tal hittas. (2p) 1: Följande funktion är tänkt att kontrollera om en vektor x ast innehåller positiva tal. function [test] = Positiv(x) for i=1:length(x) if x(i)>0 test=1;break; else test=0; 2: a) Vi skapar vektorn, beräknar funktionsvärden, och plottar med kommandona >> N=50; x=(0:n-1)/(n-1); >> f=2*exp(-2*x)-sin(pi*x).^2-x.^2; >> plot(x,f) b+c) Vi hittar minsta beloppet med kommandot 3: a) Funktionen blir b) Vi får >> [m,k]=min(abs(f));disp(m),disp(x(k)) % m=0.0118 och x=0.3673 >> hold on,plot( x(k),f(k), r+ );,hold off function [S]=MinNorm( x ) S=0; for i=1:length(x) S=S+x(i)^2; ; S=sqrt(S); >> MinNorm([0,2,-3,6] ) 7 >> MinNorm([-1,2,6] ) 6.4031 5
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: Vi löser uppgiften genom att skriva >> f=@(t) 2*exp(-t/2); >> integral( f,0,0.6) 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) 0.5754 Testar vi så blir integral(f,0,0.5754) väldigt nära 1. 6: Funktionen blir function [Test]=DiagDom(A) [n,m]=size(a); EnStrikt=0; AllaRader=1; for i=1:n S=sum(abs(A(i,:)); % räknar även med diagonalelementet. if 2*abs(A(i,i)) > S, AllaRader=0;, if 2*abs(A(i,i)) < S, EnStrikt=0;,break;, Test = AllaRader & EnStrikt; ; Använder vi den på matrisen fås 6
>> A=[ 3 1 2 ; 1 2-1 ; 0 2 2]: >> Test = DiagDom( A ) Test = 0 alltså är inte matrisen diagonaldominant. 7