问题描述
注意:Fit differential equation with scipy 已经尝试过,还有其他一些答案。似乎都没有工作。
我有两个数据集 d1 和 d2,我试图将它们与两个耦合的 ODE(下面给出的求解器)相匹配。 d1 和 d2 对应于实验控制和处理的实验室数据。
当我对第一个 ODE(仅控制情况)进行拟合时,它工作正常,并且我得到了所需的参数。当我对处理案例做同样的事情时,使用从控制案例获得的拟合参数,我的代码似乎没有优化任何东西。
from scipy.integrate import odeint
import scipy
d1 = [113.75981939,224.732254,437.00727486,533.3249591,900.19498288,1460.34662166,2276.34857406,3288.90246842,3888.70188293,5102.45452895]
d2 = [118.69478959,201.30146742,287.50835473,437.70461121,511.9610845,982.88626039,1115.37610645,1235.95872766,1622.57717685,1776.95184626]
time = [ 1,3,5,7,9,11,13,15,17,19]
'''
#ODE's
dS/dt = r*S*(1-(S/K))-(kappa*S*T)
dT/dt = a*S-d*T
'''
#Curve Fit Section
#First get r,K from control data,i.e,case where kappa = 0
def func(y,t,r,K):
S = y
dydt = r*S*(1-(S/K))
return dydt
y0 = [100]
t = time
guess = [0.3,5000] #[guess_r,guess_K]
def fit(params):
r,K = params
test_solve = odeint(func,y0,args=(r,K))
return np.linalg.norm(test_solve[:,0]-d1)
res = scipy.optimize.minimize(fit,np.array(guess))
r,K = res.x #Returns the r,K parameter values that fit the control data perfectly.
#Curve fit for treatment case
#ODE Solver for Control and Treatment Model
def func(y,K,a,kappa,d):
S,T = y
dydt = [r*S*(1-(S/K))-(kappa*S*T),a*S-d*T]
return dydt
y0 = [100,0]
t = time
guess_t = [r,2,0.01]
#Fitting the experimental data set
def fit(params):
r,d,kappa = params
test_solve = odeint(func,kappa))
return np.linalg.norm(test_solve[:,0]-d2)
res2 = scipy.optimize.minimize(fit,np.array(guess_t))
result - res2.x 与 guess_t 数组相同 - 没有变化,即不适合
当我在使用从第一个获得的参数后尝试第二个拟合时,我没有得到任何有意义的结果。它不起作用。我在这里做错了什么?
EDIT :参数值(来自 Matlab 拟合)- r=0.2629,K=7625.2,a=7.845,d=189.49. k =0.0026
。上面的代码为 r & K
返回非常相似的值,但不是为其他 3 个参数 (a,d
) 返回。不知道发生了什么。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)