09.基變換

本文的主要內容:不同基向量坐標軸體系之間的互相表達和計算方式.

1.重新回顧基向量

線性無關的N個N維基向量可以表達整個N維度空間.

2. vec i vec j 基的"[[-3],[-2]]"

我們默認以 vec i和vec j 為基向量的2維向量[[-3],[-2]],已經默認 vec i 往右方向增大, vec j 以上方向增大.

3.(通過vec i vec j 表達)其他基的"[[-3],[-2]]"

我們也可以通過vec i vec j 表達其他的基向量,例如用 vec {b_1} =[[2],[1]]和 vec {b_2} =[[-1],[1]]來作為基向量(坐標軸),用來表示它的[[-3],[-2]]向量.

如果要通過 vec i和vec j 表示這一變換,就要通過矩陣乘法進行:

egin {bmatrix} 2&-1\ 1&1 end {bmatrix} egin {bmatrix} -3\ -2 end {bmatrix} = egin {bmatrix} -4\ -5 end {bmatrix}

4.通過其他基表達vec i vec j 上的"[[-4],[-5]]"

下面其實就是上面那一張圖!

vec {b_1} =[[2],[1]]和 vec {b_2} =[[-1],[1]]來作為基向量(坐標軸),用來表示 vec i和vec j 上的[[-4],[-5]],就要先求逆,再進行矩陣乘法:

egin {bmatrix} 2&-1\ 1&1 end {bmatrix} egin {bmatrix} a\ b end {bmatrix} = egin {bmatrix} -4\ -5 end {bmatrix}\ \可得\ egin {bmatrix} 2&-1\ 1&1 end {bmatrix}^{-1} egin {bmatrix} 2&-1\ 1&1 end {bmatrix} egin {bmatrix} a\ b end {bmatrix} = egin {bmatrix} 2&-1\ 1&1 end {bmatrix}^{-1} egin {bmatrix} -4\ -5 end {bmatrix}\ \可得\ egin {bmatrix} a\ b end {bmatrix} = egin {bmatrix} 2&-1\ 1&1 end {bmatrix}^{-1} egin {bmatrix} -4\ -5 end {bmatrix}

最後的[[a],[b]] = [-3,-2].

因為計算比較複雜,用numpy模擬一下:

import numpy as np M = np.matrix([[2,-1],[1,1]]) V = np.matrix([[-4],[-5]]) print (M.I*V)#可得[[-3] [-2]]

5.通過其他基表達vec i vec j 上的線性變換

應用題

已知有 vec {b_1} =[[2],[1]]和 vec {b_2} =[[-1],[1]]作為基向量的平面,其上有 vec V =[[-1],[-2]向量,如何得到 vec V 翻轉90°的向量(仍以 vec {b_1}和vec {b_2} 為基).

思考:

我們知道M = [[0,-1],[1,0]]可以表達 vec i和vec j 為坐標軸的圖像的逆時針90°翻轉,但是對於其他基,想表達逆時針90°翻轉就不一定能直接通過M來變換了.

解答:

先將 vec V =[[-1],[-2]]轉為以 vec i和vec j 基向量的向量,然後再進行M = [[0,-1],[1,0]]的線性變換,最後翻轉回原來的以 vec {b_1}和vec {b_2} 為基的向量.

[[-1],[-2]]翻轉90°後的向量為

L([[-1],[-2]])=A^{-1}* M * A* [[-1],[-2]] \ =egin {bmatrix} 2&-1\ 1&1 end {bmatrix}^{-1} egin {bmatrix} 0&-1\ 1&0 end {bmatrix} egin {bmatrix} 2&-1\ 1&1 end {bmatrix} egin {bmatrix} -1\ -2 end {bmatrix}

是屬於 A^{-1}MA 的結構的變換,暗示數學上的一種轉移作用.

根據結合率,對於 vec V 以外的其他向量,也是一樣的線性變換,設為 L_M

L_M=A^{-1}* M * A \ =egin {bmatrix} 2&-1\ 1&1 end {bmatrix}^{-1} egin {bmatrix} 0&-1\ 1&0 end {bmatrix} egin {bmatrix} 2&-1\ 1&1 end {bmatrix}

本文參考3Blue1Brown視頻教程<線性代數的本質>而寫,配上python代碼,並進行一些修訂.

下一節內容的鏈接為:

袁傑雄:10.特徵值和特徵向量?

zhuanlan.zhihu.com圖標

附註代碼:

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.axisartist.axislines import SubplotZerofrom moviepy.editor import VideoClipfrom moviepy.video.io.bindings import mplfig_to_npimagefrom pylab import *plt.style.use("seaborn")def set_axis_middle(fig): ax = SubplotZero(fig, 111) fig.add_subplot(ax) for direction in ["xzero", "yzero"]: # adds arrows at the ends of each axis ax.axis[direction].set_axisline_style("-|>") # adds X and Y-axis from the origin ax.axis[direction].set_visible(True) for direction in ["left", "right", "bottom", "top"]: # hides borders ax.axis[direction].set_visible(False) ax.set_aspect(1.) #設置高寬比 ax.grid(True, zorder=0) ax.set_xlim(-6, 3) ax.set_ylim(-6, 3) return axfig = plt.figure()def draw_vector(ax,x,y,u,v,c,s="",s2=""): try: u = float(u) v = float(v) except: pass ax.quiver(x,y, u,v,angles=xy, scale_units=xy, scale=1,color = c) if s == "": plt.text(x+u/2,y+v/2,r"$[^{"+str(u)+"}_{"+str(v)+"}]$") else: plt.text(x+u/2,y+v/2,s2 + r"$vec{"+s+"}$")def update(second): b1 = np.matrix([[2],[1]]) b2 = np.matrix([[-1],[1]]) M = np.matrix([[2,-1],[1,1]]) ax = set_axis_middle(fig) draw_vector(ax,0,0,b1[0],b1[1],"r","b_1") draw_vector(ax,0,0,b2[0],b2[1],"r","b_2") v = np.matrix([[-3],[-2]]) M_v = M*v if second <= 1: pass elif second <= 2: draw_vector(ax,0,0,M_v[0][0],M_v[1][0],"y") elif second >2: rate = (second-2) if second <= 3 else 1 if second <= 3: move_rate = 0 elif 3<second <= 5: move_rate = (second-3)/2 elif 5<second: move_rate = 1 b1 = rate*float(v[0][0])*b1 b2 = rate*float(v[1][0])*b2 draw_vector(ax,0,0,M_v[0][0],M_v[1][0],"y") draw_vector(ax,0,0,b1[0],b1[1],"g","3*b_1") draw_vector(ax,move_rate*b1[0],move_rate*b1[1],b2[0],b2[1],"g","-2*b_2") return mplfig_to_npimage(fig)if 1: animation = VideoClip(update, duration = 7) animation.write_gif("test.gif", fps=7)

推薦閱讀:

深度學習讀書筆記 第一部分 線性代數
如何理解線性代數裡面最基本的概念
線性代數的形象理解
關於方陣的特徵值和特徵向量的思考
機器學習數學:線性代數

TAG:Python | 線性代數 | 可視化 |