【问题标题】:Python - Solve time-dependent matrix differential equationPython - 求解瞬态矩阵微分方程
【发布时间】:2021-04-22 15:24:31
【问题描述】:

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

到目前为止,我已经考虑了一个简单的情况,即我的系数 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 中通过返回另一个参数 G(t) 来在 Leq 中以一种矢量化的方式实现这个微分方程,该参数将被提供给 M,但是我遇到了数组维度的问题。

知道我应该如何进行吗?

谢谢,

【问题讨论】:

    标签: python numpy matrix scipy ode


    【解决方案1】:

    原则上你的想法是正确的,你只需要拆分和连接状态和导数向量。

    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=u[16:],并将初始状态定义为 G_0=np.zeros((1,1),float).reshape(-1)。尽管如此,当我把这个 G 参数放在 M 矩阵中时,我得到了这个错误: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences(这是一个列表或元组的列表或元组或具有不同长度或形状的 ndarray)已弃用。如果您打算这样做,则必须在创建 ndarray 时指定 'dtype=object' M=np.array([[-kappa,0,G,0],\
    • 如果G 是一个标量,那么在大多数情况下保持它为标量是最有帮助的。因此只有G=u[16]np.concatenate([dv.flatten(), [dG]]
    猜你喜欢
    • 2018-10-28
    • 2020-05-14
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多