如何在不放大舍入误差的情况下将 fortran 中的 nxn 矩阵 A 乘以 x 次以获得它的幂?

How can I multiply an nxn matrix A in fortran x times to get its power without amplifying rounding errors?

如何在不放大舍入误差的情况下将 Fortran 中的 NxN 矩阵 A 乘以 x 次以获得其幂?

如果A可以对角化为

A P = P D,

其中P是一些NxN矩阵(每列称为'eigenvector'),D是一个NxN对角矩阵(对角元素称为'eigenvalues') , 那么

A = P D P^{-1},

其中 P^{-1}P 的逆矩阵。因此 A 的二次方结果是

A A= P D P^{-1} P D P^{-1} = P D D P^{-1}.

重复 A 乘法 x 次得到

A^x = P D^x P^{-1}.

这里注意D^x仍然是对角矩阵。设 D 的第 i 个对角元素为 D_{ii}。那么,D^x 的第 i 个对角线元素是

[D^x]_{ii} = (D_{ii})^x

也就是说,D^x 的元素只是 D 的元素的 x 次方,并且可以在没有太多舍入误差的情况下计算,我猜。现在,你将PP^{-1}分别从左边和右边乘以这个D^x得到A^xA^x中的误差取决于PP^{-1}的误差,可以通过LAPACK等数值包中的一些子程序计算得到。

正如 norio 在回答中提到的那样,一般可以采用 Jordan(或 Schur)分解并以类似的方式进行 - 有关详细信息(包括简要错误分析),请参见 Matrix 的第 11 章Golub 和 Loan 的计算。