使用solve_ivp的Python求解ODE系统

使用solve_ivp的Python求解ODE系统,python,numpy,scipy,ode,Python,Numpy,Scipy,Ode,我一直在尝试用scipys solve_ivp解决ODE系统,这是一个分层组织组织模型的平均场近似,我想用给定时间点的“m”突变数量量化“k”水平的细胞数量。以下是方程式本身: 我的目标是计算具有1,2,3。。。突变的数量,可以通过知道整个系统中至少有1,2,3个细胞的数量来获得。。。突变数,即:M(M)=\sum_{k=0,n}\sum_{l=M,inf}n_{k,l},其中n是最后一个层次。 问题是,这些方程式产生的细胞数也包括那些没有获得新突变,但只是从母细胞遗传的细胞。 我想数一数那些

我一直在尝试用scipys solve_ivp解决ODE系统,这是一个分层组织组织模型的平均场近似,我想用给定时间点的“m”突变数量量化“k”水平的细胞数量。以下是方程式本身:

我的目标是计算具有1,2,3。。。突变的数量,可以通过知道整个系统中至少有1,2,3个细胞的数量来获得。。。突变数,即:M(M)=\sum_{k=0,n}\sum_{l=M,inf}n_{k,l},其中n是最后一个层次。 问题是,这些方程式产生的细胞数也包括那些没有获得新突变,但只是从母细胞遗传的细胞。 我想数一数那些获得新突变的细胞

所以我的问题是我很难修改方程,我想做的就是设置一个“计数器”,在每次迭代中我可以添加一定比例的单元,而我不修改控制系统动力学的原始方程

这是我的密码:

