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

时间:2018-11-08 16:52:28

标签: python numpy scipy

根据Matrix exponential,如果为XY = YX,则为exp(X)exp(Y) = exp(X+Y)。但是,当我在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)解决了这个问题。

1 个答案:

答案 0 :(得分:1)

简而言之:scipy 1.1.0中存在一个错误,该错误似乎已在1.2.0中修复。

安装最新的scipy(1.2.1),以下操作就可以了:

gsub("([A-Z])(?![0-9])", "\\11", strings, perl = TRUE)
# [1] "A1"     "A3B1C3" "A2B1C1"