我尝试通过使用列表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()函数。
答案 0 :(得分:3)
这也可以。
#Equations
m.Equation(np.prod(np.asarray(x))>=25)
m.Equation(np.sum(np.asarray(x)**2)==eq)
答案 1 :(得分:2)
您可以使用m.Array GEKKO函数将变量,参数,FV,MV,SV或CV创建为一维或多维数组。这是使用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]]
答案 2 :(得分:0)
这是求解线性方程组的简单示例,也是对许多方程使用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]]