#/usr/bin/python
导入操作系统、软件、时间、系统、数学
从系统导入*
将numpy作为np导入
将matplotlib.pyplot作为plt导入
来自scipy.integrate import solve\u ivp
从mpmath导入*
mp.dps=30
n=3#级别数
g=3.0#组织的一个参数
三角洲=[0]*(n+2)#分化率
Nk=[1.0]*(n+2)#规定达到一定水平的细胞数
maxMut=10
N=1024*Nk[0]#组织生命周期内产生的细胞数
生命=N
sumNk=0
对于范围内的k(透镜(Nk)-1):
sumNk+=Nk[k]
对于范围(0,n)内的l:
三角洲[l]=(1./g)**(n-1-l)
三角洲[n]=2.0
三角洲[n+1]=0
打印(三角洲)
Nkmt=np.zeros((maxMut,n+1)).flatte()#我把方程存储在这里
def Nt(t,Nkmt):
retVec=[]
对于范围内的k(len(Nkmt)):
如果k%maxMut==0且k>0且kn*maxMut:#具有突变的术语水平
追加(((delta[int(floor(k/float(maxMut)))-1]/Nk[int(floor(k/float(maxMut))-1])*Nkmt[k-maxMut])+mu*((delta[int(floor(k/float(maxMut))-1]/Nk[int(floor(k/float(maxMut)))-1])-mu*((delta[int(floor(k/float(k/float(maxMut))-maxMut))-1])/Nkmt[k-maxMut]))
elif k==n*maxMut:#术语级野生类型
retVec.append(((delta[int(floor(k/float(maxMut)))-1]/Nk[int(floor(k/float(maxMut))-1])*Nkmt[k-maxMut])-mu*((delta[int(floor(k/float(maxMut))-1]/Nk[int(floor(k/float(maxMut)))-1])*Nkmt[k-maxMut]))
其他:#其他一切
(1)1)(Nkmt[k-maxMut-k-maxMut-k-maxMut-k-maxMut-k-k/k[int(地板(k/浮动(k/浮动(k/浮动(maxMut)k/浮动(k/浮动(k/浮动(k/浮动(k/浮动(k/浮动(maxMut)(maxMut)(maxMut)(maxMut))))-1-1-1-1-1-Nkmt-Nkmt[Nkmt[Nkmt[k-Nkmt[k[k[k/k/k/k/浮(k/浮动(k/浮动(k/浮动(k/浮动(k/浮动(k/浮动(k/浮动(k/浮动(maxmu(maxMut)(maxMut)(maxMut)(k/浮动(k/浮动(maxMut)(maxMut)(k/浮动(k))k/浮动(maxMut)))))))mt[k])/Nk[int(floor(k/float(maxMut)))]
返回retVec
Nkmt=Nkmt.tolist()
initCond=[0]*(len(Nkmt))
M_Vec=[0]*maxMut
P_vec=[0]*maxMut
对于范围内的k(len(Nkmt)):
如果k%maxMut==0且k我可以解决它

!/usr/bin/python
导入操作系统、软件、时间、系统、数学
从系统导入*
将numpy作为np导入
将matplotlib.pyplot作为plt导入
来自scipy.integrate import solve_ivp,odeint
从mpmath导入*
mp.dps=30
N0=1
rm=2
nt=1
mg2=1
inf=25
阈值=0.0000000001
porq='p'
pkqk=1
def p(g):
如果porq==“p”:
返回浮动(pkqk)
其他:
回报率2.0/(q(g)*g)
def q(g):
如果porq==“q”:
返回浮动(pkqk)
其他:
回报率2.0/(p(g)*g)
def ddpd(m、g、s):
返回1/(1+q(g)*(m*s*(g-1)-1))
def mc(g,s):
返回ceil(1/(s*(g-1)))
def Dtr(g,k):
返回k*(g-1)
def Dli(g、k、n):
返回NpN0/g**(n-1)+Dtr(g,k)
def Pmul(g、k、n):
如果(k==n):
返回2.0/g
其他:
返回1.0
def Dadd(g、k、n):
如果(k==n):
返回0
其他:
返回值(1-p(g))/2.0
defp(μm,g,k,n):
如果(k-1>=0):
返回值(μ**m/math.gamma(m+1))*((Dli(g,k,n)+Dadd(g,k,n)-1.5)**
m-(Dtr(g,k)+Dadd(g,k,n)-1.5)**m)*(g**k)*Pmul(g,k,n)
其他:
返回值(μ**m/math.gamma(m+1))*(Dli(g,0,n))**m
fileError=open(“Error.txt”,“w+”)
文件=打开(“Pmuem_Master_uuuuuuu”+sys.argv[1]+“uuuuuu”+str(1e-5)+“.txt”,“w+”)
对于范围内的Gamma(int(sys.argv[2]),int(sys.argv[3]):
打印(伽马)
n=int(sys.argv[1])
g=2.0+伽马*0.5
增量=[0]*(n+2)
Nk=[1e20]*(n+2)
maxMut=12
N=1e7*Nk[0]
生命=N
NpN0=N
sumNk=0
对于范围内的k(透镜(Nk)-1):
sumNk+=Nk[k]
对于范围(0,n)内的l:
三角洲[l]=(1./g)**(n-1-l)
三角洲[n]=2.0
三角洲[n+1]=0
p=1
#íp=(2.0/g)
打印(三角洲)
Nkmt=np.zeros((maxMut,n+1)).flatte()#预分配矩阵
Ekmt=np.zeros((maxMut,n+1)).flatte()#预分配矩阵
def Nt(t,Nkmt):
retVec=[]
retVecE=[]
对于范围内的k(len(Ekmt)):
#顶级差异化
如果k%maxMut==0且k>0且kn*maxMut:#具有突变的术语水平
#打印(“带突变的术语级别”,k,int(下限(k/float(maxMut))),k%maxMut,k-maxMut)
追加(((delta[int(floor(k/float(maxMut)))-1]/Nk[int(floor(k/float(maxMut))-1])*Nkmt[k-maxMut])+mu*((delta[int(floor(k/float(maxMut))-1]/Nk[int(floor(k/float(maxMut)))-1])-mu*((delta[int(floor(k/float(k/float(maxMut))-maxMut))-1])/Nkmt[k-maxMut]))
elif k==n*maxMut:#术语级野生类型
#打印(“术语级野生类型”,k,int(下限(k/float(maxMut))),k%maxMut,k-maxMut)
retVec.append(((delta[int(floor(k/float(maxMut)))-1]/Nk[int(floor(k/float(maxMut))-1])*Nkmt[k-maxMut])-mu*((delta[int(floor(k/float(maxMut))-1]/Nk[int(floor(k/float(maxMut)))-1])*Nkmt[k-maxMut]))
其他:#其他一切