SymPy-demo 3: Lineære afbildninger#

Demo af Christian Mikkelstrup, Hans Henrik Hermansen, Karl Johan Måstrup Kristiansen og Magnus Troen. Revideret 05-11-24 af shsp.

from sympy import *
init_printing()

Kerne og søjlerum#

Lad

\[\begin{split} \mathbf{B} = \left[\begin{matrix}5 & 4 i & 3 + 5 i\\3 i & 2 & -3 + 4 i\\3 & 8 & 3 + 7 i\end{matrix}\right]. \end{split}\]
B = Matrix([[5, 4*I, 3+5*I], [3*I, 2, -3+4*I],[3, 8, 3+7*I]])
B
\[\begin{split}\displaystyle \left[\begin{matrix}5 & 4 i & 3 + 5 i\\3 i & 2 & -3 + 4 i\\3 & 8 & 3 + 7 i\end{matrix}\right]\end{split}\]

Vi finder kernen \(\operatorname{ker}\mathbf B\) med følgende kommando:

B.nullspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}-1 - i\\- \frac{i}{2}\\1\end{matrix}\right]\right]\end{split}\]

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()
\[\begin{split}\displaystyle \left( \left[ \left[\begin{matrix}5\\3 i\\3\end{matrix}\right], \ \left[\begin{matrix}4 i\\2\\8\end{matrix}\right]\right], \ \left[ \left[\begin{matrix}5 & 4 i & 3 + 5 i\end{matrix}\right], \ \left[\begin{matrix}0 & 22 & 11 i\end{matrix}\right]\right]\right)\end{split}\]

Vi ser af outputtet, at

\[\begin{split} \operatorname{colsp}\mathbf B = \operatorname{span}\left(\left[\begin{matrix}5\\3 i\\3\end{matrix}\right], \ \left[\begin{matrix}4 i\\2\\8\end{matrix}\right]\right) \end{split}\]
\[ \operatorname{rowsp}\mathbf B = \operatorname{span}\left( \left[\begin{matrix}5 & 4 i & 3 + 5 i\end{matrix}\right], \ \left[\begin{matrix}0 & 22 & 11 i\end{matrix}\right] \right). \]

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{colsp}\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

\[ \boldsymbol f(x_1,x_2)=(2\,x_1+x_2,\;3\,x_1+2\,x_2,\;x_1+x_2,\;2\,x_1+3\,x_2). \]
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\) and \(\mathbf v\) fra definitionsmængden samt en vilkårlig konstant \(k\) fra tallegemet opfylder følgende to krav:

\[\begin{split} \begin{aligned} & \boldsymbol f(\mathbf u+\mathbf v)=\boldsymbol f(\mathbf u)+\boldsymbol f(\mathbf v)\\ & \boldsymbol f(k\,\mathbf u)=k\,\boldsymbol f(\mathbf u). \end{aligned} \end{split}\]

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
\[\begin{split}\displaystyle \left( \left[\begin{matrix}u_{1}\\u_{2}\end{matrix}\right], \ \left[\begin{matrix}v_{1}\\v_{2}\end{matrix}\right], \ k\right)\end{split}\]

Prøv at indsætte disse vilkårlige vektorer i afbildningen for at se, at alt er defineret korrekt:

f(u), f(v)
\[\begin{split}\displaystyle \left( \left[\begin{matrix}2 u_{1} + u_{2}\\3 u_{1} + 2 u_{2}\\u_{1} + u_{2}\\2 u_{1} + 3 u_{2}\end{matrix}\right], \ \left[\begin{matrix}2 v_{1} + v_{2}\\3 v_{1} + 2 v_{2}\\v_{1} + v_{2}\\2 v_{1} + 3 v_{2}\end{matrix}\right]\right)\end{split}\]

Lad os nu tjekke linearitetskravene:

