通常,该板会看到大量关于大型线性方程组最有效和最强大的求解器的流量。但这一次,我遇到了相反的问题:
我需要在一个非常有限的编程系统中实现一个线性方程组的求解器,该系统只提供基本的数组功能,没有任何线性代数。效率和可扩展性不是问题,因为系统具有个位数的未知数。更重要的是它很容易实现,并且用最基本的线性代数知识完全理解。
所以我正在寻找最简单的算法:
Ax = b满秩 A系统的直接解- 具有 A的系统的迭代解
Ax = b不一定满秩,但对 x 具有良好的初始猜测。
通常,该板会看到大量关于大型线性方程组最有效和最强大的求解器的流量。但这一次,我遇到了相反的问题:
我需要在一个非常有限的编程系统中实现一个线性方程组的求解器,该系统只提供基本的数组功能,没有任何线性代数。效率和可扩展性不是问题,因为系统具有个位数的未知数。更重要的是它很容易实现,并且用最基本的线性代数知识完全理解。
所以我正在寻找最简单的算法:
Ax = b满秩 A系统的直接解Ax = b不一定满秩,但对 x 具有良好的初始猜测。我建议使用部分旋转的 BLAS1/2 风格的 LU 分解实现,以及前向/后向三角形求解。如果您只有个位数的未知数,即使在结构化系统(即带状/稀疏/?)上运行密集/O(N^3)算法也应该没问题。所有这些算法都可以用“axpy”操作来编写,这是一个特别容易理解/实现的 BLAS1 原语(axpy 字面意思只是 y = a lpha* x + ( lus ) y,一个带有缩放的向量向量加法)
作为一种特殊情况,如果单个数字仅表示 N=2 或 N=3(也许您只需要坐标变换或其他东西),那么它们足够小/容易手动编写显式逆公式,这肯定会更少比LU工作。
这个问题与您可能想要反转的矩阵一样不合适:-)
即使是最复杂的迭代方法,例如 GMRES,也不是很难实现,并且只需要几百行代码。这可能只比可以说是最简单的方法 Richardson 缺陷校正差 4 或 5 倍。但它要强大得多。
真正的努力在于复杂的求解器方案是预处理器。但是对于像您这样小的问题,您可能一开始就不需要为此烦恼。