型号SIR配件

时间:2016-07-11 16:15:14

标签: python model curve-fitting

我编写了一个程序,用欧拉方法求解模型SIR方程组。我想找到适合某些实验数据的参数beta和gamma。

def SIR(I0,beta,gama,dt,tmax):

    N=int(tmax/dt)+1 
    T=zeros([N+1,3])
    T[0,0]=1-I0
    T[0,1]=I0
    for i in range(N):
        T[i+1,0]=T[i,0]-dt*beta*T[i,0]*T[i,1]
        T[i+1,1]=T[i,1]+dt*T[i,1]*(beta*T[i,0]-gama)
        T[i+1,2]=T[i,2]+dt*gama*T[i,1]
    return(T)

我尝试使用scipy.optimize.curvefit,它只适用于返回表达式的简单函数。如何将它用于返回数组的函数?

对于一个简单的功能,它可以很好地工作

import numpy as np 
from scipy.optimize import curve_fit 

from matplotlib.pyplot import *

fluo = [ 16059919, 13988972, 6697838, 4273231, 3259139, 3032325, 3153090 ]

conc = [ 5, 10, 30, 50, 75, 100, 130 ]

fluo = np.array(fluo)

conc = np.array(conc)

def model(L, Ka, n):

    F0 = fluo[0] # On fixe F0, c'est la première valeur de F
    Fc = fluo[5] # On fixe Fc, c'est la dernière valeur de F

    #F est exprimé en fonction du reste
    F = (Fc * Ka * (L**n) + F0) / (Ka * (L**n) + 1)

    #On retourne F
    return F

popt, pcov = curve_fit(model, conc, fluo, maxfev=3000)

print(popt)

plot(conc, fluo, 'rp') # Trace fluo = f(conc)
plot(conc, model(conc, popt[0], popt[1]), "b") 

grid(True)

show()

0 个答案:

没有答案