如何在不放大舍入误差的情况下将 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
次方,并且可以在没有太多舍入误差的情况下计算,我猜。现在,你将P
和P^{-1}
分别从左边和右边乘以这个D^x
得到A^x
。 A^x
中的误差取决于P
和P^{-1}
的误差,可以通过LAPACK等数值包中的一些子程序计算得到。
正如 norio 在回答中提到的那样,一般可以采用 Jordan(或 Schur)分解并以类似的方式进行 - 有关详细信息(包括简要错误分析),请参见 Matrix 的第 11 章Golub 和 Loan 的计算。
如何在不放大舍入误差的情况下将 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
次方,并且可以在没有太多舍入误差的情况下计算,我猜。现在,你将P
和P^{-1}
分别从左边和右边乘以这个D^x
得到A^x
。 A^x
中的误差取决于P
和P^{-1}
的误差,可以通过LAPACK等数值包中的一些子程序计算得到。
正如 norio 在回答中提到的那样,一般可以采用 Jordan(或 Schur)分解并以类似的方式进行 - 有关详细信息(包括简要错误分析),请参见 Matrix 的第 11 章Golub 和 Loan 的计算。