在 Pyomo (Ipopt) 中绘制中间解决方案

问题描述 投票:0回答:0

我有以下最优控制问题

import pyomo.dae as pdae
import pyomo.environ as pe

# Implement 1D bullet train model
m = pe.ConcreteModel()

M = 7150                # Mass
x_0, v_0 = 10000, -80   # Initial conditions (in nondimtime)
x_f, v_f = 0, 0         # Final conditions
nfe = 20                # Number of time steps

m.t_f = pe.Var(domain=pe.PositiveReals) # Final time
m.t = pdae.ContinuousSet(bounds=(0, 1)) # Scaled time
m.x = pe.Var(m.t)                       # Train position
m.v = pdae.DerivativeVar(m.x, wrt=m.t)  # Velocity
m.a = pdae.DerivativeVar(m.v, wrt=m.t)  # Acceleration
m.alpha = pe.Var(m.t, bounds=(-1,1))    # Thrust

# Dynamics
@m.Constraint(m.t)
def alpha_ODE(m, t):
    return m.alpha[t] == M * m.a[t] / m.t_f**2

m.init = pe.ConstraintList()
# Set initial conditions
m.init.add(m.x[0] == x_0)
m.init.add(m.v[0] == v_0)
# Set final conditions
m.init.add(m.x[1] == x_f)
m.init.add(m.v[1] == v_f)

# Define solver and method
discretizer = pe.TransformationFactory('dae.finite_difference')
discretizer.apply_to(m, wrt=m.t, nfe=nfe, scheme='BACKWARD')

# Specify objective
m.obj = pe.Objective(expr=m.t_f, sense=pe.minimize)

solver = pe.SolverFactory('ipopt')
solution = solver.solve(m)

并且它找到了一个适合这些参数的最佳解决方案。但是,如果我将 M 更改为 715000,它会达到 maxIterations。

当它失败时,我可以绘制它完成的解决方案(尽管它不是最优的),但是 我想知道是否有一种方法可以绘制中间解决方案? 看看求解器可能卡在哪里?

提前致谢。

pyomo ipopt
© www.soinside.com 2019 - 2024. All rights reserved.