SymPy-demo 3: Lineære afbildninger#
Demo af Christian Mikkelstrup, Hans Henrik Hermansen, Karl Johan Måstrup Kristiansen og Magnus Troen. Revideret 22-10-26 af shsp.
from sympy import *
init_printing()
Kerne og søjlerum#
Lad
B = Matrix([[5, 4*I, 3+5*I], [3*I, 2, -3+4*I],[3, 8, 3+7*I]])
B
Vi finder kernen \(\operatorname{ker}\mathbf B\) med følgende kommando:
B.nullspace()
Altså er \( \operatorname{ker}\mathbf B = \operatorname{span}\left(\begin{bmatrix} -1-i \\ -\frac{i}{2} \\ 1 \end{bmatrix}\right). \)
Søjlerummet og rækkerummet, \(\operatorname{colsp}\mathbf B\) og \(\operatorname{rowsp}\mathbf B\), kan findes med
B.columnspace(), B.rowspace()
Vi ser af outputtet, at
Bemærk: dimensionerne af disse rum vil være identiske og lig med rangen af \(\mathbf B\): $\( \operatorname{dim}(\operatorname{colsp}\mathbf B) = \operatorname{dim}(\operatorname{rowsp}\mathbf B) = \rho (\mathbf B). \)$
Linearitet af afbildninger#
Vi vil undersøge, om en afbildning er lineær. Til dette formål undersøger vi afbildningen \(\boldsymbol f:\mathbb{R}^2 \to \mathbb{R}^4\) givet ved
def f(x):
x1 = x[0]
x2 = x[1]
return Matrix([2*x1+x2, 3*x1+2*x2, x1+x2, 2*x1+3*x2])
Metode 1 - Tjek linearitetskravene direkte#
En afbildning er lineær, hvis den for to vilkårlige vektorer \(\mathbf u\) og \(\mathbf v\) fra definitionsmængden samt en vilkårlig konstant \(k\) fra tallegemet opfylder følgende to krav:
Find den relevante sætning i kursuslærebogen, som angiver dette, for at bekræfte. For at tjekke, om disse to krav er opfyldt, definerer vi først vilkårlige vektorer og konstant, som vi kan arbejde med:
u1,u2,v1,v2,k = symbols('u_1,u_2,v_1,v_2,k')
u = Matrix([u1,u2])
v = Matrix([v1,v2])
u, v, k
Indsæt disse vilkårlige vektorer i afbildningen for at se, at alt er defineret korrekt:
f(u), f(v)
Lad os nu tjekke linearitetskravene:
# Linearitetskrav nr. 1
f(u+v) - (f(u)+f(v))
# Linearitetskrav nr. 2
simplify(f(k*u)-k*f(u))
Vi ser her, at \(\boldsymbol f\) opfylder kravene, så vi konkluderer, at \(\boldsymbol f\) er lineær.
Metode 2 - Find afbildningsmatricen#
Hvis vi kan skrive afbildningen \(\boldsymbol f(\mathbf x)\) på matrixform som:
for en matrix \(\mathbf F \in \mathbb{R}^{m \times n}\), så er \(\boldsymbol f\) lineær (se den relevante sætning i lærebogen). Matricen \(\mathbf F\) kalder vi ofte for afbildningsmatricen - hvis en afbildningsmatrix eksisterer, så er afbildningen lineær.
Vi indser, at \(\boldsymbol f\) har følgende matrixrepræsentation (med hensyn til de ordnede standardbaser for \(\mathbb{R}^2\) og \(\mathbb{R}^4\)):
Så vi har fundet en matrix \(\mathbf F \in \mathbb{R}^{4\times 2}\) til at være:
hvilket er en matrixrepræsentation (en afbildningsmatrix) af afbildningen med hensyn til de ordnede standardbaser.
Bemærk, at søjlerne er billederne af basisvektorerne fra definitionsmængden \(\mathbb R^2\), som forventet:
f([1,0]),f([0,1])
Vi gjorde alt det ovenstående manuelt, men når man anvender standardbasen, kan man automatisere processen som følger, hvor vi udnytter identitetsmatricen eye - bemærk, at hvis en lineær afbildning er givet, så er det altid muligt at finde en matrixrepræsentation på denne måde:
n = 2
m = 4
V = eye(n)
F = zeros(m,n)
for k in range(n):
F[:,k] = f(V.col(k))
F
Typiske scenarier for brug af afbildningsmatricen#
Vi betragter en afbildning \(\boldsymbol g:\mathbb{R}^3\to\mathbb{R}^4\), som med hensyn til de ordnede standardbaser for \(\mathbb{R}^3\) og \(\mathbb{R}^4\) er givet ved sin afbildningsmatrix:
G = Matrix([[1,3,1],[2,4,0],[1,1,-1],[-3,-1,5]])
G
Her følger fem eksempler på, hvordan en opgave kan løses ved brug af denne afbildningsmatrix.
Eksempel 1 - Find billedet af en given vektor#
Vi ønsker at finde billedet \(\boldsymbol g(\mathbf v)\) af en vektor \(\mathbf v\):
v = Matrix([1,-2,5])
Da vi har afbildningsmatricen, gøres dette nemt med simpel matrix-multiplikation, fordi \(\boldsymbol g(\mathbf v) = \mathbf G\mathbf v\):
G*v
Altså har vi \(\boldsymbol g(\mathbf v) = (0,-6,-6,24)\).
Eksempel 2 - Undersøg, om en vektor tilhører kernen#
Tilhører følgende vektor \(\mathbf u\) kernen af \(\boldsymbol g\)?
u = Matrix([-6,3,-3])
I så fald er \(\boldsymbol g(\mathbf u)\) nulvektoren (se definitionen af kernen i lærebogen). Derfor kan vi igen blot udføre en simpel afbildning af vektoren:
G*u
Altså har vi, at \(\mathbf u=(-6,3,-3)\in\operatorname{ker}\boldsymbol g\).
Eksempel 3 - Find kernen af en afbildning#
Vi ved fra lærebogen, at \(\mathbf x\in \operatorname{ker}\boldsymbol g\), hvis og kun hvis \(\boldsymbol g(\mathbf x)=\mathbf 0\). Så vi kan finde kernen af vores afbildning ved at løse ligningen
Dette kan gøres ved reduktion af afbildningsmatricen:
G.rref()
Heraf aflæser vi kernen til
Dette stemmer med dimensionssætningen, der siger, at
En anden måde at vise dette på, er
G.gauss_jordan_solve(Matrix([0,0,0,0]))
Kontrol: Dette giver os den samme vektor, som hvis vi havde benyttet den direkte kommando:
G.nullspace()
Eksempel 4 - Bestem billedrummet#
Vi ved fra den reducerede matrix ovenfor, at \(\rho(\mathbf G) = \text{dim}(\boldsymbol g(\mathbb{R}^3)) = 2\). Derfor skal en basis for \(\boldsymbol g(\mathbb{R}^3)\) - det vil sige en basis for billedrummet, \(\operatorname{image}\boldsymbol g\) - bestå af to lineært uafhængige vektorer. Som vi ved fra kursuslærebogen kan disse vektorer vælges blandt søjlerne i \(\mathbf G\).
Fra resultatet af G.rref() ovenfor, hvilket vi gentager her for overblikkets skyld:
G.rref()
ser vi, at de første to søjler i \(\mathbf G\) er lineært uafhængige, da det er her, vi finder pivoterne. Derfor tager vi de første to søjler ud af \(\mathbf G\), og disse udgør en basis for billedrummet:
G
G.col(0), G.col(1)
Den indbyggede SymPy-kommando kan også benyttes her:
G.columnspace()
Denne SymPy-kommando kan godt returnere andre vektorer end dem, vi valgte fra \(\mathbf G\) herover, men uanset hvad vil de stadig udspænde samme rum!
Eksempel 5 - Undersøg, om en vektor tilhører billedrummet#
Hvis en given vektor \(\mathbf b\) tilhører billedrummet, dvs. \(\mathbf b \in \boldsymbol g(\mathbb{R}^3)\), må der eksistere en vektor \(\mathbf x \in \mathbb{R}^3\), således at \(\boldsymbol g(\mathbf x) = \mathbf b\). For at finde ud af, om en sådan vektor \(\mathbf x\) eksisterer, skal vi løse:
Vi får nu givet en vektor \(\mathbf b_1\):
b1 = Matrix([1,2,1,-4])
Tilhører den billedet af \(\boldsymbol g\)?
T1 = Matrix.hstack(G,b1)
T1.rref()
Dette system har tydeligvis ingen løsninger, da trappeformen viser en inkonsistent ligning. Og beder vi SymPy om en løsning, får vi ganske rigtigt den tomme mængde (eller en fejl, hvis du bruger G.gauss_jordan_solve(b1)):
linsolve((G,b1))
Altså tilhører \(\mathbf b_1\) ikke billedet af \(\boldsymbol g\).
Vi får nu givet en ny vektor \(\mathbf b_2\):
b2 = Matrix([3,0,-3,15])
Tilhører denne vektor billedet af \(\boldsymbol g\)?
T2 = Matrix.hstack(G,b2)
T2.rref()
Ja! Systemet har løsninger, så \(\mathbf b_2\) tilhører billedet, og vi kan skrive \(\mathbf b_2\in \boldsymbol g(\mathbb{R}^3)\). Vi kan endda se, at \(\mathbf b_2\) har koordinaterne \((-6,3)\) med hensyn til den ordnede basis \(((1,2,1,-3),(3,4,1,-1))\) for \(\boldsymbol g(\mathbb{R}^3)\). Vi kan også se de uendeligt mange vektorer, der afbildes i \(\mathbf b_2\). Disse er på formen
Nu kan vi benytte .gauss_jordan_solve() uden fejlmeldinger (eller blot linsolve som tidligere):
G.gauss_jordan_solve(b2), linsolve((G,b2))
Ændring af afbildningsmatrix via basisskifte#
Her følger to eksempler på, hvordan vi kan ændre matrixrepræsentationen af en afbildning (altså, hvordan vi ændrer afbildningsmatricen) ved at skifte basis.
Eksempel 1 - Ændr afbildningsmatrix fra given basis til standardbasis#
En ordnet basis \(\gamma=((5,3),(-2,-1))\) er givet. M.h.t. denne er den lineære afbildning \(\boldsymbol M: \mathbb{R}^2\to \mathbb{R}^2\) givet ved afbildningsmatricen
yMy = Matrix([[1,2],[3,4]])
yMy
Hvad er matrixrepræsentationen af \(\boldsymbol M\) med hensyn til den ordnede standardbasis?
Vi kan betegne den ordnede standardbasis for \(\mathbb{R}^2\) ved \(e = ((1,0),(0,1))\), og det, vi ønsker at finde, er således \(_e[\boldsymbol M]_e\). For at gøre det har vi brug for to basisskiftematricer; en der ændrer fra \(\gamma\)-basis til \(e\)-basis, og en anden der ændrer fra \(e\) til \(\gamma\).
Basisskiftematricen, der ændrer fra \(\gamma\)-basis til \(e\)-basis, betegnes ved \(_e[\text{id}_V]_\gamma\). Vi kan skrive denne matrix op med det samme, da den simpelthen består af de to \(\gamma\)-basisvektorer som søjler:
eIy = Matrix([[5,-2],[3,-1]])
eIy
Så
Den basisskiftematrix, der skifter fra \(e\)-basis til \(\gamma\)-basen, er den inverse af ovenstående (se kursuslærebogen for detaljerne):
yIe = eIy**-1
yIe
Så
Vi har nu alle komponenterne klar til at kunne finde \(_e[\boldsymbol M]_e\) som følger:
eMe = eIy * yMy * yIe
eMe
Så
Eksempel 2 - Ændr afbildningsmatrix fra standardbasis til en anden basis#
Vi vil her genbruge den ordnede \(\gamma\)-basis fra det foregående. Med hensyn til den ordnede standardbasis er den lineære afbildning \(\boldsymbol K:\mathbb{R}^2\to \mathbb{R}^2\) givet ved afbildningsmatricen:
eKe = Matrix([[-2,0],[1,3]])
Hvad er matrixrepræsentationen med hensyn til \(\gamma\)-basen?
Det, vi skal finde, er \(_\gamma[\boldsymbol K]_\gamma\). Da vi fra det tidligere eksempel allerede kender basisskiftematricerne mellem \(\gamma\)- og \(e\)-baserne, har vi alle komponenterne klar til at finde afbildningsmatricen for \(\boldsymbol K\) med hensyn til \(\gamma\)-basis:
yKy = yIe*eKe*eIy
yKy