Python-求解含时矩阵微分方程

Python-求解含时矩阵微分方程,python,numpy,matrix,scipy,ode,Python,Numpy,Matrix,Scipy,Ode,我在解一个时间相关的矩阵微分方程时遇到了一些问题。 问题在于,与时间相关的系数不仅仅遵循与时间相关的形状,而是另一个微分方程的解 到目前为止,我已经考虑了一个简单的情况,其中我的系数G(t)只是G(t)=脉冲(t),其中脉冲(t)是我定义的函数。代码如下: # Matrix differential equation def Leq(t,v,pulse): v=v.reshape(4,4) #covariance matrix M=np.array([[-kappa,0,E_

我在解一个时间相关的矩阵微分方程时遇到了一些问题。 问题在于,与时间相关的系数不仅仅遵循与时间相关的形状,而是另一个微分方程的解

到目前为止,我已经考虑了一个简单的情况,其中我的系数G(t)只是G(t)=脉冲(t),其中脉冲(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,))
我得到了一个很好的结果。问题是这不是我所需要的。我需要的是点(G(t))=-kappa*G(t)+脉冲(t),即系数是微分方程的解

我试图用一种矢量化的方式在Leq中实现这个微分方程,方法是返回另一个参数G(t),该参数将被馈送到M,但我在数组的维数方面遇到了问题

你知道我该怎么做吗


谢谢,

原则上你的想法是正确的,你只需要拆分并加入状态向量和导数向量

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参数不是数组,而是一个值。因此,在将初始状态定义为G_0=np.zeros((1,1),float),重塑(-1)之后,我将其更改为G=u[16:]。尽管如此,当我将这个G参数放入M矩阵时,我还是得到了这样一个错误:VisibleDeprecationWarning:从不规则嵌套序列(即列表或元组列表或元组或具有不同长度或形状的ndarray)创建ndarray是不推荐的。如果您打算这样做,那么在创建ndarray M=np.数组([[[-kappa,0,G,0])时必须指定'dtype=object',\n如果
G
是一个标量,那么在大多数情况下将其保持为标量将非常有帮助。因此只要
G=u[16]
np.连接([dv.flatte(),[dG]]
)。