用 SciPy 数值求解 ODE
Solving an ODE Numerically with SciPy
我正在尝试找到一个数值解并最终绘制 Gyllenberg-Webb 模型(癌细胞生长模型)的图形。这个模型看起来像:
其中β
为增殖细胞的繁殖率,µp
为增殖细胞的死亡率,µq
为静止细胞的死亡率,r0
和 ri
是 N(t)
的函数(转换率)。还有 N(t) = P(t)+Q(t)
.
出于我的目的,我定义了 r_0(N) = bN
和 r_i(N) = aN
以使事情变得更简单。
我的问题是,当我尝试使用 pyplot 绘制我的解决方案时,我得到
ValueError: x and y must have same first dimension
我想这是不言自明的,但我不确定如何在不破坏其他一切的情况下修复它。
我的代码是:
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)
您目前正在密谋 fun
与 tvec
。你真正想要的是绘制 tvec
vs s1
。您还必须在 fun
中定义参数 a
;我在下面的代码中将其设置为 1
:
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()
这将绘制:
最后你会想解决耦合系统。这并不复杂,只需将状态对象设为向量,然后 return 导数按正确的顺序排列即可。
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)
我正在尝试找到一个数值解并最终绘制 Gyllenberg-Webb 模型(癌细胞生长模型)的图形。这个模型看起来像:
其中β
为增殖细胞的繁殖率,µp
为增殖细胞的死亡率,µq
为静止细胞的死亡率,r0
和 ri
是 N(t)
的函数(转换率)。还有 N(t) = P(t)+Q(t)
.
出于我的目的,我定义了 r_0(N) = bN
和 r_i(N) = aN
以使事情变得更简单。
我的问题是,当我尝试使用 pyplot 绘制我的解决方案时,我得到
ValueError: x and y must have same first dimension
我想这是不言自明的,但我不确定如何在不破坏其他一切的情况下修复它。
我的代码是:
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)
您目前正在密谋 fun
与 tvec
。你真正想要的是绘制 tvec
vs s1
。您还必须在 fun
中定义参数 a
;我在下面的代码中将其设置为 1
:
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()
这将绘制:
最后你会想解决耦合系统。这并不复杂,只需将状态对象设为向量,然后 return 导数按正确的顺序排列即可。
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)