# Linearitetskrav nr. 1
f(u+v) - (f(u)+f(v))
\[\begin{split}\displaystyle \left[\begin{matrix}0\\0\\0\\0\end{matrix}\right]\end{split}\]
# Linearitetskrav nr. 2
simplify(f(k*u)-k*f(u))
\[\begin{split}\displaystyle \left[\begin{matrix}0\\0\\0\\0\end{matrix}\right]\end{split}\]

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:

\[ \boldsymbol f(\mathbf x) = \mathbf F\,\mathbf x \]

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 – i korte træk: hvis en afbildningsmatrix eksisterer, så er afbildningen lineær.

Vi indser, at \(\boldsymbol f\) har følgende matrixrepræsentation (med hensyn til standardbaserne for \(\mathbb{R}^2\) og \(\mathbb{R}^4\)):

\[\begin{split} \begin{aligned} \boldsymbol f(\mathbf x) = & \mathbf F\,\mathbf x\\ \begin{bmatrix}2\,x_1+x_2\\ 3\,x_1+2\,x_2\\ x_1+x_2\\ 2\,x_1+3\,x_2\end{bmatrix} = & \begin{bmatrix}2&1\\3&2\\1&1\\2&3\end{bmatrix} \begin{bmatrix}x_1\\x_2\end{bmatrix}. \end{aligned} \end{split}\]

Så vi har fundet en matrix \(\mathbf F \in \mathbb{R}^{4\times 2}\) til at være:

\[\begin{split} \mathbf F = \begin{bmatrix}2&1\\3&2\\1&1\\2&3\end{bmatrix}, \end{split}\]

hvilket er en matrixrepræsentation (en afbildningsmatrix) af afbildningen med hensyn til standardbasen.

Bemærk, at søjlerne er billederne af basisvektorerne fra definitionsmængden \(\mathbb R^2\), som forventet:

f([1,0]),f([0,1])
\[\begin{split}\displaystyle \left( \left[\begin{matrix}2\\3\\1\\2\end{matrix}\right], \ \left[\begin{matrix}1\\2\\1\\3\end{matrix}\right]\right)\end{split}\]

Vi gjorde alt det ovenstående manuelt, men når man anvender standardbasen, kan man automatisere processen med følgende, som 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
\[\begin{split}\displaystyle \left[\begin{matrix}2 & 1\\3 & 2\\1 & 1\\2 & 3\end{matrix}\right]\end{split}\]

Typiske scenarier for brug af afbildningsmatricen#

Vi betragter en afbildning \(\boldsymbol g:\mathbb{R}^3\to\mathbb{R}^4\), som med hensyn til standardbaserne i \(\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
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 3 & 1\\2 & 4 & 0\\1 & 1 & -1\\-3 & -1 & 5\end{matrix}\right]\end{split}\]

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, kan dette nemt gøres med en simpel matrix-vektor-multiplikation, fordi \(\boldsymbol g(\mathbf v) = \mathbf G\mathbf v\):

G*v
\[\begin{split}\displaystyle \left[\begin{matrix}0\\-6\\-6\\24\end{matrix}\right]\end{split}\]

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 igen blot udføre en simpel afbildning af vektoren:

G*u
\[\begin{split}\displaystyle \left[\begin{matrix}0\\0\\0\\0\end{matrix}\right]\end{split}\]

Altså har vi, at \(\mathbf u=(-6,3,-3)\in\operatorname{ker}\boldsymbol g\).

Eksempel 3 - Find kernen af en afbildning#

Vi ved fra teorien, at \(\mathbf x\in \operatorname{ker}\boldsymbol g\) gælder, hvis og kun hvis \(\boldsymbol g(\mathbf x)=\mathbf 0\). Så vi kan finde kernen af vores afbildning ved at løse ligningen

\[ \mathbf G\,\mathbf x=\mathbf{0}. \]

Dette kan gøres ved reduktion af afbildningsmatricen:

