我希望使用 Pyomo 优化 Fortran 函数。目标函数和约束都是用 Fortran 编写的。根据给出的答案here, 我们可以用ExternalFunction
表达式对象。但即使是最简单的函数我也无法得到结果。下面给出的是一个可重现的示例,其中包含 Fortran 函数、python (Python 2.7.12) 脚本、为优化而执行的命令以及错误。
Fortran 函数文件(funcs.f
) -
SUBROUTINE OBJ1(ARG,OBJ)
DOUBLE PRECISION, INTENT(IN) :: ARG(2)
DOUBLE PRECISION, INTENT(OUT) :: OBJ
OBJ = ARG(1)+ARG(2)
RETURN
END SUBROUTINE
Python 脚本(pytest.py
) -
import funcs
from pyomo.environ import *
from pyomo.opt import *
from pyomo.core import *
m = ConcreteModel()
m.a = Var(RangeSet(1,2),within=NonNegativeReals,bounds=(0,10))
m.f = ExternalFunction(library='funcs.so',function='OBJ1')
expr = m.f(m.a)
m.obj = Objective(expr=expr,sense=minimize)
opt = SolverFactory('ipopt')
results = opt.solve(m,tee=True)
print(results)
在终端执行的命令 -
>> f2py -c -m funcs funcs.f
>> python pytest.py
Error -
File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/external.py", line 160, in load_library
FUNCADD(('funcadd_ASL', self._so))(byref(AE))
AttributeError: /home/utkarsh/Desktop/python/modules/blackboxOptimization/funcs.so: undefined symbol: funcadd_ASL
我只给出了我认为相关的一小部分错误。
鉴于此,我有以下问题 -
如何使用 pyomo 成功解决这个无约束优化问题?
对于我的完整项目,我必须在 Fortran 本身中给出约束。约束子例程将返回一个实数,该实数将使用 pyomo 进行限制。如何对这些类型的约束进行建模?
我假设 Pyomo 将这个黑匣子视为非线性优化。因此,我正在使用ipopt
求解器。这个假设正确吗?
软件包的版本 -
Pyomo - 5.5.1 (VOTD)(Linux 4.4.0-127-generic 上的 CPython 2.7.12)
ipopt - ipopt 3.12.8
f2py - 与 numpy 1.16.2 一起安装
感谢您的帮助!