凯莱-汉密尔顿定理矩阵特征多项式的数值稳定计算

计算科学 线性代数 数值分析 矩阵 多项式
2021-11-26 15:11:05

我想知道是否有任何已知的方法来计算矩阵 A 的特征多项式 P 在实现 Cayley-Hamilton 定理的意义上数值稳定,即 P(A)=0。

我已经找到并实现了几种方法,但是当矩阵的维数甚至是几百倍时,P(A) 甚至不接近零矩阵。

Pradeep Misra、Enrique S. Quintana、Paul M. Van Dooren 的“特征多项式的数值可靠计算”声称,简化为 Frobenius 规范形式,使用 Hyman 的方法计算 Hessenberg 矩阵的行列式,Faddeev-LeVerrier 递归,找到多项式通过先计算矩阵的特征值并不能证明是数值稳定的,并提出了一种数值稳定的算法。

我在 MATLAB 上实现了算法:

function p = characteristic(A)

n = size(A,1);
[AA,BB,~,~] = hess(A, eye(n,n));
F = zeros(n,n); G = zeros(n,n);

F(:, 2:n) = AA(:,1:n-1); F(1,1) = -1;
fn = AA(:,n);

G(:, 2:n) = BB(:,1:n-1);
gn = BB(:,n);

res = zeros(n, n+1);
for i=0:n
    if i == 0
        res(:,n+1) = F\(-fn);
    elseif i == 1
        res(:,n) = F\(G*res(:,n+1) + gn);
    else
        res(:,n+1-i) = F\(G*res(:,n+1-i+1));
    end
end

p = res(1,:);
for i=1:n-1
    p = p*AA(i+1,i);
end
p = p*(-1)^(n-1);

这对于小维度(P(A) 接近零矩阵)效果很好,但对于更大的维度,它比 MATLAB 的“多边形”要好,但离零矩阵仍然很远。

>>A = rand(10,10); p = characteristic(A); polyvalm(p,A); ans(1,1)
ans =
  -2.1472e-10  
>>A = rand(100,100); p = characteristic(A); polyvalm(p,A); ans(1,1)
ans = 
  9.8824e+152

>>A = rand(20,20); p = characteristic(A); polyvalm(p,A); ans(1,1)
ans =
 -581.7226
>>A = rand(20,20); p = poly(A); polyvalm(p,A); ans(1,1)
ans =
   3.9789e+03

所以我仍然没有找到一种算法来计算特征多项式,使 P(A) 接近零矩阵。

我会非常感谢任何答案,尼夫

1个回答

一般来说,不会接近零矩阵:如果你计算多项式P相对精度为双精度将是( —矩阵的大小),这将是巨大的。P(A)Pϵ1016P(A)ϵAnn

因此,您只能要求与舍入误差引起的典型扰动一样小。这与浮点运算中的精确零一样好。P(A)

我认为如何计算特征多项式本身并不重要,因此确切的算法可能并不重要。

这也不是特定于矩阵的:即使对于的实根,您也不能真正要求在浮点运算中完全为零。因此,要确定的根,您将和机器 epsilon的系数得出的一些误差界限进行比较。在 Higham 的数值算法的准确性和稳定性中对这类问题进行了清晰的高级讨论(请参阅第 5.1 节,了解霍纳的方法及其误差范围)。p(x)=0p(x)xpp(x)p

此外,众所周知,多项式的根对以单项式基表示的那些多项式的系数非常敏感。

由于是一个无法达到的目标,因此您必须考虑要实现的目标,因为无论它是什么,都可以在不明确评估特征多项式的系数或要求如果您绝对必须拥有,我建议您简单地使用任意精度的浮点运算,其位数与矩阵的大小成正比。P(A)=0P(A)=0P(A)=0