Я пытаюсь вызвать из Matlab пользовательскую функцию, которая ссылается на переменные, ранее определенные в Python.
Последовательность событий следующая:
Определитьпеременные в Python, включая функцию (fminconMaster_py), которая использует 2 анонимные функции, которые принимают аргумент 'x' (fun_py, obj_py)
Вызов функции Matlab (optim_mat), которая использует алгоритм fminconдля задачи оптимизации - эта задача оптимизации имеет 2 анонимные функции (fun_mat, obj_mat), определенные в Matlab (цель и ограничения)
Всякий раз, когда целью Matlab и ограничениями являются анонимные функции (fun_mat, obj_mat)Вызванные подпрограммой fmincon, они указывают на функцию matlab (fupdate), которая вызывает fminconMaster_py, который, в свою очередь, ссылается на анонимную функцию python fun_py и obj_py
Проблема заключается в том, что когда происходит 3, fminconMaster_py, определенный в Python, не распознает fun_py и obj_py ("Python Error: NameError: имя xxx не определено ")
См. код ниже
Python-код для fminconMaster_py (вызов fun_py и obj_py)
def fminconMaster_py(x):
validNonLinearUpperConstraint = Cu != np.Inf
validNonLinearLowerConstraint = Cl != -np.Inf
nonLinearUpperConstraint = Cu[validNonLinearUpperConstraint]
nonLinearLowerConstraint = Cl[validNonLinearLowerConstraint]
cUpper = fun_py (x)[validNonLinearUpperConstraint] - nonLinearUpperConstraint
cLower = nonLinearLowerConstraint - fun_py (x)[validNonLinearLowerConstraint]
c= np.vstack(cUpper, cLower)
obj = obj_py(x)
return obj, c
Matlab-код для fupdate
pyfunction='pythonModule.fminconMaster_py'
function [J, cin, gJ, gcin] = fupdate(x)
eval(['output = py.', pyfunction, '(x);'])
...
end
Ошибка возникает, когда fupdate вычисляет выражение, поскольку некоторые переменные не определены в fminconMaster_py (Cu, Cl, fun_py, obj_py).См. Вставленную ниже ошибку
Python Error: NameError: name 'Cu' is not defined
Error in optimize/obj (line 69)
[J, cin, gJ, gcin] = fupdate(x);
Error in fmincon (line 546)
initVals.f = feval(funfcn{3},X,varargin{:});
Error in optimize (line 34)
[xopt, fopt, exitflag, optoutput] = fmincon(@obj, x0, A, b, Aeq, beq, lb, ub, @con, opt);
Caused by:
Failure in initial objective function evaluation. FMINCON cannot continue.
Я мог бы передать Cu и Cl в качестве аргументов, поскольку они являются массивами, но fun_py и obj_py - сложные функции, которые я построил в Python
Любая идея, как это исправить?