当矩阵没有 LU 分解时,如何在 C++ 中求解方阵的线性系统?

How to solve a linear system of a square matrix in C++ when the matrix has no LU-Decomposition?

我一直在尝试开发一个程序来使用 LU 分解求解方阵 A 的系统 Ax=b。但是,我意识到这种分解并不总是存在(一种判断方法是如果不需要行交换操作,则存在)。但是,我从许多来源中看到,这是计算 Ax=b.

的解决方案的绝佳方法

我的问题是:人们遇到没有 LU 分解的矩阵的频率是多少?如果真的遇到这样的矩阵,应该怎么处理呢?为了以防万一,他是否应该创建一个单独的方法,例如高斯消除法?

请提供一些关于此的见解。提前致谢。

注意:我正在尝试使用此信息来求解 A^TAx=A^Tb,即使用最小二乘法找到数学模型。

以最简洁的形式摘自维基百科

Any square matrix $A$ admits an LUP factorization. If $A$ is invertible, then it admits an LU (or LDU) factorization if and only if all its leading principal minors are non-zero. If $A$ is a singular matrix of rank $k$, then it admits an LU factorization if the first $k$ leading principal minors are non-zero, although the converse is not true.

我没有完整地编写实现,但这看起来很复杂。我认为根据您的矩阵,存在更简单的数值方案可以减少您的解决方案。

至于怎么经常遇到这样的?好吧,没有人知道你在做什么,所以这是不可能回答的。如果遇到这种情况,请切换到其他方案。

我在实践中经常使用的一个是Gauss-Seidel。实际上维基百科有一个完整的书面方案。

当且仅当矩阵的所有前导主辅子都不为零时,LU 分解才存在。

根据你的实际问题,你正在解决:

A^TAx=A^T

A^TA是一个对称方阵。我们可以将矩阵对角化为:A = R^-1 D R 并且您始终可以重新排列它以找到 x。您需要非零特征值才能工作。

一个(方)矩阵是可逆的当且仅当它没有零特征值。

我认为通过高斯消去反转它可能是最好的解决方案。