python - GEKKO Python + IPOPT 最小化 delta-V

标签 python optimization gekko

我的 Python 中的 GEKKO 模型如下:

# Initialize model
m = GEKKO()

# Manipulating variables and initial guesses
launch = m.MV(value = np.array([2460310.5, 0, 0]), lb = np.array([2460310.5, 0, 0]), ub = np.array([2460340.5, 0, 0]))
launch.STATUS = 1
flyby = m.MV(value = np.array([2460575.5, 0, 0]), lb = np.array([2460493.5, 0, 0]), ub = np.array([2460340.5, 0, 0])) # Venus/Mars
# flyby = m.MV(value = 2460997.5, lb = 2460887.5, ub = 2460908.5) # Jupiter
flyby.STATUS = 1
arrive = m.MV(value = np.array([2460845.5, 0, 0]), lb = np.array([2460631.5, 0, 0]), ub = np.array([2460660.5])) # Venus/Mars
# arrive = m.MV(value = 2461534.5, lb = 2461250.5, ub = 2461658.5) # Jupiter
arrive.STATUS = 1

# Variables
r1 = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e10, -1e10, -1e10]), ub = np.array([1e10, 1e10, 1e10]), name = "r1")
v1 = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e5, -1e5, -1e5]), ub = np.array([1e5, 1e5, 1e5]), name = "v1")
r2 = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e10, -1e10, -1e10]), ub = np.array([1e10, 1e10, 1e10]), name = "r2")
v2 = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e5, -1e5, -1e5]), ub = np.array([1e5, 1e5, 1e5]), name = "v2")
r3 = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e10, -1e10, -1e10]), ub = np.array([1e10, 1e10, 1e10]), name = "r3")
v3 = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e5, -1e5, -1e5]), ub = np.array([1e5, 1e5, 1e5]), name = "v3")
l = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e5, -1e5, -1e5]), ub = np.array([1e5, 1e5, 1e5]), name = "launch")
imp = m.Var(value = np.array([0, 0, 0]), lb = np.array([-1e5, -1e5, -1e5]), ub = np.array([1e5, 1e5, 1e5]), name = "impulse")

# Objective function
dV = m.FV(value = m.sqrt(imp[0]**2 + imp[1]**2 + imp[2]**2), lb = 0, ub = 10000)
dV.STATUS = 1

# Slingshot maneuver
r1, v1, r2, v2, r3, v3, l_mag, imp_mag, v_final = slingshot()

m.Obj(dV) #minimize delta-V
m.options.IMODE = 6 # non-linear model
m.options.SOLVER = 3 # solver (IPOPT)
m.options.MAX_ITER = 15000
m.options.RTOL = 1e-7
m.options.OTOL = 1e-7
m.solve(disp=False) # Solve

当我运行它时,我收到以下错误消息:

Exception: Data arrays must have the same length, and match time discretization in dynamic problems

我尝试了以下方法,但没有成功:

  • 修改 m.Var 变量的数据类型
  • 将我的 m.MV 变量修改为数组(我真的只需要那些第一个值)
  • 我以前有一个 m.time,但意识到我不需要它并将其取出(与没有相同的错误)

“r”值是半径,“v”值是速度; 'l' 和 'imp' 是速度变化。

最佳答案

m.time 向量需要与用于提供value 的 numpy 数组具有相同的维度。 value 可以是单个值,也可以是 m.time 的大小。在这种情况下,需要定义3个时间点。要使用 img[0]...img[2],需要定义一个数组来创建该变量列表。每个变量都有 3 个值,这些值在相应的 m.time 点处求解。 slingshot() 函数未定义。即使已定义,也不应使用它来重新定义 Gekko 变量。

下面是成功解决的修改,但是,这可能不是预期的问题。

import numpy as np
from gekko import GEKKO

# Initialize model
m = GEKKO()

# Manipulating variables and initial guesses
launch = m.MV(value=[2460310.5, 0, 0], lb=2460310.5, ub = 2460340.5)
launch.STATUS = 1
flyby = m.MV(value=2460575.5, lb=2460493.5, ub =2460340.5) # Venus/Mars
# flyby = m.MV(value = 2460997.5, lb = 2460887.5, ub = 2460908.5) # Jupiter
flyby.STATUS = 1
arrive = m.MV(value =[2460845.5, 0, 0], lb = 2460631.5, ub=2460660.5) # Venus/Mars
# arrive = m.MV(value = 2461534.5, lb = 2461250.5, ub = 2461658.5) # Jupiter
arrive.STATUS = 1

