Я хочу оптимизировать функцию Фортрана, используя Pyomo. И целевая функция, и ограничения написаны на фортране. Основываясь на ответе здесь , мы можем использовать ExternalFunction
объект выражения. Но я не могу получить результаты даже для самой простой функции. Ниже приведен воспроизводимый пример, который состоит из функции Фортрана, скрипта 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
Ошибка -
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?
Для моего полного проекта мне придется дать ограничения в самом Фортране. Подпрограммы ограничения вернут действительное число, которое будет ограничено с помощью pyomo. Как смоделировать этот тип ограничений?
Я предполагаю, что Pyomo использует этот черный ящик как нелинейную оптимизацию. Следовательно, я использую ipopt
решатель. Это предположение верно?
Версии пакетов -
Pyomo - 5.5.1 (VOTD) (CPython 2.7.12 в Linux 4.4.0-127-generic)
ipopt - Ipopt 3.12.8
f2py - устанавливается вместе с numpy 1.16.2
Спасибо за вашу помощь!