TAIU07 Föreläsning 5 Linjära ekvationssystem. Minsta kvadrat problem. Tillämpning: Cirkelpassning. Geometriska objekt. Translationer. Rotationer. Funktioner som inargument. Tillämpning: Derivata. 15 februari 2016 Sida 1 / 32
Linjära Ekvationssystem Division mellan matriser skall tolkas som att A/B betyder AB 1 och A\B betyder A 1 B. Exempel Lös ekvationssystemet 2 1 3 4 2 5 x= 2 2 3 med hjälp av MATLAB. 1 2 3. 15 februari 2016 Sida 2 / 32
I Matlab skapar vi först matrisen och högerledet med >> A = [ 2 1 3 ; 4-2 5 ; -2 2-3 ]; >> b = [ 1-2 3] ; % OBS kolumnvektor! Vi löser sedan ekvationssystemet med x = A 1 b som beräknas med \-operatorn. Alltså >> x = A\b; x ans = 1.8333 1.3333-1.3333 Kontrollera genom att beräkna residualen >> r = b - A*x; r ans = 1.0e-15 * 0.8882 0-0.4441 15 februari 2016 Sida 3 / 32
Funktionen inv beräknar inversen till en kvadratisk matris. Exempel Beräkna lösningen till Ax = b med hjälp av inversen >> A = [ 2 1 3 ; 4-2 5 ; -2 2-3 ]; >> b = [ 1-2 3] ; >> x = inv(a)*b; x ans = 1.8333 1.3333-1.3333 Ger samma lösning som tidigare. Beräkna nu A 1 A med >> C = inv(a)*a C = 1.0000 0 0 0 1.0000-0.0000-0.0000 0 1.0000 15 februari 2016 Sida 4 / 32
Exempel En linje ir 3 kan skrivas på formen 2 P(t) = p 1 + p 2 t = 1 + 3 1 2 2 t. Ett plan ir 3 spänns upp av de två vektorerna 1 v 1 = 1 och v 2 = 0 0 1 2. Var skär linjen planet? Formulera problemet som ett linjärt ekvationssystem. 15 februari 2016 Sida 5 / 32
Lösning Alla punkter i planet kan skrivas som en linjär kombination av v 1 och v 2. Vi söker alltså α 1,α 2 och t sådana att 1 0 2 1 1 α 1 + 1 α 2 = 1 + 2 t. 0 2 3 2 I Matlab: >> v1=[1-1 0] ;v2=[0 1-2] ;p1=[2-1 3] ;p2=[1 2 2] >> x=[ v1 v2 -p2]\p1; x ans = 1.3750-0.8750-0.6250 Skärningspunkten ges av >> P = v1*x(1)+v2*x(2); P ans = 1.3750-2.2500 1.7500 15 februari 2016 Sida 6 / 32
Minsta Kvadratproblemet Exempel Vi vet att en fysikalisk storhet ges av y = c 1 x 1 + c 2 x 2, där c 1 och c 2 är konstanter vi vill bestämma och x 1 och x 2 är parametrar vi enkelt kan variera. Hur skall vi bestämma c 1 och c 2? Lösning Genomför experiment och mät y för olika värden på(x 1, x 2 ). x 1 x 2 y 3.0 1.60 12.6 2.7 1.35 11.2 1.8 0.70 6.3 4.2 1.20 13.2 = 3.0 1.60 2.7 1.35 1.8 0.70 4.2 1.20 ( c1 c 2 ) = 12.6 11.2 6.3 13.2 Nöjer vi oss med två mätningar får vi ett linjärt ekvationssystem. Fler mätningar bör gå att utnyttja för att få ett bättre resultat. 15 februari 2016 Sida 7 / 32
Euklidisk Längd Den Euklidiska normen av en vektor x är n x 2 = i=1 x 2 i 1/2 I Matlab finns funktionen norm som beräknar normen x 2.. I Matlab >> x = [ 1 3-2 ] >> E = norm( x ) E = 3.7417 15 februari 2016 Sida 8 / 32
Definition Låt A R m n m > n. Ekvationssystemet Ax = b är då överbestämt. Fler ekvationer än obekanta gör att det oftast inte finns en lösning. Istället minimerar vi residualen och löser min x R n Ax b. Detta kallas Minsta kvadratproblemet. I statistiken kallas det Linjär Regression. Sats Minsta kvadrat lösningen x satisfierar normalekvationerna A T Ax = A T b. Om kolumnerna i A är linjärt oberoende så är A T A icke-singulär. 15 februari 2016 Sida 9 / 32
I MATLAB tolkas x=a\b som ett minsta kvadrat problem om A är rektangulär. Det x som minimerar Ax b 2 beräknas. Exempel Lös Minsta kvadratproblemet med A och b som tidigare >> A = [3.0 1.60 ; 2.7 1.35 ; 1.8 0.70 ; 4.2 1.20]; >> b = [12.6 11.2 6.3 13.2] ; >> x_mk = A\b % Eller (A *A)\( A *b ) x_mk = 1.8734 4.4208 Vi får minsta kvadrat lösningen x = ( 1.873, 4.420) T. Hade valt x = ( 2, 4) T och b med ett slumpmässigt fel. 15 februari 2016 Sida 10 / 32
Modell Passning Exempel Vi will anpassa ett polynom p(t) = c 0 + c 1 t+c 2 t 2 till en uppsättning mätningar (t i, y i ), 1 i m. 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0.2 0 0.2 0.4 0.6 0.8 1 1.2 Formulera detta som ett överbestämt ekvationssystem och lös med minsta kvadratmetoden. 15 februari 2016 Sida 11 / 32
Lösning Antag att data (t i, y i ) lagrats som två vektorer t och x. Då fås >> A=[ t.^0 t.^1 t.^2]; b=y; c= A\b;x >> tt=0:0.1:2;yy=c(1)+c(2)*tt+c(3)*tt.^2; >> plot(t,y, r+,tt,yy); 1.2 1 0.8 0.6 0.4 0.2 0 Vi får en vektor 0.2 0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 >> c ans = 0.0400-0.1073 0.7112 15 februari 2016 Sida 12 / 32
Exempel Vi har ett antal punkter (x k, y k ) som borde ligga på en cirkel. 6 5.5 5 4.5 4 3.5 3 2.5 2 1.5 2 1 0 1 2 3 4 Hur kan vi använda Minstakvadrat metoden för att uppskatta centrum och radie för cirkeln? 15 februari 2016 Sida 13 / 32
Lösning Varje punkt (x, y) T på cirkeln uppfyller ekvationen F(u) = a(x 2 + y 2 )+b 1 x+b 2 y+1 = 0, där u = (a, b 1, b 2 ) T är okända parametrar. Centrum och radie för cirkeln ges av z = (x 0, y 0 ) T = ( b 1 2a, b 2 2a )T, och, r 2 = b2 1 + b2 2 4a 2 1 a. Vi behöver två funktioner 1. Givet x och y beräkna u: function [u]=circlefit( x, y ) 2. Givet u beräkna z och r samt plotta cirkeln: function [z,r]=displaycircle( u ) 15 februari 2016 Sida 14 / 32
På filen CircleFit.m skriver vi % Hitta parameter vektor u som beskriver en cirkel % vektorerna x och y. % function [u]=circlefit( x, y ) A=[x.^2+y.^2 x y];b=-ones(length(x),1); u=a\b; end Vi använder funktioner på våra data vektorer x och y och får >> u=circlefit( x, y) u = 0.1729-0.4113-1.1799 15 februari 2016 Sida 15 / 32
På filen DisplayCircle.m skriver vi % Beräkna centrum och radie samt rita upp % cirkeln givet parameter vektorn u. % function [z,r]=displaycircle( u ) z=-u(2:3)/2/u(1) r=sqrt( (u(2)^2+u(3)^2)/4/u(1)^2-1/u(1)); theta=2*pi*(0:99) /100; x=z(1)+r*cos(theta);y=z(2)+r*sin(theta); x=[x;x(1)];y=[y;y(1)]; plot(x,y); end 15 februari 2016 Sida 16 / 32
Vi använder nu funktionen för att rita cirkeln >> hold on, [z,r]=displaycircle( u ); hold off 6 5.5 5 4.5 4 3.5 3 2.5 2 1.5 1 2 1 0 1 2 3 4 Vi fick z = (1.1898, 3.4131) T och r = 2.6981. Hade valt z 0 = (1.2, 3.4) T och r = 2.7. 15 februari 2016 Sida 17 / 32
Geometriska Objekt och Avbildningar Exempel En månghörning består av hörpunkter och kantlinjer. Varje punkt P k = (x k, y k ) T kan ses som en 2 1 vektor. Vi vill rita upp en femhörning med givna hörnpunkter ( ) ( ) ( ) ( ) 1 3 5 6,,, och 3 6 5 2 Vi vill sedan förflytta alla punkterna med en konstant vektor T = (1, 2) T och rita upp månghörningen igen. Hur skall vi göra? ( 3 1 ). 15 februari 2016 Sida 18 / 32
Spara punkterna i en 2 n matris P. Varje punkt representeras av en kolumn P(:,k). I Matlab P = [ 1 3 5 6 3 ; 3 6 5 2 1 ]; plot( P(1,:),P(2,:), r+ ); hold on ind = [1 2 3 4 5 1 ]; plot( P(1,ind),P(2,ind), b- ); För att translatera punkterna skapar vi en ny 2 n matris att addera till P. T=ones(2,5); T(2,:)=2; P2 = P+T; plot( P2(1,ind),P2(2,ind), k-- ) hold off 15 februari 2016 Sida 19 / 32
Sätt koordinataxlarna så att vi ser hela bilden och skriv ut axis([ 0 8 0 9]) print -depsc F2-5horning.eps Den färdiga bilden blir 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 Kommentar Många olika operationer inom datorgrafik består av att enkla operationer utförs på punktmängder. I Matlab kan man göra rätt mycket om man är lite kreativ. 15 februari 2016 Sida 20 / 32
Linjära Avbildningar Definition En n mmatris A kan ses som en avbildning A : x R m y R n. där y = Ax. Exempel Enhetsmatrisen I representerar en avbildning I : x x. Den bildas i Matlab med kommandot >> n = 10; >> I = eye( n ); Andra viktiga avbildningar är rotationer, speglingar, och projektioner. 15 februari 2016 Sida 21 / 32
Rotationer Lemma En punkt P = (x 1, x 2 ) T roteras kring origo (0, 0) T, med vinkel α, med hjälp av ( ) P cos(α) sin(α) = G P, G =. sin(α) cos(α) Exempel Vi vill illustrera rotationer i Matlab genom att rotera en punkt P = (4, 2) T kring ett origo som satts till O = (2, 3) T. Vridningsvinkeln skall varaα = 2π/3. Rita upp relevanta vektorer både före och efter vridningen. Samt rita upp en cirkel med centrum i punkten O för att tydligare visa att vi fått en vridning. 15 februari 2016 Sida 22 / 32
Lösning Skapa först vektorer för att representera Origo O = (2, 3) T och punkten P. Beräkna även skillnadsvektorn R. Origo=[ 2 ; 3 ]; P=[ 4 ; 2 ]; R = P - Origo; Plotta nu vektorerna i blått clf,hold on plot( [0 P(1)],[0,P(2)], b ) plot( [Origo(1) P(1)],[Origo(2),P(2)], b ) 15 februari 2016 Sida 23 / 32
Skapa en mängd punkter på cirkeln med origo i O = (2, 3) T. Radie=sqrt( sum( R.^2 ) ); alpha=0:0.01:2*pi; x=origo(1)+radie*cos( alpha ); y=origo(2)+radie*sin( alpha ); plot(x,y, r-- ) 15 februari 2016 Sida 24 / 32
Skapa sedan vridningspatrisen G och applicera den på skillnadsvektorn R. alpha=2*pi/3; G = [cos(alpha),-sin(alpha);sin(alpha),cos(alpha R2=G*R; P2=Origo+R2; Rita nu upp de nya punkterna i svart. plot( [0 P2(1)],[0,P2(2)], k ) plot( [Origo(1) P2(1)],[Origo(2),P2(2)], k ) axis equal hold off Kommentar Kommandot axis equal gör koordinataxlarna lika långa i fönstret. Annars ser inte cirkeln rund ut. 15 februari 2016 Sida 25 / 32
5 4.5 4 3.5 3 2.5 2 1.5 1 0.5 0-1 0 1 2 3 4 5 Den färdiga grafen innehåller de objekt som behövs för att illustrera vridningen. Punkten blir >> P2 ans = 1.8660 5.2321 15 februari 2016 Sida 26 / 32
Funktioner som inargument Kommandot feval kan användas för att anropa en funktion med givna inparametrar. Exempel Har vi skrivit en fil funk.m som innehåller function [z]=funk( x, y ) z=x^2+3*y; end så kan vi anropa funktionen med inargument x = 2 och y = 2.5 genom att skriva >> feval( @funk, 2, 2.5 ) ans = 11.5000 15 februari 2016 Sida 27 / 32
Funktioner som inargument Exempel Definitionen av derivata är f f(x+h) f(x) (x) = lim. h 0 h Välj ett fixt h > 0 för att approximera derivatan av f(x). Skriv en funktion Derivata.m som kan anropas med >> Df = Derivata( @funk, x, h ); Använd funktionen för att plotta derivatan av sin(x) på intervallet [0, 2π]. 15 februari 2016 Sida 28 / 32
Lösning På filen Derivata.m skriver vi function [Df]=Derivata( f, x, h ) f1=feval( f, x + h ); f0=feval( f, x ); Df=(f1-f0)/h; end Vi kan sedan plotta derivatan av sin(x) genom att skriva >> x = 0:0.01:2*pi; >> plot( x, Derivata( @sin, x, 10^-3 ) ); 15 februari 2016 Sida 29 / 32
Enkla funktioner Enkla funktioner kan skapas direkt i Matlab. Man skriver >> f = @( <variabler> ) <uttryck>; Man får då ett handtag till en funktion. Exempel Skriv >> f = @(x) exp(2*x).*cos(x.^2)+4*x f = @(x)exp(2*x).*cos(x.^2)+4*x Funktionen kan beräknas med feval eller direkt f(4). 15 februari 2016 Sida 30 / 32
Exempel Skapa funktionerna f(x) = 1 x 2 e 2x, och g(x) = (x1 2 1, 1+x 2 ) T. Tänk på att g(x) måste ha en vektor som inagrument och returnera en vektor i R 2. Försök få f(x) att acceptera vektor argument så att det går att skriva >> x = 0:0.01:1; >> plot( x, f(x) ) 15 februari 2016 Sida 31 / 32
Funktionen integral beräknar integraler. Den anropas >> I = integral( fun, a, b ) där f är ett funktionshandtag. Exempel Beräkna samma integral som tidigare genom >> f = @(x) exp(2*x).*cos(x.^2)+4*x; >> I = integral( f, 0, 1) I = 4.6736 Det finns även integral2 för dubbelintegraler. 15 februari 2016 Sida 32 / 32