Linjära avbildningar

Linjära transformationer

(R^2)

Quit[]

Definiera hörnen i en enhetskvadrat.

p0={0,0};
p1={1,0};
p2={1,1};
p3={0,1};
kvadrat={p0,p1,p2,p3,p0}

En figur

Graphics[Line[kvadrat],Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]

Skalning

Ett exempel är en avbildning som dubblar längden på varje vektor. 
Avbildningen kan göras på olika sätt. Först genom att helt enkelt multiplicera med två.

dubbelKvadrat=2kvadrat
Graphics[Line[dubbelKvadrat],Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]

Motsvarande standardmatris A = [T(𝕖1) T( 𝕖2)]

A=(({{2, 0}, {0, 2}}))
MatrixForm[A]

Transponera koordinatmatrisen

Varför måste vi göra det?

Räknar vi för hand behövs det inte, men i Mathematica gäller det att formaten stämmer när vi multiplicerar.

En mer programmeringsmässig metod med mappning visas längre ner i dokumentet.

Transponat

Transponat innebär att rader blir kolonner och kolonner blir rader

m1={{1,2,3,4},
{11,12,13,14},
{21,22,23,24}};
MatrixForm[m1]
Dimensions[m1]

Transponat

m1trans=Transpose[m1];
MatrixForm[m1trans]
Dimensions[m1trans]

Produkter

m1.m1trans//MatrixForm
m1trans.m1//MatrixForm

Åter till uppgiften

hörnTransponerade=Transpose[kvadrat];
MatrixForm[%]

Transformationen

A.hörnTransponerade
MatrixForm[%]

Vi vill ha resultatet på en annan form. Varför då?

Transponera för att kunna plotta

nyKvadrat=Transpose[%]

Och den nya kvadraten

Graphics[Line[nyKvadrat],Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]

Mappning

Ett sätt att förenkla koden är att 
	1. definiera en funktion i Mathematica och 
	2. mappa funktionen på listan med koordinater. 

Vi slipper då transformera matriserna två gånger. 
Det är också lite mer “programmeringstänk” över den metoden

Först ett enkelt exempel

Vi definierar en enkel funktion: multiplikation med 2

t[x_]:=2x; (*multiplicera med 2 *)

Vår ursprungskvadrat

kvadrat

Funktionen Map[ ]

vi mappar funktionen t på listan kvadrat

kvadrat2=Map[t,kvadrat]

Figur

Mappningen sker här inne i grafikkommandot

Graphics[{Line[kvadrat],Arrow[{p0,p1}],Arrow[{p0,p3}],Red,Line[kvadrat2],Arrow[Map[t,{p0,p1}]],Arrow[Map[t,{p0,p3}]]},Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]

Mappning med matriser

Motsvarande standardmatris A = [T(𝕖1) T( 𝕖2)]

Mappning

A=(({{2, 0}, {0, 2}}));
tA[x_]:=A.x;
kvadrat3=Map[tA,kvadrat]

Figur

Graphics[{Line[kvadrat],Red,Line[kvadrat3]},Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]

Bilderna visar att avbildningen är densamma.

Lite överkurs för den som gillar att programera

Här är en generell skalningsmatris som skalar med en faktor x i x - led och en faktor y i y - led.

aK[x_,y_,v_]:=(({{x, 0}, {0, y}})).v;

