Множители (маргиналы) Лагранжа в Гекко - PullRequest
4 голосов
/ 27 мая 2020

Есть ли в Gekko один лайнер для получения множителей Лагранжа (подобные маргинальному в GAMS) или, если нет ни одной строчки, другим способом?

Спасибо за помощь.

1 Ответ

3 голосов
/ 27 мая 2020

Вот одна строка для получения множителей Лагранжа.

lam = np.loadtxt(m.path + '/apm_lam.txt')

Вам нужно будет установить уровень диагностики c на m.options.DIAGLEVEL=2 и решить локально с помощью m=GEKKO(remote=False). Вы можете увидеть некоторые другие файлы, созданные с помощью DIAGLEVEL=2, когда вы откроете папку с помощью m.open_folder(). Вот тестовый сценарий.

from gekko import GEKKO    
import numpy as np
m = GEKKO(remote=False)

#initialize variables
xi = [1,5,5,1]
x1,x2,x3,x4 = [m.Var(xi[i],lb=1,ub=5) for i in range(4)]

m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)

m.Obj(x1*x4*(x1+x2+x3)+x3)

m.options.DIAGLEVEL=2

m.solve(disp=False)

print('')
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))

print('Lagrange multipliers')
lam = np.loadtxt(m.path + '/apm_lam.txt')
print(lam)

Результат:

Results
x1: [1.000000057]
x2: [4.74299963]
x3: [3.8211500283]
x4: [1.3794081795]
Lagrange multipliers
[-0.55227642  0.16143862]
...