3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
錯(cuò)誤的問題陳述
看來你沒有解決正確的問題。正如您所說,它不能像您使用的方法一樣工作:
計(jì)算已確定的滿秩線性矩陣方程 ax = b 的“精確”解 x。
如文檔中所定義。
將您的問題寫為 是很誘人的Ax = b
。但是,您需要一個(gè) 3x3 矩陣來測試向量b=[0,0,0]T
,并找到一個(gè)非平凡的解決方案x
來聲明所有三個(gè)向量都不是線性獨(dú)立的。但這意味著矩陣沒有滿秩。
在您的代碼中,以下表達(dá)式無法滿足函數(shù)簽名:
np.linalg.solve(np.array([v1]), v2)
并引發(fā)以下錯(cuò)誤:
LinAlgError: Last 2 dimensions of the array must be square
就矩陣形狀而言,有效的調(diào)用numpy.linalg.solve
是:
np.linalg.solve(np.array([v1, v2, v3]).T, np.zeros(v1.size))
但在兩個(gè)方面失敗了:
LinAlgError: Singular matrix
首先因?yàn)榫仃嚥皇菨M秩的,因此不可逆。其次,這并不能解決兩個(gè)向量的問題。
通用解決方案
import numpy as np from scipy import linalg
相反,您想要解決有關(guān)線性獨(dú)立性的更普遍的問題,可以通過評(píng)估的秩[v1, v2]T
來解決:
在線性代數(shù)中,矩陣 A 的秩是由其列生成(或跨越)的向量空間的維數(shù)。這對(duì)應(yīng)于 A 的線性獨(dú)立列的最大數(shù)量。
對(duì)于 numpy,您可以使用numpy.linalg.matrix_rank來執(zhí)行此操作:
np.linalg.matrix_rank(np.array([v1, v2]).T) # Missing dimension: 1 np.linalg.matrix_rank(np.array([v1, v3]).T) # Full rank: 2
此方法對(duì)執(zhí)行SVD 分解計(jì)算出的空奇異值進(jìn)行計(jì)數(shù),該算法的實(shí)現(xiàn)由scipy.linalg.svd提供:
U, s, V = linalg.svd(np.array([v1, v2]).T) # s = [11.18033989, 0.] U, s, V = linalg.svd(np.array([v1, v3]).T) # s = [5.55992016, 2.84381571]
或者對(duì)其執(zhí)行高斯消元法(假設(shè)使用LU 分解)并檢查結(jié)果。scipy 包提供了scipy.linalg.lu:
p, l, u = linalg.lu(np.array([v1, v2]).T) # Null pivot: u = [[5., -10.], [0., 0.]] p, l, u = linalg.lu(np.array([v1, v3]).T) # Full rank: u = [[5., 2.], [0., 3.]]
所有這些方法都會(huì)評(píng)估矩陣列所跨越的向量空間的維數(shù)。如果矩陣是滿秩的,那么你的向量是線性獨(dú)立的。如果不是,則至少有兩個(gè)相關(guān)向量。
那么解決您的問題的一個(gè)簡單方法是:
def indep1(*args):
A = np.array(args).T
return np.linalg.matrix_rank(A) == len(args)
indep1(v1, v2) # False
indep1(v1, v3) # True
indep1(v1, v2, v3) # False
indep1(v1, np.zeros(v1.size)) # False
特例
如果您停留在 3D 向量空間中并且只需要檢查兩個(gè)向量,您還可以利用numpy.cross提供的叉積:
np.cross(v1, v2) # Colinear: [0, 0, 0] np.cross(v1, v3) # Not colinear: [15, 0, -5]
更具體的替代方案是:
def indep2(a, b):
return not np.allclose(np.cross(a, b), 0.)
indep2(v1, v2) # False
indep2(v1, v3) # True
# indep2(v1, v2, v3) # TypeError
indep2(v1, np.zeros(v1.size)) # False
它們是一個(gè)恒定的系統(tǒng)
正如 所建議的@MadPhycist,我們還可以評(píng)估共線向量共享標(biāo)量比例因子(例如 )的事實(shí)a = k*b,那么測試它的非防彈方法是檢查坐標(biāo)之比是否恒定:
def indep3(a, b):
r = a/b # Ratio of coordinates
q = np.isfinite(r) # Filter bad ratio (zero division)
return not np.allclose(r[q], r[q][0]) # Assess all ratio are equal
indep3(v1, v2) # False
indep3(v1, v3) # True
# indep3(v3, np.zeros(v1.size)) # IndexError
如果它比以前的解決方案需要更少的計(jì)算并且不依賴于高水平的線性代數(shù),那么它需要處理特定的情況,并且建議的實(shí)現(xiàn)是臭的(不要使用它)。
格拉米安法
可以安全地對(duì)兩個(gè)向量實(shí)現(xiàn)公開的方法,@dmuir如下所示:
def indep4(a, b):
return not np.isclose(np.dot(a,b)*np.dot(b,a), np.dot(a,a)*np.dot(b,b))
indep4(v1, v2) # False
indep4(v1, v3) # True
indep4(v3, v4) # False
indep4(v3, np.zeros(v1.size)) # False

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
對(duì)兩個(gè)向量的簡單測試是:A 和 B 是線性相關(guān)的 iff
(A.B)*(A.B) == (A.A) * (B.B)
在哪里 。是點(diǎn)積。
當(dāng)然,在使用浮點(diǎn)運(yùn)算時(shí),您必須小心測試相等性。
這可以推廣到更多的向量。V[1] .. V[n] 是線性相關(guān)的當(dāng)且僅當(dāng)它們的 Gramian G 是奇異的,其中
G[i,j] = V[i].V[j] (i,j=1..N)

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
為什么不使用更簡單的算法:
def is_linearly_dependent(a, b):
non_zero = b != 0
if len(np.unique(a[non_zero]/b[non_zero])) > 1:
return False
else:
zero = np.logical_not(b)
if np.any(a[zero] != 0):
return False
return True
添加回答
舉報(bào)