我编写了一个程序,用欧拉方法求解模型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()