G.rref()
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1 & 0 & -2\\0 & 1 & 1\\0 & 0 & 0\\0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 1\right)\right)\end{split}\]

Heraf aflæser vi kernen til

\[ \mathrm{ker}\,\boldsymbol g=\text{span}\{(2,-1,1)\}. \]

Dette stemmer med dimensionssætningen, der siger, at

\[\begin{split} \begin{aligned} \text{dim}(\text{ker}\,\boldsymbol g) &= \text{dim}(\mathbb{R}^3)-\rho(\mathbf G)\\ &= 3-2 \\ &= 1. \end{aligned} \end{split}\]

En anden måde at vise dette på, er

G.gauss_jordan_solve(Matrix([0,0,0,0]))
\[\begin{split}\displaystyle \left( \left[\begin{matrix}2 \tau_{0}\\- \tau_{0}\\\tau_{0}\end{matrix}\right], \ \left[\begin{matrix}\tau_{0}\end{matrix}\right]\right)\end{split}\]

Kontrol: Dette giver os den samme vektor, som hvis vi havde benyttet den direkte kommando:

G.nullspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}2\\-1\\1\end{matrix}\right]\right]\end{split}\]

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, som vi blot kan kalde billedet, af \(\boldsymbol g\), også betegnet \(\operatorname{image}\boldsymbol g\) - bestå af to lineært uafhængige vektorer. Husk først og fremmest på, at alle søjler i \(\mathbf G\) tilhører billedet - dette bliver klart, hvis vi udregner matrixproduktet \(\mathbf G \cdot \mathbf e\) for hver basisvektor \(\mathbf e\) for \(\mathbb{R}^3\), da resultatet er en søjle i \(\mathbf G\). Så det vil være tilstrækkeligt at finde to lineært uafhængige vektorer blandt søjlerne i \(\mathbf G\).

Fra resultatet af G.rref() ovenfor, hvilket vi gentager her for overblikkets skyld:

G.columnspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}1\\2\\1\\-3\end{matrix}\right], \ \left[\begin{matrix}3\\4\\1\\-1\end{matrix}\right]\right]\end{split}\]

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
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 3 & 1\\2 & 4 & 0\\1 & 1 & -1\\-3 & -1 & 5\end{matrix}\right]\end{split}\]
G.col(0), G.col(1)
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1\\2\\1\\-3\end{matrix}\right], \ \left[\begin{matrix}3\\4\\1\\-1\end{matrix}\right]\right)\end{split}\]
\[ \operatorname{image}\boldsymbol g=\boldsymbol g(\mathbb{R}^3) = \text{span}\{(1,2,1,-3),(3,4,1,-1)\}. \]

Bemærk, at søjle 1 og 3 også kunne anvendes - generelt set kan billedet udtrykkes på uendeligt mange måder, og der er ofte adskillige muligheder for lineært uafhængige søjler at vælge imellem, når der skal udvælges en basis.

Den indbyggede SymPy-kommando kan også benyttes her:

G.columnspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}1\\2\\1\\-3\end{matrix}\right], \ \left[\begin{matrix}3\\4\\1\\-1\end{matrix}\right]\right]\end{split}\]

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#

At påstå, at en given vektor \(\mathbf b\) tilhører billedrummet, dvs. at \(\mathbf b \in \boldsymbol g(\mathbb{R}^3)\), betyder, at der må 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:

\[ \mathbf G\,\mathbf x = \mathbf b. \]

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()
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1 & 0 & -2 & 0\\0 & 1 & 1 & 0\\0 & 0 & 0 & 1\\0 & 0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 1, \ 3\right)\right)\end{split}\]

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))
../_images/af5a573380cbeab6a6267df9a9253b94d4efc0a9494f2caf3f3b926f5975b264.png

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()
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1 & 0 & -2 & -6\\0 & 1 & 1 & 3\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 1\right)\right)\end{split}\]

