Как использовать массивы в оптимизаторе Gekko для Python - PullRequest
0 голосов
/ 23 октября 2018

Я попытался преобразовать пример из оптимизатора gekko python, используя список array x[] вместо переменных x1 .. x4.Это код, который дает результат, но я думаю, что он не верен

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

#help(m)

#define parameter
eq = m.Param(value=40)

#initialize variables
x = [m.Var(value=1,lb=1,ub=5) for i in range(4)]
x[1].value=5
x[2].value=5

#Equations
m.Equation(np.prod([x[i] for i in range(0,4)])>=25)
m.Equation(np.sum([x[i]**2 for i in range(0,4)])==eq)

#Objective
m.Obj(x[0]*x[3]*(x[0]+x[1]+x[2])+x[2])

#Set global options
m.options.IMODE = 3 #steady state optimization

#Solve simulation
m.solve() # solve on public server

#Results
print('')
print('Results')
print('x1: ' + str(x[0].value))
print('x2: ' + str(x[1].value))
print('x3: ' + str(x[2].value))
print('x4: ' + str(x[3].value))

Пожалуйста, кто-нибудь может мне помочь, как использовать список, массив переменных в gekko.Это кажется мне менее элегантным, и мне было интересно, есть ли способ использовать функцию Array () вместо Var ().Я не могу понять, как и когда мы можем использовать функцию Array ().

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Вы можете использовать функцию m.Array GEKKO для создания Переменной, Параметром, FV, MV, SV или CV в качестве 1D или многомерных массивов.Вот пример использования m.Array для объявления переменных.На последующих шагах я определяю начальное предположение и границы.

import numpy as np
from gekko import GEKKO    
m = GEKKO()
x = m.Array(m.Var,(4))
# intial guess
ig = [1,5,5,1]
# lower bounds
i = 0
for xi in x:
    xi.value = ig[i]
    xi.lower = 1
    xi.upper = 5
    i += 1
#Equations
m.Equation(np.prod(x)>=25)
m.Equation(sum(x**2)==40)
#Objective
m.Obj(x[0]*x[3]*(x[0]+x[1]+x[2])+x[2])
m.solve()
print(x)

Вот результаты:

The solution was found.

The final value of the objective function is    17.0140171270735     

 ---------------------------------------------------
 Solver         :  IPOPT (v3.12)
 Solution time  :   9.999999980209395E-003 sec
 Objective      :    17.0140171270735     
 Successful solution
 ---------------------------------------------------

[[1.000000057] [4.74299963] [3.8211500283] [1.3794081795]]
0 голосов
/ 25 апреля 2019

Вот простой пример решения системы линейных уравнений и пример использования цикла for для многих уравнений.

import numpy as np
from gekko import GEKKO

m = GEKKO(remote=False)

# Random 3x3
A = np.random.rand(3,3)
# Random 3x1
b = np.random.rand(3)
# Gekko array 3x1
x = m.Array(m.Var,(3))

# solve Ax = b
eqn = np.dot(A,x)
for i in range(3):
   m.Equation(eqn[i]==b[i])
m.solve(disp=False)
X = [x[i].value for i in range(3)]
print(X)
print(b)
print(np.dot(A,X))

с правильным выводом.С результатом X (np.dot (A, X) == b) - правильно!

[[-0.45756768428], [1.0562541773], [0.10058435163]]
[0.64342498 0.34894335 0.5375324 ]
[[0.64342498]
[0.34894335]
[0.5375324 ]]

В недавнем Gekko 0.2rc6 также появилась функция axb () для линейного программирования.Это может быть та же проблема, решаемая с помощью этой функции, но я не уверен, как получить правильный результат.

m = GEKKO(remote=False)

# Random 3x3
A = np.random.rand(3,3)
# Random 3x1
b = np.random.rand(3)
# Gekko array 3x1
x = m.Array(m.Var,(3))

# solve Ax = b
m.axb(A,b,x=x)
m.solve(disp=False)
X = [x[i].value for i in range(3)]
print(X)
print(b)
print(np.dot(A,X))

но, похоже, я что-то пропустил, потому что вывод не является решением ???С результатом X (np.dot (A, X) == b) - не правильно!

[[0.2560342704], [0.7543346092], [-0.084190799732]]
[0.27262652 0.61028723 0.74616952]
[[0.4201021 ]
[0.5206979 ]
[0.39195592]]
0 голосов
/ 10 ноября 2018

Этот тоже будет работать.

#Equations
m.Equation(np.prod(np.asarray(x))>=25)
m.Equation(np.sum(np.asarray(x)**2)==eq)
...