【问题标题】:how to use arrays in gekko optimizer for python如何在 Python 的 Gekko 优化器中使用数组
【发布时间】:2018-10-23 08:54:55
【问题描述】:

我尝试通过使用列表 array x[] 而不是变量 x1..x4 来转换来自 gekko python 优化器的示例。这是给出结果的代码,但我认为它不正确

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() 函数。

【问题讨论】:

    标签: python gekko


    【解决方案1】:

    您可以使用 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]]
    

    【讨论】:

    • 我想我现在明白了。谢谢你。祝你开发壁虎好运
    • 我很高兴听到这个消息。让我们知道我们是否可以开发有助于您的应用程序的新功能。
    • 感谢您的回答。我可能会错过一些关于 Gekko 的额外信息来源,但潜在用户发现的关于 Gekko 的第一件事是它的文档和非常有用的 18 个应用程序示例。我认为,如果 m.Array() 用更多的句子来解释,也许还有一个使用 m.Array() 更详细的示例,文档会更好。最好的问候,拉多万
    • 感谢您的建议。这是一个示例(问题 #3):gekko.readthedocs.io/en/latest/examples.html?highlight=array 像您这样的问题对 StackOverflow 也很有帮助。
    • 感谢您向我指出这些示例。我想我已经通过探索和试验 Gekko 对它们进行了多次检查。还有一个问题,如果你不介意的话。如果这已经在某个地方得到回答,我会原谅自己。关于第一个示例(线性方程组),我尝试并未能给出 m.Equations([eq]) 类似 eq = np.dot(A,x) == b 的东西。如何解决一个大型线性方程组? m.Equations() 是否甚至接受通过矩阵操作(乘法、求逆、转置)获得的布尔表达式向量?
    【解决方案2】:

    这个也可以。

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

    【讨论】:

      【解决方案3】:

      这是一个求解线性方程组的简单示例,以及对许多方程使用 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]]
      

      【讨论】:

      • 你能把这个作为一个新问题发布吗?我想我错过了你有另一个问题的答案。
      • 您好,我不确定这个问题。它可能与 m.axb() 函数有关。这是问题的链接stackoverflow.com/q/67217773/5011402
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2023-01-24
      相关资源
      最近更新 更多