Как указать нелинейные ограничения в CVXPY? - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в пакете CVXPY и пытаюсь портировать старый код оптимизации Matlab, который использует fmincon (x) с нелинейными ограничениями для CVXPY. При этом я продолжаю получать различные исключения ошибок. когда я использовал различные комбинации cp.Variable () и cp.Parameter ().

Таким образом, я в недоумении от того, что я делаю неправильно, поэтому я надеялся, что кто-нибудь сможет дать мне совет о том, как достичь моей цели.

Наконец, обратите внимание, что я не проектировал и не реализовывал оригинальный код Matlab. Я унаследовал кодовую базу и меня попросили преобразовать его в Python. Ниже приведен код MATLAB и соответствующий код CVXPY:

Фрагменты кода Matlab:

  % Third: define the nonlinear constraint function:
    function [cin, ceq] = nonlcon(x)
        cin = -1;
        ceq = x'*H*x - sd.^2;   % where H and sd are global.
    end

...

[O(4:k+3, i), fval, O(k+4, i)] = ...
     fmincon(@objfun, O(4:k+3, i-1), ABar, uBar, PHI, Nu, cBar, bBar, @nonlcon, options);

Фрагменты кода CVXPY:

def nonlcon(x, H, sd):
    # Algorithmic definition of the nonlinear constraint function
    cin = -1.
    ceq = (x.T @ H @ x) - sd**2   # where H and sd are global.

    out_params = (cin, ceq)

    return(out_params)

...

if callable(nonlcon):
    if len(nonlcon_args) == 2:
        (H, sd) = nonlcon_args
        cin = lambda x: np.negative(nonlcon(x, H, sd)[0])
        ceq = lambda x: nonlcon(x, H, sd)[1]
    else:
        cin = lambda x: np.negative(nonlcon(x)[0])
        ceq = lambda x: nonlcon(x)[1]

...

  if callable(nonlcon):
        c_in = cp.Variable()
        c_in.value = np.array(cin(x_hat))

        c_eq = cp.Variable()
        c_eq.value = np.array(ceq(x_hat))

        constraints += [c_in <= 0,
                                c_eq == 0]

    prob = cp.Problem(cp.Minimize(obj_f(x_hat)),
                                   constraints)

Последнее сообщение об ошибке CVXPY:

TypeError: неверный тип операнда для abs (): 'AddExpression'

Результаты различных комбинаций реализации определения нелинейных ограничений вместе с полученным сообщением об ошибке:

Наблюдаемые ошибки нелинейного ограничения CVXPY:

Использование реализации:

 c_in = cp.Parameter()
 c_in.value = cin(x_hat)

 c_eq = cp.Variable((1,))
 c_eq.value = ceq(x_hat)

TypeError: недопустимый тип для значения константы.

Использование реализации:

 c_in = cp.Variable((1,))
 c_in.value = cin(x_hat)

 c_eq = cp.Variable((1,))
 c_eq.value = ceq(x_hat)

ValueError: Неверные измерения () для значения переменной.

Использование реализации:

 c_in = cp.Parameter()
 c_in.value = cin(x_hat)

 c_eq = cp.Parameter()
 c_eq.value = ceq(x_hat)

TypeError: недопустимый тип для значения константы.

Использование реализации:

 c_in = cp.Parameter()
 c_in.value = cin(x_hat)

 c_eq = cp.Variable()
 c_eq.value = ceq(x_hat)

Ошибка типа: не является допустимый тип для значения константы.

Использование реализации:

 c_in = cp.Variable()
 c_in.value = cin(x_hat)

 c_eq = cp.Variable()
 c_eq.value = ceq(x_hat)

TypeError : недопустимый тип для значения константы.

Использование реализации:

 c_in = cp.Variable()
 c_in.value = np.array(cin(x_hat))

 c_eq = cp.Variable()
 c_eq.value = np.array(ceq(x_hat))

Ошибка типа: неверный тип операнда для abs (): 'AddExpression'

Использование реализации :

c_in = cp.Parameter()
c_in.value = cin(x_hat)

# c_eq = cp.Variable()
# c_eq.value = ceq(x_hat)

constraints += [c_in <= 0,
                ceq(x_hat) == 0]

DCPError: Проблема не соответствует правилам DCP. В частности: Следующие ограничения не являются DCP:

Использование реализации:

# c_in = cp.Parameter()
# c_in.value = cin(x_hat)

# c_eq = cp.Variable()
# c_eq.value = ceq(x_hat)

constraints += [cin(x_hat) <= 0,
                ceq(x_hat) == 0]

AttributeError: 'numpy .bool_' объект не имеет атрибута 'variable'

Really надеясь, что кто-то может объяснить мне, что я делаю неправильно.

Заранее спасибо ...

Крис

...