Python - 求解瞬态矩阵微分方程
Python - Solve time-dependent matrix differential equation
我在求解瞬态矩阵微分方程时遇到了一些问题。
问题是随时间变化的系数不仅仅是遵循一些随时间变化的形状,而是另一个微分方程的解。
到目前为止,我已经考虑了我的系数 G(t) 只是 G(t)=pulse(t) 的微不足道的情况,其中这个 pulse(t) 是我定义的函数。这是代码:
# Matrix differential equation
def Leq(t,v,pulse):
v=v.reshape(4,4) #covariance matrix
M=np.array([[-kappa,0,E_0*pulse(t),0],\. #coefficient matrix
[0,-kappa,0,-E_0*pulse(t)],\
[E_0*pulse(t),0,-kappa,0],\
[0,-E_0*pulse(t),0,-kappa]])
Driff=kappa*np.ones((4,4),float) #constant term
dv=M.dot(v)+v.dot(M)+Driff #solve dot(v)=Mv+vM^(T)+D
return dv.reshape(-1) #return vectorized matrix
#Pulse shape
def Gaussian(t):
return np.exp(-(t - t0)**2.0/(tau ** 2.0))
#scipy solver
cov0=np.zeros((4,4),float) ##initial vector
cov0 = cov0.reshape(-1); ## vectorize initial vector
Tmax=20 ##max value for time
Nmax=10000 ##number of steps
dt=Tmax/Nmax ##increment of time
t=np.linspace(0.0,Tmax,Nmax+1)
Gaussian_sol=solve_ivp(Leq, [min(t),max(t)] , cov0, t_eval= t, args=(Gaussian,))
我得到了一个不错的结果。问题是它不正是我需要的。我需要的是dot(G(t))=-kappa*G(t)+pulse(t),即系数是微分方程的解
我试图在 Leq 中以一种矢量化的方式实现这个微分方程,方法是返回另一个将被馈送到 M 的参数 G(t),但是我遇到了数组维度的问题。
知道我应该如何进行吗?
谢谢,
原则上你的想法是正确的,你只需要分裂和连接状态和导数向量。
def Leq(t,u,pulse):
v=u[:16].reshape(4,4) #covariance matrix
G=u[16:].reshape(4,4)
... # compute dG and dv
return np.concatenate([dv.flatten(), dG.flatten()])
初始向量同样是这样的复合。
我在求解瞬态矩阵微分方程时遇到了一些问题。 问题是随时间变化的系数不仅仅是遵循一些随时间变化的形状,而是另一个微分方程的解。
到目前为止,我已经考虑了我的系数 G(t) 只是 G(t)=pulse(t) 的微不足道的情况,其中这个 pulse(t) 是我定义的函数。这是代码:
# Matrix differential equation
def Leq(t,v,pulse):
v=v.reshape(4,4) #covariance matrix
M=np.array([[-kappa,0,E_0*pulse(t),0],\. #coefficient matrix
[0,-kappa,0,-E_0*pulse(t)],\
[E_0*pulse(t),0,-kappa,0],\
[0,-E_0*pulse(t),0,-kappa]])
Driff=kappa*np.ones((4,4),float) #constant term
dv=M.dot(v)+v.dot(M)+Driff #solve dot(v)=Mv+vM^(T)+D
return dv.reshape(-1) #return vectorized matrix
#Pulse shape
def Gaussian(t):
return np.exp(-(t - t0)**2.0/(tau ** 2.0))
#scipy solver
cov0=np.zeros((4,4),float) ##initial vector
cov0 = cov0.reshape(-1); ## vectorize initial vector
Tmax=20 ##max value for time
Nmax=10000 ##number of steps
dt=Tmax/Nmax ##increment of time
t=np.linspace(0.0,Tmax,Nmax+1)
Gaussian_sol=solve_ivp(Leq, [min(t),max(t)] , cov0, t_eval= t, args=(Gaussian,))
我得到了一个不错的结果。问题是它不正是我需要的。我需要的是dot(G(t))=-kappa*G(t)+pulse(t),即系数是微分方程的解
我试图在 Leq 中以一种矢量化的方式实现这个微分方程,方法是返回另一个将被馈送到 M 的参数 G(t),但是我遇到了数组维度的问题。
知道我应该如何进行吗?
谢谢,
原则上你的想法是正确的,你只需要分裂和连接状态和导数向量。
def Leq(t,u,pulse):
v=u[:16].reshape(4,4) #covariance matrix
G=u[16:].reshape(4,4)
... # compute dG and dv
return np.concatenate([dv.flatten(), dG.flatten()])
初始向量同样是这样的复合。