使用 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 值的。它们不是矩阵的组成部分,因此无法删除。但如果确实已知,就应该代入到方程组中,然后从矩阵中去掉相应的列,再去掉多余的行,使矩阵成为方阵。

例如假设您将 Ab 定义如下:

    ⎛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 不能解决问题,顺便说一句。