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

有界变量的GEKKO优化如何工作?

如何解决有界变量的GEKKO优化如何工作?

我正在使用GEKKO估计一个微分方程的参数,并且将一个变量限制在0到1之间。但是,当我求解ODE时,得到的值超出了该变量的范围,所以我想知道是否有人知道GEKKO如何找到解决方案,因为这可能有助于我解决问题。 这是我用来拟合数据的代码。这给了我x和u的解,其中x在0和1之间。

但是,此后,我尝试使用scipy.integrate.solve_ivp求解ODE,其初始值为u,而针对u的解决方案不在此范围之内。因为它应该是唯一的,所以我想知道GEKKO寻找解决方案的过程是什么(它是否将值约束到边界上或如何处理?)任何评论都非常感谢。

这是MVCE。如果运行它,您会发现使用GEKKO可以获得边界之间的解决方案,然后当我使用solve_ivp解决ODE时,不会得到相同的解决方案。您能解释一下为什么会发生这种情况吗,我该如何处理?我想使用solve_ivp来预测下一个值。

num

因为我有Gekko 0.2.8,所以Gekko的版本不是问题,所以我想知道它是否与变量的初始化有关。我运行了我在spyder上发布的示例(我正在使用google colab),并且得到了正确的解决方案,但是当我运行其余的情况时,我又对u有了负值(使用solve_ivp求解),这很奇怪。 / p>

解决方法

创建变量时,可以通过设置lb(下限)和ub(上限)来为变量添加边界。

z = m.Var(lb=0,ub=10)

创建变量后,边界将用.lower.upper进行调整。

z.LOWER = 1
z.UPPER = 9

这是一个示例问题,显示了x被限制为大于0.5的范围的使用。

from gekko import GEKKO

t_data = [0,0.1,0.2,0.4,0.8,1]
x_data = [2.0,1.6,1.2,0.7,0.3,0.15]

m = GEKKO(remote=False)
m.time = t_data
x = m.CV(value=x_data,lb=0.5,ub=3); x.FSTATUS = 1  # fit to measurement
k = m.FV(); k.STATUS = 1               # adjustable parameter
m.Equation(x.dt()== -k * x)            # differential equation

m.options.IMODE = 5   # dynamic estimation
m.options.NODES = 5   # collocation nodes
m.solve(disp=False)   # display solver output
k = k.value[0]; print(k)

结果图显示出边界已强制执行,但由于边界约束较低(x>=0.5,模型预测不适合数据。

https://www.getambassador.io/docs/latest/topics/running/services/tracing-service/

import numpy as np
import matplotlib.pyplot as plt  # plot solution
plt.plot(m.time,x.value,'bo',\
         label='Predicted (k='+str(np.round(k,2))+')')
plt.plot(m.time,x_data,'rx',label='Measured')
# plot exact solution
t = np.linspace(0,1); xe = 2*np.exp(-k*t)
plt.plot(t,xe,'k:',label='Exact Solution')
plt.legend()
plt.xlabel('Time'),plt.ylabel('Value')
plt.show()

在没有限制性下界的情况下,求解器会进行优化以最适合点。

x = m.CV(value=x_data,lb=0.0,ub=3)

Parameter fit

对问题编辑回复1

变量(例如u)超出范围的唯一方法是,如果求解器未报告成功的解决方案。要报告成功的解决方案,求解器必须满足Parameter regression的最优性。我建议您通过在m.options.APPSTATUS==1命令之后检查m.solve()来检查它是否满足所有方程式。如果您可以包括具有示例数据的MVCE(Karush Kuhn Tucker conditions),以便脚本可以运行,那么我们可以帮助您进行检查。

对问题编辑回答2

感谢您提供一个最小的可复制示例。这是我用Gekko 0.2.8获得的结果。如果使用的是较早版本,建议您使用pip install gekko --upgrade进行升级。

https://stackoverflow.com/help/minimal-reproducible-example

求解器报告成功的解决方案。

EXIT: Optimal Solution Found.

 The solution was found.

 The final value of the objective function is  0.03164650667928192
 
 ---------------------------------------------------
 Solver         :  IPOPT (v3.12)
 Solution time  :  0.23339999999999997 sec
 Objective      :  0.0316473666078486
 Successful solution
 ---------------------------------------------------

满足约束x>=00<=u<=1。较旧版本的Gekko可能只是一个问题吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。