我有一个矩阵,它是某个参数 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) = 0
和rank(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的讨论来看,行列式实际上是解决这个问题的一个非常好的方法。问题似乎是以稳定的方式解决最终方程,这将是一个不同的问题。