如何求解 R 中 b=0 的线性方程组(带自由变量)
How to solve a system of linear equations with b=0 in R (with free variable)
即如何找到非平凡的解决方案。
示例:
> A = structure(c(1, -0.6, -0.4, -0.4, 0.9, -0.5, -0.6, -0.2, 0.8), .Dim = c(3L, 3L))
> A
[,x1] [,x2] [,x3]
[1,] 1.0 -0.4 -0.6
[2,] -0.6 0.9 -0.2
[3,] -0.4 -0.5 0.8
> b0
[,1]
[1,] 0
[2,] 0
[3,] 0
> solve(A,b0)
[,1]
[1,] 0
[2,] 0
[3,] 0
答案应该是:
x = x3 * (0.94,0.85,1)
或者如果你能推荐我其他可以解决此类系统的开源工具。
我正在使用线性代数书中的这个例子..矩阵减少到:
1 0 -0.94 0
0 1 -0.85 0
0 0 0 0
即x3 是自由变量。
所以参数化的解决方案是:
x = (x1,x2,x3) = (0.94 x3,0.85 x3, x3 ) = x3 * (0.94,0.85,1)
抱歉我之前没有强调,我知道零向量是平凡解,我正在寻找非平凡解。
谢谢。
你是对的我打错了(已更正):
> B = structure(c(1, -0.6, -0.4, -0.4, 0.9, -0.5, -0.6, -0.2, 0.8), .Dim = c(3L, 3L))
> B %*% c(.94,.85,1)
[,1]
[1,] -1.110223e-16
[2,] 1.000000e-03
[3,] -1.000000e-03
> B %*% c(94,85,100)
[,1]
[1,] 0.0
[2,] 0.1
[3,] -0.1
> det(B)
[1] 0
对于任何 3x3 矩阵 A
,A %*% c(0,0,0)
是 c(0,0,0)
的情况。所以 return 值为零是正确的。这是一个解决方案。
还有其他解决办法吗?承认 A x = 0
的非平凡解的矩阵称为 "singular"。方程的解称为 "Null space."
null space 由与特征值 0 关联的特征向量生成。这些由 eigen
:
给出
> eigen(B)
$values
[1] 1.350000e+00+1.32288e-01i 1.350000e+00-1.32288e-01i 1.171856e-16+0.00000e+00i
$vectors
[,1] [,2] [,3]
[1,] -0.4724556-0.25i -0.4724556+0.25i 0.5823201+0i
[2,] 0.7559289+0.00i 0.7559289+0.00i 0.5259665+0i
[3,] -0.2834734+0.25i -0.2834734-0.25i 0.6198891+0i
请注意,特征值按降序排列,最后一个(几乎)为零。所以 eigen(B)$vectors[,3]
是这里的解决方案:
> eigen(B)$vectors[,3]
[1] 0.5823201+0i 0.5259665+0i 0.6198891+0i
此值的任何倍数在 B
的空值 space 中。
另一种找到它的方法是 MASS::Null
:
> Null(t(B))
[,1]
[1,] 0.5823201
[2,] 0.5259665
[3,] 0.6198891
矩阵被转置,因为您想要 "right" null space。参见 ?Null
。
注:
> x <- Null(t(B))
> x/x[3]
[,1]
[1,] 0.9393939
[2,] 0.8484848
[3,] 1.0000000
即如何找到非平凡的解决方案。
示例:
> A = structure(c(1, -0.6, -0.4, -0.4, 0.9, -0.5, -0.6, -0.2, 0.8), .Dim = c(3L, 3L))
> A
[,x1] [,x2] [,x3]
[1,] 1.0 -0.4 -0.6
[2,] -0.6 0.9 -0.2
[3,] -0.4 -0.5 0.8
> b0
[,1]
[1,] 0
[2,] 0
[3,] 0
> solve(A,b0)
[,1]
[1,] 0
[2,] 0
[3,] 0
答案应该是:
x = x3 * (0.94,0.85,1)
或者如果你能推荐我其他可以解决此类系统的开源工具。
我正在使用线性代数书中的这个例子..矩阵减少到:
1 0 -0.94 0
0 1 -0.85 0
0 0 0 0
即x3 是自由变量。 所以参数化的解决方案是:
x = (x1,x2,x3) = (0.94 x3,0.85 x3, x3 ) = x3 * (0.94,0.85,1)
抱歉我之前没有强调,我知道零向量是平凡解,我正在寻找非平凡解。 谢谢。
你是对的我打错了(已更正):
> B = structure(c(1, -0.6, -0.4, -0.4, 0.9, -0.5, -0.6, -0.2, 0.8), .Dim = c(3L, 3L))
> B %*% c(.94,.85,1)
[,1]
[1,] -1.110223e-16
[2,] 1.000000e-03
[3,] -1.000000e-03
> B %*% c(94,85,100)
[,1]
[1,] 0.0
[2,] 0.1
[3,] -0.1
> det(B)
[1] 0
对于任何 3x3 矩阵 A
,A %*% c(0,0,0)
是 c(0,0,0)
的情况。所以 return 值为零是正确的。这是一个解决方案。
还有其他解决办法吗?承认 A x = 0
的非平凡解的矩阵称为 "singular"。方程的解称为 "Null space."
null space 由与特征值 0 关联的特征向量生成。这些由 eigen
:
> eigen(B)
$values
[1] 1.350000e+00+1.32288e-01i 1.350000e+00-1.32288e-01i 1.171856e-16+0.00000e+00i
$vectors
[,1] [,2] [,3]
[1,] -0.4724556-0.25i -0.4724556+0.25i 0.5823201+0i
[2,] 0.7559289+0.00i 0.7559289+0.00i 0.5259665+0i
[3,] -0.2834734+0.25i -0.2834734-0.25i 0.6198891+0i
请注意,特征值按降序排列,最后一个(几乎)为零。所以 eigen(B)$vectors[,3]
是这里的解决方案:
> eigen(B)$vectors[,3]
[1] 0.5823201+0i 0.5259665+0i 0.6198891+0i
此值的任何倍数在 B
的空值 space 中。
另一种找到它的方法是 MASS::Null
:
> Null(t(B))
[,1]
[1,] 0.5823201
[2,] 0.5259665
[3,] 0.6198891
矩阵被转置,因为您想要 "right" null space。参见 ?Null
。
注:
> x <- Null(t(B))
> x/x[3]
[,1]
[1,] 0.9393939
[2,] 0.8484848
[3,] 1.0000000