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, 11 Juni, 2015 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 9.15 och 10.45. Resultat meddelas via epost senast tisdag 18:a Juni. Lösningsförslag finns på kurshemsidan efter tentans slut. Visning Lycka till!
Redovisning Lös först uppgifterna i Matlab. Då du har en färdig lösning skriv då ner de kommandon du använde på papper. Redovisa även eventuella resultat du fick då körde dina Matlab kommadon. Grafer behöver inte redovisas. (2p) 1: Följande MATLAB script är tänkt att sortera en vektor x i stigande ordning n = length(x); for i = 1:n-1 for j = 1:n-1 if x(j)>x(j+1) x(j+1)=x(j); x(j)=x(j+1); Förklara vad som går fel och gör de förändrningar som behövs för att få förväntat resultat. (3p) 2: Vi vill studera funktionen f(x) = 4e 5x2 +2x 3, 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 Matlab kommandot 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) uppgiften i den graf du ritat upp i a) uppgiften med ett rött +. (3p) 3: Den geometriska serien defineras som N S = x k = 1+x+x 2 +...+x N. k=0 Det är känd att en geometrisk serie är konvergent om x < 1 och att S = 1 xn+1 1 x Skriv ett Matlab script som verifierar detta genom att beräkna S på de två olika sätten för ett givna värden på x och N. Första raden i scriptet skall sätta värden på x och N. Exempelvis x=5/7; N=100; och sedan beräknas genom att räkna ut summan ovan med enfor-loop samt genom att utnyttja formeln. I slutet av scriptet skall värdet på S (för bägge alternativen) skrivas ut. 2
(3p) 4: Frobenius normen av en matris definieras som A F = ( n i=1 n j=1 a ij 2 )1 2. Detta uttryck används ofta som ett mått på hur stor en matris är. a) Skriv en function Frobenius med en matris A som inparametrar och med Frobeniusnormen F = A F som utparameter. b) Utnyttja funktionen från a) för att beräkna Frobenius normen av matrisen 1 0 2 A = 2 3 0. 0 3 4 Tips I Matlab finns en inbyggd funktion norm som utför precis denna beräkning. Skriver du norm(a, fro ) så beräknas Frobenius nurmen. 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. (3p) 5: Vi är intresserade av att undersöka storleken på en insektspopulation. Vi gör en serie mätningar och får en vektor, F = (F 1,F 2,...,F n ) T, där F i är det uppmätta antalet insekter vid tiden t i. För att analysera mätningarna antar vi att dessa kan beskrivas med modellen F(t) c 1 +c 2 cos(t)+c 3 sin(t), där c 0, c 1, och c 2 är okända parametrar vi önskar bestämma. a) Modellen ovan leder till ett överbestämt ekvationssystem Ax = b som kan lösas med minsta kvadratmetoden. Antag att följande mätningar är givna t k 0 1 2 3 4 F(t k ) 1.14 2.11 2.79 2.40 1.43 Skriv de Matlab kommandon som krävs för att bilda både matrisen A och högerledet b. Lös dessutom minsta kvadrat problemet och hitta koefficienterna c 1, c 2 och c 3. b) Plotta den funktionskurva F(t) som du hittade i Uppgift a). Rita även upp de givna mätvärdena (t k,f k ) i samma Figur (som svarta o). 3
(4p) 6: Med utgångspunkt ifrån ett godtyckligt positivt heltal bildas en talföljd enligt följande princip: 1. Om ett tal i följden är udda bildas nästa tal genom att multiplicera det med 3 och addera 1 till produkten. 2. Om talet är jämnt bildas nästa tal i följden genom att dividera med 2. Om man börjar med siffran 6 får alltså talföljden: 6 3 10 5 16 8 4 2 1. Man förmodar att talföljder som bildas på detta sätt alltid slutar med 1 men har inte lyckats bevisa det. Börjar man med ett tal mellan 1 och 100 så kommer man i vilket fall till 1 så småningom. a) Skriv en funktion bilda_talfoljd som bildar en talföljd enligt metoden ovan. Startsiffran skall vara inparameter och utparameter skall vara längden på den talföljd man får. Både start och slutsiffran skall räknas så längden på den talföljd man får då man startar med siffran 6 är 9. b) Skriv ett program som använder funktionen bilda_talfoljd för att undersöka hur långa talföljder man får då man startar med talen 1 100. Du skall skriva ut för vilken startsiffra som den längsta talföljden erhålls. Tips: Du kan kontrollera om ett tal är jämnt eller udda genom att dela det med två, avrunda resultatet till närmaste heltal, och sedan multiplicera med två igen. Om talet är jämnt så får du tillbaka samma tal igen. 4
Lösningsförslag till tentan 20:e Mars 2015. 1: Problemet är att x(j) skriver över x(j+1). Använd en temporär variabel. Enklast är att ändra alltså till. n = length(x); for i = 1:n-1 for j = 1:n-1 if x(j)>x(j+1) tmp=x(j+1); x(j+1)=x(j); x(j)=tmp; 2: a) Vi skapar vektorn, beräknar funktionsvärden, och plottar med kommandona >> N=50; x=(0:n-1)/(n-1); >> f=4*exp(-5*x.^2)+2*x.^3; >> plot(x,f) b+c) Vi hittar minimum med kommandot 3: Matlab scriptet blir x=5/7; N=100; >> [m,k]=min(f);disp(m),disp(x(k)) % m=1.0251 och x=0.6735 >> hold on,plot( x(k),f(k), r+ );,hold off S1=0; for k=0:n S1=S1+x^k; % Serie alternativet S2=(1-x^(N+1))/(1-x); % Formeln disp(s1),disp(s2) Med N = 100 fås värdet 3.5. 4: Funktionen blir 5
function [F]=Frobenius(A) [n,m]=size(a); F=0; for i=1:n for j=1:m F=F+A(i,j)^2; F=sqrt(F); vilket get >> Frobenius( [1 0-2 ; -2 3 0 ; 0-3 4] ) ans = 6.5574 5: Vi får ett överbestämt ekvationssystem som skapas med kommandona >> t = [0 1 2 3 4] ; F=[ 1.14 2.11 2.79 2.40 1.43 ] ; >> A = [ t.^0 cos(t) sin(t) ]; b=f; c=a\b; Vi får c = (1.7128 0.5857, 0.8823) T. Beräkna nu funktionen för ett antal t-värden och plotta detta tillsammans med punkterna med kommandot >> tt=0:0.1:4; FF=c(1)+c(2)*cos(tt)+c(3)*sin(tt); >> plot( tt,ff, b,t,f, ko ); 6: Funktionen blir kan exempelvis skrivas som function [k]=bilda_talfoljd( x ) k=1; while x ~= 1 k=k+1; if mod(x,2)==1 % Udda x=3*x+1; else x=x/2; disp(x) % behövs inte Vi skriver sedan ett program för att hitta den längsta följden 6
k_max=-1;i_max=-1; for i=1:100 k=bilda_talfoljd(i); if k>k_max k_max=k;i_max=i; ; ; disp(k_max),disp(i_max) Vi for att med startvärde 97 får en 119 tal lång följd. 7