Ja! Systemet har løsninger, så \(\mathbf b_2\) tilhører billedet, og vi kan skrive \(\mathbf b_2\in g(\mathbb{R}^3)\). Vi kan endda se, at \(\mathbf b_2\) har koordinaterne \((-6,3)\) med hensyn til basen \(((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

\[ (-6,3,0)+t\,(2,-1,1), \;\;\;t\in\mathbb{R}. \]

Nu kan vi benytte .gauss_jordan_solve() uden fejlmeldinger (eller blot linsolve som tidligere):

G.gauss_jordan_solve(b2), linsolve((G,b2))
\[\begin{split}\displaystyle \left( \left( \left[\begin{matrix}2 \tau_{0} - 6\\3 - \tau_{0}\\\tau_{0}\end{matrix}\right], \ \left[\begin{matrix}\tau_{0}\end{matrix}\right]\right), \ \left\{\left( 2 \tau_{0} - 6, \ 3 - \tau_{0}, \ \tau_{0}\right)\right\}\right)\end{split}\]

Æ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 basis \(\gamma=((5,3),(-2,-1))\) er givet. I denne basis er den lineære afbildning \(\boldsymbol M: \mathbb{R}^2\to \mathbb{R}^2\) givet ved afbildningsmatricen

\[\begin{split} _\gamma[\boldsymbol M]_\gamma=\begin{bmatrix}1&2\\3&4\end{bmatrix}. \end{split}\]
yMy = Matrix([[1,2],[3,4]])
yMy
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2\\3 & 4\end{matrix}\right]\end{split}\]

Hvad er matrixrepræsentationen af \(\boldsymbol M\) med hensyn til standardbasen?

Vi kan betegne standardbasen 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
\[\begin{split}\displaystyle \left[\begin{matrix}5 & -2\\3 & -1\end{matrix}\right]\end{split}\]

\[\begin{split} _e[\text{id}_V]_\gamma=\begin{bmatrix}5&-2\\3&-1\end{bmatrix}. \end{split}\]

Den basisskiftematrix, der skifter fra standard \(e\)-basis til \(\gamma\)-basen, er den inverse af ovenstående (se kursuslærebogen for detaljerne):

\[ _\gamma[\text{id}_V]_e=_e[\text{id}_V]_\gamma^{-1}. \]
yIe = eIy**-1
yIe
\[\begin{split}\displaystyle \left[\begin{matrix}-1 & 2\\-3 & 5\end{matrix}\right]\end{split}\]

\[\begin{split} _\gamma[\text{id}_V]_e=\begin{bmatrix}-1&2\\-3&5\end{bmatrix}. \end{split}\]

Vi har nu alle komponenterne klar til at kunne finde \(_e[\boldsymbol M]_e\) som følger:

\[ _e[M]_e = _e[\text{id}_V]_\gamma \ _\gamma [M]_\gamma \ _\gamma [\text{id}_V]_e. \]
eMe = eIy * yMy * yIe
eMe
\[\begin{split}\displaystyle \left[\begin{matrix}-5 & 8\\-6 & 10\end{matrix}\right]\end{split}\]

\[\begin{split} _e[M]_e = \left[\begin{matrix}-5 & 8\\-6 & 10\end{matrix}\right]. \end{split}\]

Eksempel 2 - Ændr afbildningsmatrix fra standardbasis til en anden basis#

Vi vil her genbruge \(\gamma\)-basen fra det forgående. Med hensyn til standardbasen er den lineære afbildning \(\boldsymbol K:\mathbb{R}^2\to \mathbb{R}^2\) givet ved afbildningsmatricen:

\[\begin{split} _e[\boldsymbol K]_e=\begin{bmatrix}-2&0\\1&3\end{bmatrix}. \end{split}\]
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:

aKa = yIe*eKe*eIy
aKa
\[\begin{split}\displaystyle \left[\begin{matrix}38 & -14\\100 & -37\end{matrix}\right]\end{split}\]