Python 如何通过拟合实验数据来估计复微分方程组的参数?

Python 如何通过拟合实验数据来估计复微分方程组的参数?,python,gekko,Python,Gekko,我试图用python中的gekko来估计以下微分方程组的参数,但得到了一些错误。以下是我正在使用的方程式: 使用的代码是: from gekko import GEKKO #experimental data t_data=[0,2,4,6,8,10,12,14,16,18,20] x_data=[0.0844,0.2068,0.8046,1.8019,2.4655,2.7467,2.7765,2.6966,2.6529,2.6605,2.5464] L_data=[0,18.194

我试图用python中的gekko来估计以下微分方程组的参数,但得到了一些错误。以下是我正在使用的方程式:

使用的代码是:

from gekko import GEKKO

#experimental data
t_data=[0,2,4,6,8,10,12,14,16,18,20]
x_data=[0.0844,0.2068,0.8046,1.8019,2.4655,2.7467,2.7765,2.6966,2.6529,2.6605,2.5464]    
L_data=[0,18.194,36.389,540.069,958.987,1326.418,1069.154,1195.935,1256.966,1422.267,1267.442]
c_data=[9.845,9.4193,9.0340,7.6427,5.9962,5.2468,4.1849,4.4343,4.2462,3.8870,3.6511]
s_data=[5.0619,4.3798,2.6438,0.6220,0.557,0.492,0.4268,0.415,0.4017,0.395,0.3906]

m = GEKKO(remote=False)
m.time = t_data
x = m.CV(value=x_data); x.FSTATUS = 1  # fit to measurements
L = m.CV(value=L_data); L.FSTATUS = 1
c = m.CV(value=c_data); c.FSTATUS = 1
s = m.CV(value=s_data); s.FSTATUS = 1

umax = m.FV(); umax.STATUS = 1         # adjustable parameters
kc = m.FV(); kc.STATUS = 1
smin = m.FV(); smin.STATUS = 1              
ks = m.FV(); ks.STATUS = 1
kd = m.FV(); kd.STATUS = 1
a = m.FV(); a.STATUS = 1              
b = m.FV(); b.STATUS = 1
yxc = m.FV(); yxc.STATUS = 1
q = m.FV(); q.STATUS = 1              
yxs = m.FV(); yxs.STATUS = 1

# differential equations
m.Equation(x.dt() == umax*(c/(kc+c))*((s-smin)/(ks+s-smin))*x-kd*x )           
m.Equation(L.dt() == a*x.dt()+b*x)
m.Equation(c.dt() == (-1/yxc)*x.dt()-q*x*(c/(kc+c)))
m.Equation(s.dt() == (-1/yxs)*umax*(c/(kc+c))*((s-smin)/(ks+s-smin))*x)

#Global Options
m.options.IMODE   = 5
m.options.EV_TYPE = 2 
m.options.NODES   = 3 
m.options.SOLVER  = 3 

m.solve()
执行代码后,我出现以下错误:

**错误**:异常:访问冲突
文件MUMPS/src/dmumps_part2.F的第2683行
回溯:不可用,使用-ftrace=frame或-ftrace=full编译
**错误**:未找到“results.json”。查看上面的其他错误详细信息
回溯(最近一次呼叫最后一次):
文件“C:\Users\vcham\Desktop\2020\belgium\python\parameter estimation bg\test2.py”,第56行,在
m、 解决()
文件“C:\Users\vcham\anaconda3\lib\site packages\gekko\gekko.py”,第2145行,在solve中
self.load_JSON()
文件“C:\Users\vcham\anaconda3\lib\site packages\gekko\gk\u post\u solve.py”,第13行,在load\u JSON中
f=open(os.path.join(self.\u path,'options.json'))
FileNotFoundError:[Errno 2]没有这样的文件或目录:“C:\\Users\\vcham\\AppData\\Local\\Temp\\tmplna43pbhgk\u model1\\options.json”

请给我一个克服这些错误的解决方案或估计参数的方法。提前感谢

