问题描述
我一直在开发实时工作的C语言控制软件。该软件尤其实现了受控系统的离散状态空间观察器。为了实现观察者,有必要计算4x4维矩阵的逆。逆矩阵计算必须每50微秒完成一次,值得一提的是,在这段时间里,还将进行其他耗时的计算。因此,逆矩阵计算必须消耗少于50微秒的时间。还必须说,所使用的DSP不具有支持浮点运算的ALU。
我一直在寻找一种有效的方法来做到这一点。我有一个想法是准备用于计算矩阵4x4的行列式的通用公式和用于计算4x4矩阵的伴随矩阵的通用公式,然后根据下面给出的公式计算逆矩阵。
您如何看待这种方法?
解决方法
据我了解,研究数字线性代数的人们之间的共识是,建议避免避免不必要地计算矩阵逆。例如,如果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文章中对此进行了描述。
更一般的因式分解包括LUD和QR,它们的通用性更高,因为它们可以应用于任何(可逆)矩阵,但比cholesky慢一些。
这种分解也可以用来计算逆。
时髦地描述您的帖子中的adj(A)是伴随的,也许有点过时了;我认为裁判或辅助手段更现代。无论如何,adj(A)都不是转置。相反,adj(A)的(i,j)元素最多等于符号,它是通过删除第i行和第j列从A获得的矩阵的行列式。有效地进行计算很尴尬。