首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SciPy数值求解ODE

用SciPy数值求解ODE
EN

Stack Overflow用户
提问于 2018-11-09 22:04:50
回答 2查看 82关注 0票数 1

我试图找到一个数值解,最终得到图形,Gyllenberg模型(癌细胞生长模型)。这个模型看起来像:

其中β是增殖细胞的繁殖率,µp是增殖细胞的死亡率,µq是静止细胞的死亡率,r0riN(t)的函数(转换率)。还有N(t) = P(t)+Q(t)

出于我在这里的目的,我定义了r_0(N) = bNr_i(N) = aN,以使事情变得更简单。

我的问题是,当我试图用pyplot绘制我的解决方案时,我就得到了

ValueError: X和y必须具有相同的第一维

我想这是不言自明的,但我不知道如何在不破坏其他一切的情况下修复它。

到目前为止,我只对第一个方程做过的代码是:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate

def fun(P,t, params):
    beta, mp,b,N,Q = params
    return(beta-mp-(b*N))*P+(a*N)*Q

params = (0.5,0.6,0.7,0.8,0.9)

tvec = np.arange(0,6,0.1)
s1 = scipy.integrate.odeint(
    fun,
    y0 = 1,
    t = tvec,
    args = (params,))

#print(s1)

plt.plot(fun,tvec)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-09 22:19:17

您目前正在策划funtvec的对决。你真正想要的是把tvecs1相提并论。您还必须在a中定义参数fun;我在下面的代码中将它设置为1

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate


def fun(P, t, params):
    beta, mp, b, N, Q = params
    return (beta-mp-(b*N))*P + (1.0 * N)*Q

params = (0.5, 0.6, 0.7, 0.8, 0.9)

tvec = np.arange(0, 6, 0.1)
s1 = scipy.integrate.odeint(
    fun,
    y0=1.,
    t=tvec,
    args=(params,))

plt.plot(tvec, s1)
plt.show()

这将阴谋:

票数 1
EN

Stack Overflow用户

发布于 2018-11-10 00:54:50

最后,您将希望解决耦合系统。这并不复杂,只需将状态对象设为向量,并以正确的顺序返回导数。

代码语言:javascript
复制
def fun(state,t, params):
    P, Q = state
    beta, mp, mq, a, b = params
    N = P+Q
    r0N, riN = b*N, a*N
    return [ (beta-mp-r0N)*P + riN*Q, r0N*P - (riN+mq)*Q ]

params = (0.5,0.6,0.7,0.8,0.9)

tsol = np.arange(0,6,0.1)
sol = odeint( fun, y0 = [ 1, 0],  t = tsol,  args = (params,))

Psol, Qsol = sol.T; plt.plot(tsol, Psol, tsol, Qsol)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53233842

复制
相关文章

相似问题

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