实时逆矩阵计算

问题描述

我一直在开发实时工作的C语言控制软件。该软件尤其实现了受控系统的离散状态空间观察器。为了实现观察者,有必要计算4x4维矩阵的逆。逆矩阵计算必须每50微秒完成一次,值得一提的是,在这段时间里,还将进行其他耗时的计算。因此,逆矩阵计算必须消耗少于50微秒的时间。还必须说,所使用的DSP不具有支持浮点运算的ALU。

我一直在寻找一种有效的方法来做到这一点。我有一个想法是准备用于计算矩阵4x4的行列式的通用公式和用于计算4x4矩阵的伴随矩阵的通用公式,然后根据下面给出的公式计算逆矩阵。

enter image description here

您如何看待这种方法

解决方法

据我了解,研究数字线性代数的人们之间的共识是,建议避免避免不必要地计算矩阵逆。例如,如果A的倒数仅出现在您的控制器中,例如

z = inv(A)*y

然后最好(更快,更准确)求解z方程

A*z = y 

than计算inv(A),然后将y乘以inv(A)。

求解此类方程式的常用方法是将A分解为更简单的部分。例如,如果A是(严格地)正定的,则​​cholesky factorization会找到下三角矩阵L,因此

A = L*L'

鉴于我们可以通过以下方式为z求解A * z = y:

solve L*u = y for u
solve L'*z = u for z

考虑到L的三角形性质,每一个都很容易

另一种因式分解(同样仅适用于正定矩阵)是LDL,在您的情况下,它可能更容易,因为它不涉及平方根。在上面链接的Wiki文章中对此进行了描述。

更一般的因式分解包括LUDQR,它们的通用性更高,因为它们可以应用于任何(可逆)矩阵,但比cholesky慢一些。

这种分解也可以用来计算逆。

时髦地描述您的帖子中的adj(A)是伴随的,也许有点过时了;我认为裁判或辅助手段更现代。无论如何,adj(A)都不是转置。相反,adj(A)的(i,j)元素最多等于符号,它是通过删除第i行和第j列从A获得的矩阵的行列式。有效地进行计算很尴尬。