使用 Eigen - 如何求解具有零列的稀疏 (SPD) 线性系统?
Using Eigen - how to solve sparse (SPD) linear systems with zero columns?
(我正在使用 Eigen C++ 库)
我需要求解形式为 Ax = 0
的方程组,以便找到 x
向量(A 是稀疏的)。
编辑: A 是 SPD(对称正定)
因为某些 x
值是已知的,所以我将它们从 A 中移除以创建 Af
并放入另一个矩阵 Ac
中,其维度与 A
相同,并将 -Ac
与具有已知 x
值和所有其他位置零的向量相乘以创建向量 b
.
现在我尝试使用 SparseLU<SparseMatrix<float>>
求解 Af * x = b
,但它失败了,因为分解不起作用。我收到此错误:
THE MATRIX IS STRUCTURALLY SINGULAR ... ZERO COLUMN AT 480
为什么我的列为零是个问题?零行肯定是个问题,但零列呢?我只是改变了这样的东西:
x_1 + x_2 = 0
x_2 = 3
至
x_1 + 0 = -3
解决方案是 x_1 = -3 & x_2 = 3
,即使我将方程式放入矩阵中也会得到零列。
我该如何解决这个问题?
我的线性代数有点生疏
为了使矩阵具有唯一解,矩阵的秩需要与维数相同。如果您有一个零列,那么排名将比维度少一,并且您有一个自由变量。
如果您正在尝试解决 Ax = 0
那么它就是您所追求的 null space
,请尝试查看此 。
Why is it a problem that I have a zero column?
因为这意味着您的方程式忽略了未知数向量的一个分量,这导致解为 non-unique(被忽略的未知数的任何值都可以满足方程式)。
Because some of the x
values are known, I removed them out of A to create Af
and into another matrix Ac
with the same dimensions as A
, and multiplied -Ac
with a vector that has the known x
values and zeros in all other places to create a vector b
.
我不确定您是如何从矩阵中删除 x
值的。它们不是矩阵的组成部分,因此无法删除。但如果确实已知,就应该代入到方程组中,然后从矩阵中去掉相应的列,再去掉多余的行,使矩阵成为方阵。
例如假设您将 A
和 b
定义如下:
⎛1 2 3⎞
A = ⎜2 4 5⎟,
⎝3 5 6⎠
b = (3,-5,8)ᵀ,
你的等式是
Ax=b.
设x₂
为-32。我们可以代入它,得到以下等式:
A'x'+c=b,
哪里
⎛1 3⎞
A' = ⎜2 5⎟,
⎝3 6⎠
x' = (x₁,x₃)ᵀ,
c = (-64,-128,-160)ᵀ.
c
这里是 A
的第二列与 x₂
的乘积。将 c
移动到 RHS 以在那里产生 k=b-c
后,您将得到一个过度确定(尽管一致)的系统
A'x'=k,
所以您应该从 A
中删除其中一行,并从 k
中删除同一行。例如。删除最后一行将得到等式
A"x'=k',
哪里
⎛1 3⎞
A" = ⎝2 5⎠,
k' = (67,123)ᵀ,
其解为x'=(x₁,x₃)ᵀ=(34,11)ᵀ
。这个方程可以使用与方矩阵一起工作的常用线性求解器来求解。
你给定了“A”和“b = 0”,并且知道 A 是对称正定的。
因为 A 是 spd,所以它没有非平凡的 null-space(这是一个重要的 属性)。也就是说,唯一存在使得 Ax = b = 0 的“x”是 x = 0.
因此,如果给定非零值,您将找不到解决方案。它永远是 x = 0。
我这样说是为了强调 Eigen 不能解决问题,顺便说一句。
(我正在使用 Eigen C++ 库)
我需要求解形式为 Ax = 0
的方程组,以便找到 x
向量(A 是稀疏的)。
编辑: A 是 SPD(对称正定)
因为某些 x
值是已知的,所以我将它们从 A 中移除以创建 Af
并放入另一个矩阵 Ac
中,其维度与 A
相同,并将 -Ac
与具有已知 x
值和所有其他位置零的向量相乘以创建向量 b
.
现在我尝试使用 SparseLU<SparseMatrix<float>>
求解 Af * x = b
,但它失败了,因为分解不起作用。我收到此错误:
THE MATRIX IS STRUCTURALLY SINGULAR ... ZERO COLUMN AT 480
为什么我的列为零是个问题?零行肯定是个问题,但零列呢?我只是改变了这样的东西:
x_1 + x_2 = 0
x_2 = 3
至
x_1 + 0 = -3
解决方案是 x_1 = -3 & x_2 = 3
,即使我将方程式放入矩阵中也会得到零列。
我该如何解决这个问题?
我的线性代数有点生疏
为了使矩阵具有唯一解,矩阵的秩需要与维数相同。如果您有一个零列,那么排名将比维度少一,并且您有一个自由变量。
如果您正在尝试解决 Ax = 0
那么它就是您所追求的 null space
,请尝试查看此
Why is it a problem that I have a zero column?
因为这意味着您的方程式忽略了未知数向量的一个分量,这导致解为 non-unique(被忽略的未知数的任何值都可以满足方程式)。
Because some of the
x
values are known, I removed them out of A to createAf
and into another matrixAc
with the same dimensions asA
, and multiplied-Ac
with a vector that has the knownx
values and zeros in all other places to create a vectorb
.
我不确定您是如何从矩阵中删除 x
值的。它们不是矩阵的组成部分,因此无法删除。但如果确实已知,就应该代入到方程组中,然后从矩阵中去掉相应的列,再去掉多余的行,使矩阵成为方阵。
例如假设您将 A
和 b
定义如下:
⎛1 2 3⎞
A = ⎜2 4 5⎟,
⎝3 5 6⎠
b = (3,-5,8)ᵀ,
你的等式是
Ax=b.
设x₂
为-32。我们可以代入它,得到以下等式:
A'x'+c=b,
哪里
⎛1 3⎞
A' = ⎜2 5⎟,
⎝3 6⎠
x' = (x₁,x₃)ᵀ,
c = (-64,-128,-160)ᵀ.
c
这里是 A
的第二列与 x₂
的乘积。将 c
移动到 RHS 以在那里产生 k=b-c
后,您将得到一个过度确定(尽管一致)的系统
A'x'=k,
所以您应该从 A
中删除其中一行,并从 k
中删除同一行。例如。删除最后一行将得到等式
A"x'=k',
哪里
⎛1 3⎞
A" = ⎝2 5⎠,
k' = (67,123)ᵀ,
其解为x'=(x₁,x₃)ᵀ=(34,11)ᵀ
。这个方程可以使用与方矩阵一起工作的常用线性求解器来求解。
你给定了“A”和“b = 0”,并且知道 A 是对称正定的。 因为 A 是 spd,所以它没有非平凡的 null-space(这是一个重要的 属性)。也就是说,唯一存在使得 Ax = b = 0 的“x”是 x = 0.
因此,如果给定非零值,您将找不到解决方案。它永远是 x = 0。 我这样说是为了强调 Eigen 不能解决问题,顺便说一句。