在编辑器中打开 expmdemo.m
在命令窗口中运行

矩阵指数

有关矩阵指数计算的背景,请参阅 "Nineteen dubious ways to compute the exponential of a matrix, twenty-five years later," SIAM Review 45, 3-49, 2003。

此外,也强烈建议您了解“Pseudospectra Gateway”。 网址为:

http://web.comlab.ox.ac.uk/projects/pseudospectra/

下面列出了 19 种计算矩阵指数的方法中的三种。

目录

首先构造矩阵 A

A = [0 1 2; 0.5 0 1; 2 1 0]
Asave = A;
A =

         0    1.0000    2.0000
    0.5000         0    1.0000
    2.0000    1.0000         0

缩放计算和平方计算

expmdemo1 是 Golub 和 Van Loan 合著的《Matrix Computations》第三版中算法 11.3.1 的实现。

% Scale A by power of 2 so that its norm is < 1/2 .
[f,e] = log2(norm(A,'inf'));
s = max(0,e+1);
A = A/2^s;

% Pade approximation for exp(A)
X = A;
c = 1/2;
E = eye(size(A)) + c*A;
D = eye(size(A)) - c*A;
q = 6;
p = 1;
for k = 2:q
   c = c * (q-k+1) / (k*(2*q-k+1));
   X = A*X;
   cX = c*X;
   E = E + cX;
   if p
     D = D + cX;
   else
     D = D - cX;
   end
   p = ~p;
end
E = D\E;

% Undo scaling by repeated squaring
for k = 1:s
    E = E*E;
end

E1 = E
E1 =

    5.3091    4.0012    5.5778
    2.8088    2.8845    3.1930
    5.1737    4.0012    5.7132

通过泰勒级数计算矩阵指数

expmdemo2 使用矩阵指数的经典定义。 作为一种适用数值方法,如果 norm(A) 太大,则计算速度将很慢而且不准确。

A = Asave;

% Taylor series for exp(A)
E = zeros(size(A));
F = eye(size(A));
k = 1;
while norm(E+F-E,1) > 0
   E = E + F;
   F = A*F/k;
   k = k+1;
end

E2 = E
E2 =

    5.3091    4.0012    5.5778
    2.8088    2.8845    3.1930
    5.1737    4.0012    5.7132

通过特征值和特征向量计算矩阵指数

expmdemo3 假定矩阵包含一组完整的特征向量。 作为一种适用的数值方法,准确性由特征向量矩阵的条件确定。

A = Asave;

[V,D] = eig(A);
E = V * diag(exp(diag(D))) / V;

E3 = E
E3 =

    5.3091    4.0012    5.5778
    2.8088    2.8845    3.1930
    5.1737    4.0012    5.7132

比较结果

对于以下矩阵,结果都具有较高的准确性

E = expm(Asave);
err1 = E - E1
err2 = E - E2
err3 = E - E3
err1 =

  1.0e-014 *

    0.3553    0.1776         0
    0.0444    0.0444   -0.0444
   -0.0888   -0.0888   -0.3553


err2 =

  1.0e-014 *

         0         0   -0.2665
   -0.0888   -0.0888   -0.0888
    0.0888   -0.0888         0


err3 =

  1.0e-013 *

   -0.0799   -0.0444   -0.0711
   -0.0666   -0.0577   -0.0933
   -0.0799   -0.0622   -0.1155

泰勒级数失败

下面的矩阵中泰勒级数中各项在变为零之前非常大。 因此,expmdemo2 失败。

A = [-147 72; -192 93];
E1 = expmdemo1(A)
E2 = expmdemo2(A)
E3 = expmdemo3(A)
E1 =

   -0.0996    0.0747
   -0.1991    0.1494


E2 =

  1.0e+006 *

   -1.1985   -0.5908
   -2.7438   -2.0442


E3 =

   -0.0996    0.0747
   -0.1991    0.1494

特征值和特征向量失败

以下是不包含一组完整的特征向量的矩阵。 因此,expmdemo3 失败。

A = [-1 1; 0 -1];
E1 = expmdemo1(A)
E2 = expmdemo2(A)
E3 = expmdemo3(A)
E1 =

    0.3679    0.3679
         0    0.3679


E2 =

    0.3679    0.3679
         0    0.3679


E3 =

    0.3679         0
         0    0.3679