微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个 ODE 同时拟合 Scipy 中的数据

如何解决两个 ODE 同时拟合 Scipy 中的数据

注意: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 举报,一经查实,本站将立刻删除。