首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中求解常量微分方程?

如何在python中求解常量微分方程?
EN

Stack Overflow用户
提问于 2019-05-11 04:37:03
回答 1查看 84关注 0票数 0

我想使用Python在不定义常量的情况下解决以下系统。

代码语言:javascript
复制
dx1(t)/dt = - kf1*x1(t)*x2(t) + kr1*x3(t)

dx2(t)/dt = - kf1*x1(t)*x2(t) + kr1*x3(t)

dx3(t)/dt = kf1*x1(t)*x2(t) - kr1*x3(t) - k2*(x3(t) - x4(t))

dx4(t)/dt = k2*(x3(t) - x4(t)) + kf3*x5(t)*x6(t) - kr3*x4(t)

dx5(t)/dt = -kf3*x5(t)*x6(t) + kr3*x4(t)

dx6(t)/dt = -kf3*x5(t)*x6(t) + kr3*x4(t)

x1(0)=x1_0,  x2(0)=x2_0 and x(3)=x(4)=x(5)=x(6)=0

我希望在不用实数替换kf1,kr1,k2,kf3,kr3,x1_0 and x2_0的情况下解决系统问题

评论:我正在描述DNA链置换反应的动力学方程,其中(3),(4)和(5)是中间产物,

(1) + (2) <--> (5) + (6)

我尝试过使用渐变和将常量定义为符号,但没有成功。

代码语言:javascript
复制
from sympy import *

x1,x2,x3,x4,x5,x6 =symbols('x1 x2 x3 x4 x5 x6', cls=Function)

kf1,kr1,k2,kf3,kr3 = symbols("kf1 kr1 k2 kf3 kr3")

diffeqq1=Eq(x1(t).diff(t), - kf1*x1*x2 + kr1*x3)
diffeqq2=Eq(x2(t).diff(t), - kf1*x1*x2 + kr1*x3)
diffeqq3=Eq(x3(t).diff(t), kf1*x1*x2 - kr1*x3 - k2*(x3 - x4))
diffeqq4=Eq(x4(t).diff(t), k2*(x3 - x4) + kf3*x5*x6 - kr3*x4)
diffeqq5=Eq(x5(t).diff(t), -kf3*x5*x6 + kr3*x4)
diffeqq6=Eq(x6(t).diff(t), -kf3*x5*x6 + kr3*x4)

dsolve(system,[x1,x2,x3,x4,x5,x6])

我希望得到的结果是x1,x2,x5,x6和常量之间的函数。

EN

回答 1

Stack Overflow用户

发布于 2019-05-13 14:22:19

您可以定义一个向量函数来包含动态

代码语言:javascript
复制
def reactions(t,u):
    x1,x2,x3,x4,x5,x6 = u
    F1 = kf1*x1*x2
    R1 = kr2*x3
    FR2 = k2*(x3-x4)
    F3 = kf3*x5*x6
    R3 = kr3*x4
    return [ -F1+R1, -F1+R1, F1-R1-FR2, FR2+F3-R3, -F3+R3, -F3+R3]

然后调用scipy.integrate.solve_ivp在足够长的时间跨度上求解系统,

代码语言:javascript
复制
res = solve_ivp(reactions, [t0, tf], x_init, dense_output=True, atol=1e-8, rtol=1e-6)
t = np.linspace(t0, tf, 702)
u = res.sol(t)
x1,x2,x3,x4,x5,x6 = u
plt.plot(t,x1,lw=3,label='$x_1$')
plt.plot(t,x2,lw=3,label='$x_2$')
plt.plot(t,x6,lw=3,label='$x_6$')
plt.grid(); plt.legend(); plt.show()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56084533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档