0

有没有直接计算状态转移矩阵的方法(即e^(A*t),其中A是一个矩阵)?我打算这样计算:

x(t) 是 e^(A*t) 和 x(0)=1

但失败了:

计算逆拉普拉斯变换失败

如果我直接先计算 A*t 然后使用expm(),它仍然无法工作,因为expm().

我希望我能清楚地说明我的问题:)

编辑:这是我认为应该对解决我的问题有用的代码:

import numpy as np
import sympy
import scipy
from scipy.integrate import quad


Ts=0.02
s=sympy.symbols('s')
t=sympy.symbols('t')
T0=np.matrix([[1,0,0],
              [0,1,0],
              [0,-1,1]])
M0=np.matrix([[1.735,0.15851,0.042262],
              [0.123728,0.07019322,0.02070838],
              [0.042262,0.0243628,0.014375212]])
F0=np.matrix([[-22.915,0,0],
              [0,-0.00969,0.00264],
              [0,0.00264,-0.00264]])
N0=np.matrix([[0,0,0],
              [0,1.553398,0],
              [0,0,0.4141676]])
G0=np.matrix([[11.887],[0],[0]])
Ky=np.matrix([1.0121,4.5728,6.3652,0.9117,1.5246,0.9989])
A21=T0*(M0.I)*N0*(T0.I)
A22=T0*(M0.I)*F0*(T0.I)
Z=np.zeros((3,3))
Y=(np.matrix([0,0,0])).T
by1=np.row_stack((Z,A21))
by2=np.row_stack((np.identity(3),A22))
A=np.column_stack((by1,by2))
G=scipy.linalg.expm(A*Ts)


B2=T0*(M0.I)*G0
B=np.row_stack((Y,B2))
S1=sympy.Matrix((s*np.identity(6))-A)
S2=S1.inv()
S=S2
for (i,j), orinm in scipy.ndenumerate(S2):
    S[i,j]=sympy.inverse_laplace_transform(orinm, s, t)

#integral
H=np.zeros(S2.shape, dtype=float)
for (i,j),func_sympy in scipy.ndenumerate(S2):
    func = sympy.lambdify( (t),func_sympy, 'math')
    H[i,j] = quad(func, 0, 0.02)[0]
print(H)
4

1 回答 1

0

您可以使用 直接计算矩阵指数scipy

import numpy as np
from scipy.linalg import expm

A = np.random.random((10, 10))
exp_A = expm(A)

这方面的文档在这里它使用 Pade 近似值。

这是使用 2x2 单位矩阵的示例。

>>> expm(np.eye(2))
array([[2.71828183, 0.        ],
       [0.        , 2.71828183]])

如果您需要符号矩阵的矩阵指数(根据您的评论),那么您可以使用 Sympy 执行此操作:

t = sympy.symbols('t')
A = sympy.Matrix([[t, 0], [0, t]])
>>> sympy.exp(A)
Matrix([
[expt(t), 0],
[0,  exp(t)]])
于 2019-01-03T15:19:30.530 回答