为什么 expm(2*A) != expm(A) @ expm(A)

根据规则exp(A+B) = exp(A)exp(B),这适用于通勤矩阵A和B时,即AB = BA,我们有exp(2A) = exp(A)exp(A)。但是,当我在 Python 中运行以下命令时:


import numpy as np

from scipy.linalg import expm


A = np.arange(1,17).reshape(4,4)


print(expm(2*A))

[[ 306.63168024  344.81465009  380.01335176  432.47730444]

 [ 172.59336774  195.36562731  214.19453937  243.76985501]

 [ -35.40485583  -39.87705598  -42.94545895  -50.01324379]

 [-168.44316833 -190.32607875 -209.76427134 -237.72069322]]


print(expm(A) @ expm(A))

[[1.87271814e+30 2.12068332e+30 2.36864850e+30 2.61661368e+30]

 [4.32685652e+30 4.89977229e+30 5.47268806e+30 6.04560383e+30]

 [6.78099490e+30 7.67886126e+30 8.57672762e+30 9.47459398e+30]

 [9.23513328e+30 1.04579502e+31 1.16807672e+31 1.29035841e+31]]

我得到两个截然不同的结果。请注意,这@只是矩阵乘积。


我也在Matlab中尝试过,两个结果和预期的一样。我在这里缺少什么?


编辑:我有 NumPy 1.15.3、SciPy 1.1.0、Python 3.6.4、Windows 7 64 位


正如Warren Weckesser在评论中所建议的,使用A = A.astype(np.float64)可以解决问题。


慕丝7291255
浏览 166回答 1
1回答

慕盖茨4494581

简而言之:scipy 1.1.0 中有一个 bug,它似乎已在 1.2.0 中修复。安装最新的scipy(1.2.1),下面通过就好了:import numpy as npfrom scipy.linalg import expmA = np.arange(1,17).reshape(4,4)assert (expm(A) @ expm(A) == expm(2 * A)).all()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python