線形写像と基底の取替えの表現行列のメモ
線形写像と基底の取替えの表現行列のメモ
線形写像(mapping)と基底の取替えの表現行列での変換を図示化してメモ.
線形写像と行列
- 線形写像$f:\mathbb{R}^{n} \to \mathbb{R}^{m}$
- $\vec{x}=x_1 \vec{e}_{1} + \cdots + x_n \vec{e}_{n}$
- $\vec{x}'=x_1' \vec{e}_{1} + \cdots + x_m' \vec{e}_{m}$
として
これらは標準基底より
$$ \vec{x'} = \mathbf{F}\vec{x} $$
例. 回転行列
45度の回転行列を考える.
$f:\mathbb{R}^{2} \to \mathbb{R}^{2}$
import scipy as sp import matplotlib.pyplot as plt %matplotlib notebook plt.figure(figsize=(4, 4)) plt.axis("equal") def f(x, y): rad = sp.deg2rad(45) mat = sp.matrix([[sp.cos(rad), -sp.sin(rad)], [sp.sin(rad), sp.cos(rad)]]) vec = mat * sp.matrix([[x],[y]]) return sp.asarray(vec).reshape(-1) # 基本ベクトル arrowprops={ 'arrowstyle': '->', "linestyle": "-" } arrow_head = { "head_width": 0.05, "length_includes_head":True, } e1 = sp.array([1, 0]) e2 = sp.array([0, 1]) plt.arrow(0, 0, *e1, color="k", **arrow_head) plt.text(e1[0]/2, e1[1]/2-.1,"$\\vec{e}_{1}$", color="k") plt.arrow(0, 0, *e2, color="k", **arrow_head) plt.text(e2[0]/2, e2[1]/2-.1,"$\\vec{e}_{2}$", color="k") # f(e1), f(e2) f_e1 = f(*e1) f_e2 = f(*e2) plt.arrow(0, 0, *f_e1, **arrow_head, linestyle="--", color="r") plt.arrow(0,0, *f_e2, color="r", **arrow_head, linestyle="--") plt.text(f_e1[0]-.2, f_e1[1]-.3, "$f(\\vec{e}_{1})$", color="r") plt.text(*f_e2, "$f(\\vec{e}_{2})$", color="r") # p(1,0) vec_x = sp.array([1,0]) plt.scatter(*vec_x, color="k") plt.text(vec_x[0] - .05, vec_x[1] - .12,"$x({},{})$".format(*vec_x), color="k") f_vec_x = f(*vec_x) plt.scatter(*f_vec_x, color="r") plt.text(f_vec_x[0] - .3, f_vec_x[1]+.05,"$x'({:.3f},{:.3f})$".format(*f_vec_x), color="r") plt.vlines(f_vec_x[0], 0, f_vec_x[0], linestyle="--") plt.hlines(f_vec_x[1], 0, f_vec_x[1], linestyle="--") plt.xlim(-1.2, 1.2) plt.ylim(-1.2, 1.2) plt.xlabel("$x_{1}$") plt.ylabel("$x_{2}$") plt.grid(True) plt.tight_layout() plt.savefig("rotate.png") plt.show()
基底A,Bに関する写像fの表現行列
写像前の基底$\mathbb{A}$から写像した後に基底$\mathbb{B}$に変更する場合
線形写像$f:\mathbb{R}^{n} \to \mathbb{R}^{m}$とし,
- $\mathbb{R}^{n}$の基底$\mathcal{A} = { \vec{a}_{1}, \vec{a}_{2}, \cdots, \vec{a}_{n} }$
- $\mathbb{R}^{m}$の基底$\mathcal{B} = { \vec{b}_{1}, \vec{b}_{2}, \cdots, \vec{b}_{m} }$
とするとき, 基底$\mathcal{A}$の基底ベクトルを写像した$f(\vec{a}_{1}), \cdots , f(\vec{a}_{n})$は基底$\mathcal{B}$の線形結合で表される.
像$f(\vec{a}_{i}), (1 \leq i \leq n)$の基底$\mathcal{B}$での座標を行ベクトルとして並べた行列を, 基底$\mathcal{A}$と基底$\mathcal{B}$に関する$f$の表現行列という.
表現行列$\mathbf{F}$は,基底と線形写像とでは以下の関係にある.
表現行列の導出は,以下になる.
例
線形写像$f: \mathbb{R}^{2} \to \mathbb{R}^{3}$
- $\mathbb{R}^{2}$の基底$\mathcal{A}$
- $\mathbb{R}^{3}$の基底$\mathcal{B}$
線形写像
としたときの写像fの表現行列はどうなるか.
より,
写像先の基底を並べた行列
よって,
表現行列をpythonで導出:
import scipy as sp from scipy import linalg def f(x, y): mat = sp.matrix([[x+2*y], [-3*x], [2*x-y]]) return mat fa = sp.c_[f(1, 2), f(2,1)] print("fa:", fa) B = sp.c_[sp.matrix([[1], [0], [0]]), sp.matrix([[0], [1], [0]]), sp.matrix([[0], [0], [1]])] print("B:", B) F = linalg.inv(B) * fa F
> fa: [[ 5 4] [-3 -6] [ 0 3]] > B: [[1 0 0] [0 1 0] [0 0 1]] > matrix([[ 5., 4.], [-3., -6.], [ 0., 3.]])
基底ベクトルの可視化
import matplotlib.pyplot as plt plt.figure(figsize=(5,5)) plt.axis("equal") # 基本ベクトル arrow_head = { "head_width": 0.05, "head_width": 0.05, "length_includes_head":True, } vec_basic1 = sp.array([1, 0]) vec_basic2 = sp.array([0, 1]) plt.arrow(0, 0, *vec_basic1, color="k", **arrow_head) plt.text(vec_basic1[0]/2, vec_basic1[1]/2-.1,"$\\vec{e}_{1}$", color="k") plt.arrow(0, 0, *vec_basic2, color="k", **arrow_head) plt.text(vec_basic2[0]/2, vec_basic2[1]/2-.1,"$\\vec{e}_{2}$", color="k") # basis vec_a1 = sp.array([1, 2]) vec_a2 = sp.array([2, 1]) plt.arrow(0, 0, *vec_a1, color="r", **arrow_head) plt.text(vec_a1[0]/2, vec_a1[1]/2-.1,"$\\vec{a}_{1}$", color="r") plt.arrow(0, 0, *vec_a2, color="b", **arrow_head) plt.text(vec_a2[0]/2, vec_a2[1]/2-.1,"$\\vec{a}_{2}$", color="b") plt.xlim(-.2, 2.2) plt.ylim(-.2, 2.2) plt.xlabel("x") plt.ylabel("y") plt.grid(True) plt.show()
表現行列と座標
線形写像$f: \mathbb{R}^{n} \to \mathbb{R}^{m}$ で, $\vec{y}=f(\vec{x})$とし,$\mathbb{R}^{n}, \mathbb{R}^{m}$の基底をそれぞれ
とする.
基底$\mathcal{A}, \mathcal{B}$に関する$f$の表現行列を$\mathbf{F}$とし, 基底$\mathcal{A}$に関する$\vec{x}$の座標, 基底$\mathcal{B}$に関する$\vec{y}$の座標をそれぞれ
つまり,$\vec{x} \in \mathbb{R}^{n}, \vec{y} \in \mathbb{R}^{m}$が成立.
基底$\mathcal{B}$に関する$\vec{y}$の座標, 基底$\mathcal{A}$に関する$\vec{x}$の座標と表現行列には次が成り立つ.
proof:
また,
上式と下式は等価より
参考: 【線形代数】線形変換の表現行列と基底の変換行列 - ヨッシーの日記
例
2つの基底
基底$\mathcal{A},\mathcal{B}$に関するfの表現行列は,
より,
標準基底から基底$\mathcal{A}$で表す. これは後述する基底の取り替えでも可能.
import matplotlib.pyplot as plt plt.figure(figsize=(4,4)) plt.axis("equal") def f(x, y): return sp.array([x+y,x-y]) # 基底 arrow_head = { "head_width": 0.05, "head_width": 0.05, "length_includes_head":True, } def vec_R(x, y): vec_a1 = sp.array([1, 1]) vec_a2 = sp.array([-1, 1]) return x * vec_a1 + y * vec_a2 # basis vec_a1 = sp.array([1, 1]) vec_a2 = sp.array([-1, 1]) plt.arrow(0, 0, *vec_a1, color="r", **arrow_head, linestyle="--") plt.text(vec_a1[0]/2, vec_a1[1]/2-.2,"$\\vec{a}_{1}$", color="r") plt.arrow(0, 0, *vec_a2, color="r", **arrow_head, linestyle="--") plt.text(vec_a2[0]/2, vec_a2[1]/2-.3,"$\\vec{a}_{2}$", color="r") # f() f() f_a1 = f(*vec_a1) f_a2 = f(*vec_a2) plt.arrow(0, 0, *f_a1, color="b", **arrow_head, linestyle="-") plt.arrow(0, 0, *f_a2, color="b", **arrow_head, linestyle="-") plt.text(*f_a1-0.3,"$f(\\vec{a}_{1})$", color="b") plt.text(f_a2[0]-0.4,f_a2[1],"$f(\\vec{a}_{2})$", color="b") # vec_x = sp.array([1, 0]) plt.scatter(*vec_R(*vec_x), color="r") plt.text(*vec_R(*vec_x),"$({},{})".format(*vec_x)+"_{\mathcal{A}}$", color="r") plt.text(*(vec_R(*vec_x)+0.25),"$=({}, {})".format(*vec_R(*vec_x))+"_{\mathcal{B}}$", color="k") # F fa = sp.c_[f(1, 1), f(-1, 1)] vec_a_mat = sp.c_[vec_a1,vec_a2] F = linalg.inv(vec_a_mat).dot(fa) f_vec_x = sp.asarray(F.dot(vec_x)).reshape(-1) plt.scatter(*vec_R(*f_vec_x), color="b") # plt.text(*vec_R(*f_vec_x),"$({}, {})_{\mathcal{A}}$", color="r") plt.text(*(vec_R(*f_vec_x)-0.5),"$({}, {})".format(*f_vec_x)+"_{\mathcal{A}}$", color="b") plt.text(*(vec_R(*f_vec_x)-.8),"=$({}, {})".format(*vec_R(*f_vec_x))+"_{\mathcal{B}}$", color="k") plt.xlim(-2.2, 2.2) plt.ylim(-2.2, 2.2) plt.xlabel("x") plt.ylabel("y") plt.grid(True) plt.show()
合成写像と表現行列
以下2つの線形写像を考える.
2つのベクトル
として,$g \circ f$の合成写像を考える.
合成写像の表現行列を$\mathbf{G}'$とすると以下が成立する.
$\vec{x}$を合成写像して展開する.
$g\circ f(\vec{x})$を$f(\vec{x})=\vec{y}$を利用して展開していく.
よって,両式を比較して
$$ \mathbf{G}' = \mathbf{G}\mathbf{F} $$
基底の取替え(線形変換を恒等変換とし基底を変更に相当)
$\mathbb{R}^{n}$の2組の基底
- $\mathcal{A} = { \vec{a}_{1}, \vec{a}_{2}, \cdots, \vec{a}_{n} }$
- $\mathcal{B} = { \vec{b}_{1}, \vec{b}_{2}, \cdots, \vec{b}_{n} }$
とするとき,基底$\mathcal{B}$は基底$\mathcal{A}$の線形結合で表される.
基底$\mathcal{A}$での座標を行ベクトルとして並べた行列を, 基底$\mathcal{A}$から基底$\mathcal{B}$への基底の取り替え行列という.
基底$\mathcal{B}, \mathcal{A}$に関する恒等変換の表現行列と同値である.
基底の取替え行列は,基底と以下の関係にある.
導出は,
基底の取替え行列と線形写像の表現行列
線形写像$f:\mathbb{R}^{n} \to \mathbb{R}^{m}$ とし,各基底を
- $\mathbb{R}^{n}$の基底$\mathcal{A} = { \vec{a}_{1}, \cdots ,\vec{a}_{n} }, \mathcal{B} = { \vec{b}_{1}, \cdots ,\vec{b}_{n} }$
- $\mathbb{R}^{m}$の基底$\mathcal{C} = { \vec{c}_{1}, \cdots ,\vec{c}_{m} }, \mathcal{D} = { \vec{d}_{1}, \cdots ,\vec{d}_{m} }$
線形写像$f: \mathbb{R}^{n}\to \mathbb{R}^{m}$とし,
- 基底$\mathcal{A}, \mathcal{C}$に関するfの表現行列$\mathbf{F}$
基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$
基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列)
- 基底$\mathcal{C}$から$\mathcal{D}$への取り替え行列$\mathbf{Q}$ (基底$ \mathcal{D},\mathcal{C}$に関する恒等変換idの表現行列)
$$ \require{AMScd} \begin{CD} \mathcal{A} @<{id_n: \mathbf{P}}<< \mathcal{B} \\ @V{f: \mathbf{F}}VV {} @VV{f: \mathbf{G}}V \\ \mathcal{C} @<<{id_{m}: \mathbf{Q}}< \mathcal{D} \end{CD} $$
基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$を他の行列で表すと, 表現行列$\mathbf{G}$は以下の関係が成り立つ.
任意のベクトル$\vec{x} \in \mathbb{R}^{n}$とし,基底で次のような座標で表せるとする.
基底Bで表した$\vec{x}$の$f(\vec{x})$を$\mathcal{D}$で表すと,
基底Aで表した$\vec{x}$の$f(\vec{x})$を$\mathcal{D}$で表すと,
基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列) より,座標は,
から
より,
より,
よって,
例
線形写像$f:\mathbb{R}^{2} \to \mathbb{R}^{3}$ とし,各基底を
- $\mathbb{R}^{2}$の基底$\mathcal{A} $
- $\mathbb{R}^{2}$の基底$\mathcal{B}$
- $\mathbb{R}^{3}$の基底$\mathcal{C}$
- $\mathbb{R}^{3}$の基底$\mathcal{D}$
とする.
線形写像$f: \mathbb{R}^{n}\to \mathbb{R}^{m}$とし,
$$ \require{AMScd} \begin{CD} \mathcal{A} @<{id_n: \mathbf{P}}<< \mathcal{B} \\ @V{f: \mathbf{F}}VV {} @VV{f: \mathbf{G}}V\\ \mathcal{C} @<<{id_{m}: \mathbf{Q}}< \mathcal{D} \end{CD} $$
各表現行列を
- 基底$\mathcal{A}, \mathcal{C}$に関するfの表現行列$\mathbf{F}$
基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$
基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列)
- 基底$\mathcal{C}$から$\mathcal{D}$への取り替え行列$\mathbf{Q}$ (基底$ \mathcal{D},\mathcal{C}$に関する恒等変換idの表現行列)
とする.
- 基底$\mathcal{A}, \mathcal{C}$に関するfの表現行列$\mathbf{F}$を求める.
import scipy as sp from scipy import linalg def f(x, y): rad = sp.deg2rad(45) mat = sp.matrix([[sp.cos(rad), -sp.sin(rad)], [sp.sin(rad), sp.cos(rad)], [1, 1] ]) vec = mat.dot(sp.array([x,y])) return sp.asarray(vec).reshape(-1) vec_a1 = sp.array([1, 0]) vec_a2 = sp.array([0, 1]) vec_c1 = sp.array([1, 1, 1]) vec_c2 = sp.array([-1, 1, 1]) vec_c3 = sp.array([1, -1, 1]) C = sp.c_[vec_c1, vec_c2, vec_c3] C print(linalg.inv(C)) fa = sp.matrix(sp.c_[f(*vec_a1), f(*vec_a2)]) fa F = linalg.inv(C).dot(fa) F
> matrix([[0.70710678, 0. ], [0.14644661, 0.85355339], [0.14644661, 0.14644661]])
基底$\mathcal{A}$から$ \mathcal{B}$への取り替え行列$\mathbf{P}$ (基底$ \mathcal{B},\mathcal{A}$に関する恒等変換idの表現行列)を求める.
基底$\mathcal{C}$から$\mathcal{D}$への取り替え行列$\mathbf{Q}$ (基底$ \mathcal{D},\mathcal{C}$に関する恒等変換idの表現行列)を求める.
import scipy as sp from scipy import linalg vec_c1 = sp.array([1, 1, 1]) vec_c2 = sp.array([-1, 1, 1]) vec_c3 = sp.array([1, -1, 1]) C = sp.c_[vec_c1, vec_c2, vec_c3] Q = linalg.inv(C) Q
> array([[ 0.5, 0.5, -0. ], [-0.5, 0. , 0.5], [ 0. , -0.5, 0.5]])
基底$\mathcal{B}, \mathcal{D}$に関するfの表現行列$\mathbf{G}$を求める
vec_b1 = sp.array([1, 1]) vec_b2 = sp.array([-1, 1]) b_mat = sp.c_[f(*vec_b1), f(*vec_b2)] b_mat
array([[ 0. , -1.41421356], [ 1.41421356, 0. ], [ 2. , 0. ]])
P = sp.matrix(sp.c_[vec_b1, vec_b2]) G = linalg.inv(Q) * F * P G
matrix([[ 2.22044605e-16, -1.41421356e+00], [ 1.41421356e+00, 0.00000000e+00], [ 2.00000000e+00, 0.00000000e+00]])
各基底ベクトルを可視化する.
# annoate https://matplotlib.org/3.1.1/tutorials/text/annotations.html import scipy as sp from scipy import linalg from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import import matplotlib.pyplot as plt %matplotlib notebook # project def f(x, y): return sp.array([x * sp.cos(sp.deg2rad(45)) - y * sp.sin(sp.deg2rad(45)), x * sp.sin(sp.deg2rad(45)) + y * sp.cos(sp.deg2rad(45)), x+y]) arrowprops={'arrowstyle': '->', "linestyle": "--" } projectprops = { 'arrowstyle': '-|>' } def arrow_dotted(ax, dxdy, xy=(0, 0), color=None): ax.annotate('', xy=dxdy, xytext=xy, arrowprops={'arrowstyle': '->', "linestyle": "--", "color": color}) def subplot_after(ax, xlim, ylim, title=""): ax.set_aspect('equal') ax.grid(True) ax.set_xlim(*xlim) ax.set_ylim(*ylim) ax.set_title(title) # Set up a figure twice as tall as it is wide fig = plt.figure(figsize=(6, 6)) plt.subplots_adjust(wspace=0.6, hspace=0.6) # fig.suptitle('A tale of 2 subplots') # A ax = fig.add_subplot(2, 2, 1) vec_a1 = sp.array([1, 0]) vec_a2 = sp.array([0, 1]) vec_a_mat = sp.matrix(sp.c_[vec_a1, vec_a2]) ax.quiver(*[0, 0], *vec_a1, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="k") ax.quiver(*[0, 0], *vec_a2, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="k") ax.text(*(vec_a1/2) - .15,"$\\vec{a}_{1}$", color="k") ax.text(*(vec_a2/2) - .15,"$\\vec{a}_{2}$", color="k") # (1, 0)= 1e1 + 0e2 in R^2の座標 vec_x = sp.array([1, 0]) ax.scatter(*vec_x, color="k") ax.text(*vec_x, "$({},{})".format(*vec_x) + "_{\mathcal{A}}$", color="k") # annotate ax.annotate("$f: \mathbf{F}$", xytext=(0.5, -.35), xy=(0.5, -.5), textcoords="axes fraction", xycoords="axes fraction", va="bottom", ha="center", bbox=dict(boxstyle="round", fc="w"), annotation_clip=False, arrowprops=dict(arrowstyle="->")) subplot_after(ax, xlim=(-.2, 1.2), ylim=(-.2, 1.2), title="") ax.set_title("$\mathcal{A}$", y=-.25) # B ax = fig.add_subplot(2, 2, 2) vec_b1 = sp.array([1, 1]) vec_b2 = sp.array([-1, 1]) vec_b_mat = sp.matrix(sp.c_[vec_b1, vec_b2]) ax.quiver(*[0, 0], *vec_b1, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="r") ax.quiver(*[0, 0], *vec_b2, angles = 'xy', scale_units = 'xy', scale = 1, width=.02, color="r") ax.text(vec_b1[0], vec_b1[1]-.15, "$\\vec{b}_{1}$", color="r") ax.text(vec_b2[0], vec_b2[1]-.4, "$\\vec{b}_{2}$", color="r") arrow_dotted(ax, dxdy=vec_a1) arrow_dotted(ax, dxdy=vec_a2) ax.scatter(*vec_x, color="k") # convert: a_coord = P b_coord P = linalg.inv(vec_a_mat) * vec_b_mat b_coord = linalg.inv(P).dot(vec_x) ax.text(*vec_x-.4, "$({},{})".format(*b_coord) + "_{\mathcal{B}}$", color="r") # annotate ax.annotate("$id_{2}:\mathbf{P}$", xytext=(-.2, -.2), xy=(-.5, -.2), textcoords="axes fraction", xycoords="axes fraction", va="center", ha="center", bbox=dict(boxstyle="round", fc="w"), annotation_clip=False, arrowprops=dict(arrowstyle="->")) ax.annotate("$f: \mathbf{G}$", xytext=(0.5, -.35), xy=(0.5, -.5), textcoords="axes fraction", xycoords="axes fraction", va="bottom", ha="center", bbox=dict(boxstyle="round", fc="w"), annotation_clip=False, arrowprops=dict(arrowstyle="->")) subplot_after(ax, xlim=(-1.2, 1.2), ylim=(-1.2, 1.2), title="") ax.set_title("$\mathcal{B}$", y=-.25) # C ax = fig.add_subplot(2, 2, 3, projection='3d') vec_c1 = sp.array([1, 1, 1]) vec_c2 = sp.array([-1, 1, 1]) vec_c3 = sp.array([1, -1, 1]) ax.text(*vec_c1+.05, "$\\vec{c}_{1}$", color="b") ax.text(*vec_c2-.4, "$\\vec{c}_{2}$", color="b") ax.text(*vec_c3-.4, "$\\vec{c}_{3}$", color="b") vec_c_mat = sp.matrix(sp.c_[vec_c1, vec_c2, vec_c3]) ax.quiver(*[0, 0, 0], *vec_c1, length=1, color="b") ax.quiver(*[0, 0, 0], *vec_c2, length=1, color="b") ax.quiver(*[0, 0, 0], *vec_c3, length=1, color="b") ax.scatter3D(*sp.asarray(sp.r_[vec_x, 0]).reshape(-1), color="k") # f(a1)f(a2) fa = sp.matrix(sp.c_[f(*vec_a1), f(*vec_a2)]) ax.quiver(*[0,0,0], *sp.asarray(fa[:, 0]).reshape(-1), linestyles="--", color="k") ax.quiver(*[0,0,0], *sp.asarray(fa[:, 1]).reshape(-1), linestyles="--", color="k") ax.text(*(sp.asarray(fa[:, 0]).reshape(-1)/2-.2), "$f(\\vec{a}_{1})$", color="k") ax.text(*(sp.asarray(fa[:, 1]).reshape(-1)/2), "$f(\\vec{a}_{2})$", color="k") f_vec_x = sp.asarray(fa.dot(vec_x)).reshape(-1) F = linalg.inv(vec_c_mat) * fa print("F:", F) c_coord = sp.asarray(F.dot(vec_x)).reshape(-1) print("c:", c_coord) ax.scatter3D(*f_vec_x, color="b") ax.text(f_vec_x[0]-.8, f_vec_x[1], f_vec_x[2] + .2, "$({:.3f},{:.3f}, {:.3f})".format(*c_coord) + "_{\mathcal{C}}$", color="b") ax.set_title("$\mathcal{C}$") ax.set_xlabel("x") ax.set_ylabel("y") ax.set_zlabel("z") ax.set_xlim(-1.2, 1.2) ax.set_ylim(-1.2, 1.2) ax.set_zlim(-1.2, 1.2) # D ax = fig.add_subplot(2, 2, 4, projection='3d') ax.scatter3D(*sp.asarray(sp.r_[vec_x, 0]).reshape(-1), color="k") vec_d1 = sp.array([1, 0, 0]) vec_d2 = sp.array([0, 1, 0]) vec_d3 = sp.array([0, 0, 1]) ax.text(*vec_d1+.05, "$\\vec{d}_{1}$", color="g") ax.text(*vec_d2+.05, "$\\vec{d}_{2}$", color="g") ax.text(*vec_d3+.05, "$\\vec{d}_{3}$", color="g") vec_d_mat = sp.matrix(sp.c_[vec_d1, vec_d2, vec_d3]) ax.quiver(*[0, 0, 0], *vec_d1, length=1, color="g") ax.quiver(*[0, 0, 0], *vec_d2, length=1, color="g") ax.quiver(*[0, 0, 0], *vec_d3, length=1, color="g") ax.scatter3D(*f_vec_x, color="b") # f(b1),f(b2) fb = sp.matrix(sp.c_[f(*vec_b1), f(*vec_b2)]) ax.quiver(*[0,0,0], *sp.asarray(fb[:, 0]).reshape(-1), linestyles="--", color="r") ax.quiver(*[0,0,0], *sp.asarray(fb[:, 1]).reshape(-1), linestyles="--", color="r") ax.text(*(sp.asarray(fb[:, 0]).reshape(-1)+.1), "$f(\\vec{b}_{1})$", color="r") ax.text(*(sp.asarray(fb[:, 1]).reshape(-1)-.5), "$f(\\vec{b}_{2})$", color="r") Q = linalg.inv(vec_c_mat) * vec_d_mat d_coord = linalg.inv(Q).dot(c_coord) ax.text(*(f_vec_x - .3), "$({:.2f},{:.2f}, {:.2f})".format(*d_coord) + "_{\mathcal{D}}$", color="g") # annotate ax.annotate("$id_{3}:\mathbf{Q}$", xytext=(-.2, 1.), xy=(-.5, 1.), textcoords="axes fraction", xycoords="axes fraction", va="center", ha="center", bbox=dict(boxstyle="round", fc="w"), annotation_clip=False, arrowprops=dict(arrowstyle="->")) ax.set_title("$\mathcal{D}$") ax.set_xlabel("x") ax.set_ylabel("y") ax.set_zlabel("z") ax.set_xlim(-2.2, 2.2) ax.set_ylim(-2.2, 2.2) ax.set_zlim(-2.2, 2.2) plt.savefig("mapping_basis.png") # plt.tight_layout() plt.show()
参考リンク
- 村上ら,教養の線形代数