Ошибка GEKKO: уравнение без равенства (=) или неравенства (›,‹) при вызове функций в пределах ограничения и цели

Я получаю указанную ниже ошибку для своего кода, и я полностью не понимаю источник ошибки:

@error: Equation Definition
Equation without an equality (=) or inequality (>,<)
true
STOPPING...

Я пытаюсь определить решение «x», которое минимизирует результат функции «was_constraint» при соблюдении ограничения, установленного «warf_moodys_constraint». Функции возвращают значение с плавающей запятой, и когда я просто передаю начальный начальный вектор «x» каждой функции отдельно, я не получаю никаких ошибок, исходящих от этих функций. Может ли кто-нибудь посоветовать, где я могу ошибаться?

def was_constraint(sol_g, df, orig):
    sol = gekko_to_numpy(sol_g)
    x1 = orig.loc["Denominator","WAS"]*orig.loc["Current","WAS"]
    x2 = (sol*df["All-In Rate"]).sum()/100
    y1 = orig.loc["Denominator","WAS"]+sum(sol)
    return y1/(x1+x2)

def warf_moodys_constraint(sol_g, df, orig):
    sol = gekko_to_numpy(sol_g)
    x1 = orig.loc["Denominator","Moodys WARF"]*orig.loc["Current","Moodys WARF"]
    x2 = sum(np.where(sol > 0, sol*df["Moody's WARF"], 0))
    y1 = orig.loc["Denominator","Moodys WARF"] +sum(np.where(sol > 0, sol, 0))
    return 3000 - (x1+x2)/y1 

def gekko_to_numpy(sol_g):
    res = np.zeros(len(sol_g))
    for i in range(len(sol_g)):
        res[i] = sol_g[i].value.value
    return res

clo_data = pd.read_excel('CLO.xlsx', sheet_name='CLO')
m = GEKKO()
x = [m.Var() for i in range(len(clo_data["Holdings"]))]

for i in range(len(clo_data["Lower Bound"])):
    x[i].lower = 0
    x[i].upper = 1000000

m.Equation(warf_moodys_constraint(x, clo_data, metrics)>=0)
m.Obj(was_constraint(x, clo_data, metrics))
m.options.IMODE = 3 #steady state optimization
m.solve()

person Toby-wan    schedule 14.09.2020    source источник


Ответы (1)


Вам необходимо определить уравнения в терминах переменных Гекко. Подход к преобразованию переменных Gekko в массив Numpy не будет работать для определения уравнений, потому что Gekko не выполняет обратный вызов функций Python.

def gekko_to_numpy(sol_g):
    res = np.zeros(len(sol_g))
    for i in range(len(sol_g)):
        res[i] = sol_g[i].value.value
    return res

Gekko строит модель gk_model0.apm в папке выполнения, которую вы можете увидеть с помощью m.open_folder(). Когда вы решаете с помощью m.solve(), Gekko компилирует модель в байт-код и решает ее с помощью разреженных нелинейных решателей, таких как IPOPT или APOPT. Если вы не можете использовать переменные Gekko, возможно, функция scipy.opitimize.minimize() будет лучшим выбором. Вот руководство по этому оптимизатору.

person John Hedengren    schedule 15.09.2020