Я изменил проблему, чтобы соответствовать вашему утверждению. Существует также понимание списка, которое упрощает процесс определения новых переменных с верхними и нижними границами. Следующий скрипт показывает два способа доступа к test_function(x)
с (1) переменными Gekko, которые являются символами c выражениями или (2) со значениями чисел c для оценки этого ограничения и целевой функции.
import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False)
def test_function(x):
return np.dot(x, x)
ig = [1, 5, 5, 1] # initial guess
A = np.array([m.Var(value=ig[i],lb=0,ub=10000,name='a'+str(i)) \
for i in range(4)])
m.Equation(test_function(A)>2500)
m.Equation(test_function(A)<10000)
m.Minimize(test_function(A))
m.solve()
# extract values to get a numerical solution of test_function
A_sol = [A[i].value[0] for i in range(4)]
print(test_function(A_sol))
# get the objective function value from the solver
print(m.options.OBJFCNVAL)
# print variables
print (A)
Результаты скрипта приведены ниже. Если вы используете print(test_function(A_sol))
, он печатает символьное выражение c, которое Gekko использует для поиска решения. В вашем случае вас может заинтересовать решение цифр c, а не форма символов c.
# results
2499.999999993099
2500.0
[[14.90599615] [32.059495922] [32.059495922] [14.90599615]]
Оба m.options.OBJFCNVAL
и вычисление выражения дают один и тот же результат, но немного отличаются, потому что точности станка.