# Variables
r1  = m.Var(value = np.array([0, 0, 0]), lb = -1e10, ub=1e10, name = "r1")
v1  = m.Var(value = np.array([0, 0, 0]), lb = -1e5, ub = 1e5, name = "v1")
r2  = m.Var(value = np.array([0, 0, 0]), lb = -1e10, ub = 1e10, name = "r2")
v2  = m.Var(value = np.array([0, 0, 0]), lb = -1e5, ub = 1e5, name = "v2")
r3  = m.Var(value = np.array([0, 0, 0]), lb = -1e10, ub = 1e10, name = "r3")
v3  = m.Var(value = np.array([0, 0, 0]), lb = -1e5, ub = 1e5, name = "v3")
l   = m.Var(value = np.array([0, 0, 0]), lb = -1e5, ub = 1e5, name = "launch")
imp = m.Array(m.Var,3,value=0,lb=-1e5,ub=1e5)

# Objective function
dV = m.Minimize(m.sqrt(imp[0]**2 + imp[1]**2 + imp[2]**2))

# Slingshot maneuver
#r1, v1, r2, v2, r3, v3, l_mag, imp_mag, v_final = slingshot()

m.time = [0,1,2]
m.options.IMODE = 6 # non-linear model
m.options.SOLVER = 3 # solver (IPOPT)
m.options.MAX_ITER = 15000
m.options.RTOL = 1e-7
m.options.OTOL = 1e-7
m.solve(disp=True) # Solve

解决方案:

  36  5.8037359e-06 9.31e-10 4.02e-08  -6.6 2.38e+03 -12.1 1.00e+00 9.28e-03f  1
  37  4.8012697e-09 0.00e+00 5.99e-11 -11.0 1.33e-01 -12.6 9.96e-01 9.99e-01h  1

Number of Iterations....: 37

                                   (scaled)                 (unscaled)
Objective...............:   4.8012696909311766e-09    4.8012696909311766e-09
Dual infeasibility......:   5.9928342286739218e-11    5.9928342286739218e-11
Constraint violation....:   0.0000000000000000e+00    0.0000000000000000e+00
Complementarity.........:   1.1687338056472621e-09    1.1687338056472621e-09
Overall NLP error.......:   1.1687338056472621e-09    1.1687338056472621e-09


Number of objective function evaluations             = 38
Number of objective gradient evaluations             = 38
Number of equality constraint evaluations            = 38
Number of inequality constraint evaluations          = 38
Number of equality constraint Jacobian evaluations   = 38
Number of inequality constraint Jacobian evaluations = 38
Number of Lagrangian Hessian evaluations             = 37
Total CPU secs in IPOPT (w/o function evaluations)   =      0.021
Total CPU secs in NLP function evaluations           =      0.004

EXIT: Optimal Solution Found.
 
 The solution was found.
 
 The final value of the objective function is   4.801269690931177E-009
 
 ---------------------------------------------------
 Solver         :  IPOPT (v3.12)
 Solution time  :   3.239999999641441E-002 sec
 Objective      :   4.801269690931177E-009
 Successful solution
 ---------------------------------------------------

如果这不是正确的解决方案,请使用此信息并可能创建一个新问题,并尽力解决该问题。有Gekko tutorials可以更完整地概述如何配置动态优化问题。

关于python - GEKKO Python + IPOPT 最小化 delta-V,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76843179/

相关文章:

python - GEKKO:将数组中的出现次数作为条件进行计数

python - 用 python 和 gekko 拟合非线性模型

python-3.x - 如何使用 Gekko 释放变量

python - Jupyter笔记本错误

c++ - 仅使用位操作(无分支)将 16 位有符号值限制在 0 到 4095 之间

mysql - 请帮助优化 MYSQL 表和/或查询

java - JIT可以做这个字段访问优化吗?

python - 在 Python 中实现 PCA(基于特征向量)

带有日期时间基础的python plot stem

python - 为什么我不能实现 Django 的忘记密码功能?