scipy求解矩阵微分方程

37 篇文章 3 订阅
15 篇文章 3 订阅

形如 X ′ = A X + b X'=AX+b X=AX+b的矩阵微分方程目前在scipy中是没有接口直接处理的,需要自己手动转换一下格式,但对应这种格式MATLAB的ode求解器是支持直接求解的。

本文基于https://wenku.baidu.com/view/8fc76d6bfbd6195f312b3169a45177232f60e4f9.html?re=view
的例子(原例子是用MATLAB求解的,采用scipy求解一组矩阵微分方程:
在这里插入图片描述
python程序如下:

from scipy.integrate import solve_ivp
import numpy as np
import matplotlib.pyplot as plt

k1 = k2 = k3 = 1
m1 = m2 = m3 = 1
# f1 = f2 = f3 = 5*np.sin(1.25*t)
A = np.array([[0,0,0,1,0,0],
              [0,0,0,0,1,0],
              [0,0,0,0,0,1],
              [-(k1+k2)/m1, k2/m1, 0,0,0,0],
              [k2/m2,-(k2+k3)/m2,k3/m2,0,0,0],
              [0,k3/m3,-k3/m3,0,0,0]]
              )
B = np.array([[0,0,0],
              [0,0,0],
              [0,0,0],
              [1/m1,0,0],
              [0,1/m2,0],
              [0,0,1/m3]
             ])
# solve dX/dt = A*X+b
def func(t,y):
    #dX/dt = A*X+b
#     x1,x2,x3,x4,x5,x6 = y
    f = np.array([5*np.sin(1.25*t),5*np.sin(1.25*t),5*np.sin(1.25*t)])
    # 主要下面直接用到了列表推导
    return [np.dot(A[i,:], y)+np.dot(B[i,:],f)  for i in range(6)]

N = 30
t_span = (0,N)
t_eval = np.linspace(0,N,1000)
y0 = [0,0,0,0,0,0]

sol = solve_ivp(func, t_span, y0, t_eval=t_eval)

plt.plot(sol.t, sol.y.T)
plt.grid('on')
plt.show()

结果如下,和原文结果一致:
在这里插入图片描述
总结:scipy也是可以求解矩阵微分方程的,只不过需要转换一下格式

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值