带有线性解算器腮腺炎的IPOPT解算器在试图解决问题时崩溃。获得成功解决方案的一种方法是使用
m.options.solver=1
切换到APOPT解算器,并对
FV
参数设置上限和下限

从gekko导入gekko
#实验数据
t_数据=[0,2,4,6,8,10,12,14,16,18,20]
x_数据=[0.0844,0.2068,0.8046,1.8019,2.4655,2.7467,2.7765,2.6966,2.6529,2.6605,2.5464]
L_数据=[0,18.194,36.389540.069958.9871326.4181069.1541195.9351256.9661422.2671267.442]
c_数据=[9.845,9.4193,9.0340,7.6427,5.9962,5.2468,4.1849,4.4343,4.2462,3.8870,3.6511]
s_数据=[5.0619,4.3798,2.6438,0.6220,0.557,0.492,0.4268,0.415,0.4017,0.395,0.3906]
m=GEKKO(远程=False)
m、 时间=t_数据
x=m.CV(值=x_数据);x、 FSTATUS=1#适合测量
L=m.CV(值=L_数据);L.FSTATUS=1
c=m.CV(值=c_数据);c、 FSTATUS=1
s=m.CV(值=s_数据);s、 FSTATUS=1
umax=m.FV(1,lb=0.1,ub=10);umax.STATUS=1#可调参数
kc=m.FV(1,lb=0.1,ub=10);kc.STATUS=1
smin=m.FV(1,lb=0.1,ub=10);smin.STATUS=1
ks=m.FV(1,lb=0.1,ub=10);ks.STATUS=1
kd=m.FV(1,lb=0.1,ub=10);kd.STATUS=1
a=m.FV(1,lb=0.1,ub=10);a、 状态=1
b=m.FV(1,lb=0.1,ub=10);b、 状态=1
yxc=m.FV(1,lb=0.1,ub=10);yxc.STATUS=1
q=m.FV(1,磅=0.1,ub=10);q、 状态=1
yxs=m.FV(1,lb=0.1,ub=10);yxs.STATUS=1
#微分方程
m、 方程(x.dt()==umax*(c/(kc+c))*((s-smin)/(ks+s-smin))*x-kd*x)
m、 方程(L.dt()==a*x.dt()+b*x)
m、 方程(c.dt()==(-1/yxc)*x.dt()-q*x*(c/(kc+c)))
m、 方程(s.dt()==(-1/yxs)*umax*(c/(kc+c))*((s-smin)/(ks+s-smin))*x)
#全球选择
m、 options.IMODE=5
m、 options.EV_TYPE=2
m、 options.NODES=3
m、 options.SOLVER=1
m、 解决()
打印('umax:'+str(umax.value[0]))
打印('kc:'+str(kc.value[0]))
打印('smin:'+str(smin.value[0]))
打印('ks:'+str(ks.value[0]))
打印('kd:'+str(kd.value[0]))
打印('a:'+str(a.value[0]))
打印('b:'+str(b.value[0]))
打印('yxc:'+str(yxc.value[0]))
打印('q:'+str(q.value[0]))
打印('yxs:'+str(yxs.value[0]))
将matplotlib.pyplot作为plt导入
plt.子地块(4,1,1)
plt.绘图(t_数据,x.值)
plt.绘图(t_数据、x_数据)
plt.子地块(4,1,2)
plt.绘图(t_数据,L.值)
plt.绘图(t_数据、L_数据)
plt.子地块(4,1,3)
plt.绘图(t_数据,c.值)
plt.绘图(t_数据、c_数据)
plt.子地块(4,1,4)
plt.绘图(t_数据,s.值)
plt.绘图(t_数据、s_数据)
plt.show()
我对所有参数应用了
0.1
的下限和
10.0
的上限,但这些参数可能需要修改,因为一些解决方案在该下限处完成。我建议您扩大(*)的边界,直到最佳解决方案没有在边界处结束。报告的解决方案是:

umax: 10.0*
kc: 0.1*
smin: 0.11236933654
ks: 6.2350087285
kd: 0.20089406528
a: 10.0*
b: 10.0*
yxc: 1.6785099655
q: 0.1*
yxs: 6.7395055839