是否可以通过外部应用程序调用使用 SciPy Optimize

问题描述

我正在尝试使用 scipy.optimize.basinhopping 为具有许多潜在最小值的工程系统问题找到最佳解决方案。

用于估计流体系统条件和属性的分析方程内置于预先存在的非 Python 应用程序中。基于物理学和热力学,这些方程是理想的。然后使用系数修改或“调整”这些方程以匹配在实验室中测量的实际流体特性。我正在尝试使用 scipy.optimize.basinhopping 来找到最佳系数集,以最小化一系列属性(例如:压力、流速、湍流等)的预测误差或预测值与测量值之间的差异。误差是通过所有属性的简单 SSE 来衡量的。例如:

压力误差 = (Pprediced - Pmeasured)^2

Basinhopping 似乎正在努力寻找系统的解决方案,但它非常耗时。主要问题似乎是只有算法的步进部分可以工作,而最小化部分无法与外部应用程序调用一起工作。我正在尝试确定问题是出在我的实现上,还是根本无法使用外部应用程序进行优化。

这是我的实现:

minimizer_kwargs = {"method": "BFGS","options":{"maxiter":1,"disp": True,"return_all": True}}

basinhopping(tuningRun,[ 1.00,1.05,0.80,0.09,-1.22,0.45],niter = 500,minimizer_kwargs=minimizer_kwargs,disp =True))

tuningRun 是调用外部应用程序、插入系数并返回误差/成本函数函数

这是我看到的输出示例:

Solver iterations Final basinhopping output

从求解器迭代来看,成本/误差函数似乎在 BFGS 函数评估之间没有变化。在这种情况下,它保持在 152.08 不变。在这种情况下它的效率特别低,因为应用程序调用非常昂贵(约 70 秒)。同时查看最终输出中的 hess 和 jac 似乎该算法无法收集任何导数。我尝试过其他最小化算法,例如 COBYLA,这似乎并没有改变最小化问题。我的问题是是否有可能改进我的实现,以便盆地跳跃算法可以使用差异来采取更有效的步骤,或者在这种情况下是否不可能(因为正在优化的函数不在 python 中)并且我应该覆盖/转向-关闭最小化功能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)