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, 22 Mars, 2016 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 15.15 och 16.45. Resultat meddelas via epost senast onsdag 30:e April. Lösningsförslag finns på kurshemsidan efter tentans slut. Visning av tentamen sker på Examinators kontor måndag den 4:e April, klockan 12.15-13.00 (Hus B, Ing. 23-25, Plan-3, A-korr). Lycka till!
Redovisning Lös först uppgifterna i Matlab. Då du har en färdig lösning, skriv ner de kommandon du använde på papper. Redovisa även eventuella resultat du fick då du körde dina Matlab kommadon. Grafer behöver inte redovisas. (2p) 1: Följande kommandon är tänkta att kontrollera ifall alla element i en given vektor x är noll-skiljda: for i=1:length(x) if x(i) ~= 0 NollSkiljd=1; else NollSkiljd=0; Förklara vad som går fel och gör de ändringar som krävs för att programmet skall fungera som det är tänkt. (2p) 2: Använd polyfit för att anpassa en rät linje till följande tabell x 0 1 2 3 y 1.7 2.2 2.9 3.4 Plotta även den räta linjen på intervallet 0 x 3 som en blå heldragen linje. Rita även in punkterna (x i,y i ) i samma graf med röda x. (3p) 3: Vi vill studera funktionen på intervallet 0 x 1. f(x) = 1+xcos(3x) a) Skapa ett funktionshandtag som motsvarar funktionen f(x) ovan. Din funktion skall klara av att x är en vektor. Skapa sedan en vektor x som innehåller N = 100 jämt utspridda tal på intervallet [0,1]. Beräkna även en vektor f med motsvarande funktionsvärden med hjälp av ditt funktionshandtag och utnyttja dessa vektorer för att plotta funktionen på aktuellt intervall. b) Vi ser ur grafen att funktionen f(x) har ett nollställe nära x = 0.5. Använd fzero för att beräkna ett bra värde på detta nollställe. c) Markera nollstället i grafen med ett rött +. 2
(3p) 4: Vi vill studera hur summan S N = N N(N k +1) k 2, k=1 beror på N. Vi skall därför göra följande: a) Skriv en funktion som beräknar summan för ett givet värde på N. Funktionen skall kunna anropas enligt >> N = 10; S = Summan( N ) S = 165 b) Skapa en vektor som innehåller heltalen N = 10,20,30,...,100. Beräkna sedan en ny vektor som innehåller motsvarande summor S N med hjälp av din funktion från a). Plotta en graf som visar S N som funktion av N. Använd semilogy istället för plot för att tydligare se hur S N beror på N. Du skall även lägga till lämplig text på koordinataxlarna. (4p) 5: I ett spel skall vi kasta tärningar i följd tills vi fått två sexor. Vi skall skriva ett Matlab program som simulerar en sådan spelomgång genom att slumpa fram heltal mellan 1 och 6 tills vi fått två sexor. Din funktion skall göra utskrifter enligt följande mönster Tärning 1: 2 Tärning 2: 3 Tärning 3: 1 Tärning 4: 6 första Tärning 5: 4 Tärning 6: 6 andra 3
(4p) 6: Ett instrument ger ibland underliga mätresultat. En viss storhet som vi vill mäta är nästan konstant men ibland ger mätinstrumentet en alldeldes för stor avvikelse ifrån det konstanta värdet. Vi antar att mätserien har lagrats i en vektor F och vi vill hitta konstiga mätvärden genom att göra följande Beräkna först medelvärdet m = 1 n n k=1 F k. Hitta de index k sådana att F k m > tol, där tol är en given tolerans. Skriv en funktion >> [ind]=hittaavvikelser( F, tol ) som utför ovanståe steg. Testa din funktion på fallet F = (2.1, 1.9, 0.1, 2.1, 2.2, 3.7, 1.9, 1.8, 2.1), och tol = 1.0. Du skall få ind = (3, 6) eftersom dessa platser i vektorn avviker mycket från medelvärdet. Plotta dessutom vektorn F som en blå linje och markera de punkter som avviker för mycket från medelvärdet med röda ringar. 4
Lösningsförslag till tentan 20:e Mars 2015. 1: Problemet är att ast sista kontrollen räknas. Enklaste lösningen är att avbryta då vi hittar två element som inte ligger i stigande ordning med break. Vi får for i=1:length(x) if x(i) ~= 0 NollSkiljd=1; else NollSkiljd=0; break Det finns flera alternativa lösningar som ger enklare kod. Exempelvis NollSkiljd=1; for i=1:length(x) if x(i) == 0 % Vänt på jämförelsen! NollSkiljd=0; break 2: Bilda vektorerna x och y samt utför polynomanpassningen med >> x=[ 0 1 2 3]; y=[1.7 2.2 2.9 3.4]; >> p1=polyfit(x,y,1) >> plot( x, polyval(p1,x), b-, x, y, r+ ); Notera att vi inte behöver bilda en tätate x-vektor innan vi plottar då vi skall rita upp en rät linje. 3: a) Vi skapar vektorn, beräknar funktionsvärden, och plottar med kommandona fun = @(x) sqrt(1+x).*cos(3*x); N=100; x=(0:n-1)/(n-1); f=fun(x); plot(x,f) b+c) Vi hittar roten och plottar med rot=fzero( fun, 0.5 ); hold on plot( rot, 0, r+ ) hold off 5
4: Funktionen blir function [S]=Summan(N) S=0; for k=1:n S=S+N*(N-k+1)-k^2; Vi använder den för att plotta grafen med N=10:10:100; S=zeros(size(N)); for k=1:length(n) S(k)=Summan(N(k)); semilogy(n,s) xlabel( N );ylabel( Summan: S_N ); 5: Följande program löser uppgiften k=0; % Antal kast n=0; % antal sexor while n<2 k=k+1; T=randi([1 6],1); str = [ Tärning,num2str(k), :,num2str(t)]; if T==6 n=n+1; if n==1 str = [str, första ]; else str = [str, andra ]; disp(str) 6
6: Funktionen HittaAvvikelser blir function [ind]=hittaavvikelser( F, tol ) m=mean(f); n=0; for k=1:length(f) if abs(f(k)-m)>tol n=n+1; ind(n)=k; Vi använder sedan funktionen för att skapa grafen med >> F=[2.1 1.9 0.1 2.1 2.2 3.7 1.9 1.8 2.1]; >> ind=hittaavvikelser( F, 1 ) >> ind = 3 6 >> plot(f); hold on, plot( ind, F(ind), ro ), hold off 7