有哪些算法用于计算有理矩阵的精确特征值?

计算科学 线性代数 算法 特征值
2021-11-26 19:48:38

M是一个具有以下性质的矩阵:

1)M是厄米特 2)M只有理性的条目 3)M已知有有理特征值

有什么算法可以精确计算特征值M?

Mathematica 似乎能够非常快速地对这些矩阵进行对角化,因此必须存在这样的方法(我希望它们不是 Wolfram Inc 的商业机密!)。我怀疑 Mathematica 是否对特征方程使用有理根检验,因为您需要分解的数字很快就会变大。

2个回答

矩阵的特征多项式M可以写成

χM(z)=zn+trace(M)zn1++det(M).

因为你提前知道所有的条目M是理性的,你可以放心det(M)是理性的;det(M)=p/q. 现在,有理根定理向您保证,如果χM有理根λ=k/l, 然后k划分pl划分q. 但是,您提前(不知何故)知道M是理性的。

您可以计算的行列式M通过计算 LU 分解,比完整特征多项式快得多M. 由于所有的条目都是有理的,所以三角因子的条目也是有理的;您当然必须确保以符号方式进行分解,以便也可以准确计算行列式。

尝试所有有理数k/l这样k|pl|q也非常昂贵。但是,您可以使用传统的特征求解器来获得一组近似特征值λ^1,,λ^n,然后在每个近似值附近寻找具有所需可除性属性的精确、有理特征值。

粗略的谷歌搜索没有找到任何关于有理矩阵的确切特征分解的信息,所以我怀疑以前是否有人编写过这样的程序。但是,您可能会对sympy的线性代数特性感到幸运

有一种“简单”的方法,在某种意义上说我们只需要几行程序就很简单(这里我使用 Maple,但 Mathematica 也可以使用 PSLQ 来完成)。第 1 步:Maple 用(例如)200 位计算特征多项式的根。第 2 步:Maple 使用 Lenstra 的 LLL 方法给出根的最小多项式(如果我们以足够的精度知道根)。这里最小多项式有度1但是,为了安全起见,我们要求一个多项式2. (如果你得到一个多项式2,提高准确性)。在以下随机实例中,计算时间为 0"12。

roll := rand(-10^10 .. 10^10): 
Digits:= 200:
f := 1:
 for i to 10 do f := f*(x-roll()*(1/roll())) end do;
 f; 
f := numer(expand(f));
t := time():
 res := fsolve(f):
with(PolynomialTools):

for i to 10 do 
print(MinimalPolynomial(res[i], 2)) end do;
time()-t;