在 MATLAB 中查找矩阵函数的特征方程的根



我有一个矩阵,它是某个参数 A=A(x) 的函数。我想找到这个矩阵变成奇异的点x。示例(不过我有一个很大的矩阵):

syms x
A=[x sin(x); cos(x^2) 2.5];

到目前为止,我一直在符号化地计算矩阵的行列式,然后使用 fzero 或 newtzero 来找到该特征方程的根。 即

detA = det(A);
fzero(matlabFunction(detA),startingGuess)

然后我发现:如何确定矩阵是否是奇异的?,其中提倡在任何情况下都不使用行列式。

事实上,符号行列式的计算非常缓慢。但是,我尝试按照链接中的建议使用 rank(A),它似乎不适用于符号矩阵。

有没有办法实现链接中的建议,以找到符号给出的矩阵的特征方程的根?

一种可能的方法如下:方阵A是奇异的,当且仅当齐次线性(相对于向量y)系统A*y = 0具有非平凡解y <> 0(相当于det(A) = 0rank(A) = 0等)。因此,正如我从过去回忆的那样,计算这些点x的技术或多或少的标准是解决非线性系统

A(x)*y = 0   (1)
||y||  = 1   (2)

通过这种方式,您可以计算点x*和向量y*,使得A(x*)是奇异的,y*是对应于A(x*)的零特征值的特征向量。

如果我没记错的话,你也可以解决稍微容易一些的系统

A(x)*y = 0   (1)
<y,c>  = 1   (2a)

其中c是"几乎"任何非零随机向量(将其规范化为 1 以避免数值问题)。

事实上,关于这个主题有大量的参考书目 - 你可以寻找鞍节点分岔计算(如果A(x)是向量场的雅可比矩阵),或者"不稳定的距离"。

从与Ander Biguri的讨论来看,行列式实际上是解决这个问题的一个非常好的方法。问题似乎是以稳定的方式解决最终方程,这将是一个不同的问题。

最新更新