Manipulate[Grid[{{MatrixForm[(({{x, 0}, {0, y}}))]},{Graphics[Line[aK[x,y,#]&/@kvadrat],Axes->True,PlotRange->{{-5,5},{-5,5}}]}}],{{x,1},-5,5,.1},{{y,1},-5,5,.1}]

Rotation

En annan linjär avbildning är att rotera figuren. Rotera enhetskvadraten 60° moturs.

Transformationsmatrisen

Arot=(({{1/2, -(Sqrt[3])/2}, {(Sqrt[3])/2, 1/2}}));

Hur vet vi att matrisen ska se ut  så där?

Koordinatmatrisen

Koordinatmatrisen som beskriver kvadraten har fel format för att utföra transformationen  A x

kvadrat
MatrixForm[%]

Koordinatmatrisen

Den måste först transponeras

Transpose[kvadrat];
MatrixForm[%]

Och sedan kan vi multiplicera

nyaPunkter=Arot.Transpose[kvadrat]
MatrixForm[nyaPunkter]

Och sedan kan vi transponera resultatet

Transpose[nyaPunkter]

Eller allt på en gång:

Transpose[Arot.Transpose[kvadrat]]

Att utföra matrismultiplikationen genom mappning (Map)

Jag definierar en funktion som utför rotationen

tArot[x_]:=Arot.x;

Jag utför matrismultiplikationen genom att mappa funktionen tArot  på kooordinatmatrisen

kvadrat3=Map[tArot,kvadrat]

Jag visar resultatet grafiskt

Graphics[{Line[kvadrat],Red,Line[kvadrat3]},Axes->True,PlotRange->{{-1,1.5},{-0.5,2}}]

Rotation med godtycklig vinkel

afi[ϕ_]:=(({{Cos[ϕ], -Sin[ϕ]}, {Sin[ϕ], Cos[ϕ]}}));

tAfi[x_,ϕ_]:=afi[ϕ].x;

Manipulate[Graphics[{Line[kvadrat],Red,Line[tAfi[#,ϕ]& /@kvadrat]},Axes->True,PlotRange->{{-1.5,1.5},{-1.5,1.5}}],{ϕ,0,2π}]

Spegling i en linje

Man kan också spegla figuren i en linje.

a[ϕ_]:=(({{Cos[2ϕ], Cos[π/2-2ϕ]}, {Sin[2ϕ], -Sin[π/2-2ϕ]}}));
tA[x_,ϕ_]:=a[ϕ].x;

Manipulate[
Grid[{{ϕ},{Graphics[{Arrow[{p0,p1}],Arrow[tA[#,ϕ]&/@{p0,p1}],Line[{{2*Cos[ϕ],2*Sin[ϕ]},{-2*Cos[ϕ],-2*Sin[ϕ]}}],Blue,Arrow[tA[#,ϕ]&/@{p0,p3}],Arrow[{p0,p3}]},Axes->True,PlotRange->{{-1.5,1.5},{-1.5,1.5}}]}}],{{ϕ,π/4},0,2π,π/12}]

Vinkelrät projektion på x-axeln

aX:=(({{1, 0}, {0, 0}}));
tA[x_]:=aX.x;
kvadrat5=Map[tA,kvadrat];
Graphics[{Line[kvadrat],Red,Thick,Line[kvadrat5]},Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]

Skevning

aS[x_,y_]:=(({{1, x}, {y, 1}}));
tS[x_,y_,v_]:=aS[x,y].v;
kvadrat5=Map[tS,kvadrat];

Manipulate[Grid[{{{MatrixForm[(({{1, x}, {y, 1}}))]}},{Graphics[{Line[kvadrat],Red,Thick,Line[tS[x,y,#]&/@kvadrat]},Axes->True,PlotRange->{{-2,2},{-2,2}}]}}
],{{x,0},-1,1},{{y,0},-1,1}]

Uppgift

Skapa en transformationsmatris som förstorar ett objekt två gånger i x - led och sedan roterar det 60° moturs.

matriser?

skala=(({{2, 0}, {0, 1}}));
rotera=(({{1/2, -(Sqrt[3])/2}, {(Sqrt[3])/2, 1/2}}));

Det går bra att multiplicera ihop matriserna till en enda transformationsmatris.  I vilken ordning ska matriserna stå?

rs=rotera.skala;
MatrixForm[rs]

tA[x_]:=rotera.(skala.x);

kvadrat5=Map[tA,kvadrat];

Graphics[{Line[kvadrat],Red,Thick,Line[kvadrat5]},Axes->True,PlotRange->{{-0.5,2},{-0.5,2}}]