09.基變換
本文的主要內容:不同基向量坐標軸體系之間的互相表達和計算方式.
1.重新回顧基向量
線性無關的N個N維基向量可以表達整個N維度空間.
2. 和 基的"[[-3],[-2]]"
我們默認以 為基向量的2維向量[[-3],[-2]],已經默認 往右方向增大, 以上方向增大.
3.(通過 和 表達)其他基的"[[-3],[-2]]"
我們也可以通過 和 表達其他的基向量,例如用 =[[2],[1]]和 =[[-1],[1]]來作為基向量(坐標軸),用來表示它的[[-3],[-2]]向量.
如果要通過 表示這一變換,就要通過矩陣乘法進行:
4.通過其他基表達 和 上的"[[-4],[-5]]"
下面其實就是上面那一張圖!
用 =[[2],[1]]和 =[[-1],[1]]來作為基向量(坐標軸),用來表示 上的[[-4],[-5]],就要先求逆,再進行矩陣乘法:
最後的[[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.通過其他基表達 和 上的線性變換
應用題
已知有 =[[2],[1]]和 =[[-1],[1]]作為基向量的平面,其上有 =[[-1],[-2]向量,如何得到 翻轉90°的向量(仍以 為基).
思考:
我們知道M = [[0,-1],[1,0]]可以表達 為坐標軸的圖像的逆時針90°翻轉,但是對於其他基,想表達逆時針90°翻轉就不一定能直接通過M來變換了.
解答:
先將 =[[-1],[-2]]轉為以 基向量的向量,然後再進行M = [[0,-1],[1,0]]的線性變換,最後翻轉回原來的以 為基的向量.
[[-1],[-2]]翻轉90°後的向量為
是屬於 的結構的變換,暗示數學上的一種轉移作用.
根據結合率,對於 以外的其他向量,也是一樣的線性變換,設為 .
本文參考3Blue1Brown視頻教程<線性代數的本質>而寫,配上python代碼,並進行一些修訂.
下一節內容的鏈接為:
袁傑雄:10.特徵值和特徵向量附註代碼:
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)
推薦閱讀:
※深度學習讀書筆記 第一部分 線性代數
※如何理解線性代數裡面最基本的概念
※線性代數的形象理解
※關於方陣的特徵值和特徵向量的思考
※機器學習數學:線性代數