重新制定AMPL汽车示例

时间:2016-10-10 12:08:56

标签: pyomo

我正在尝试迁移Ipopt源代码tarball中的扩展汽车问题作为示例。我遇到了结束条件的问题(在最后一次迭代时达到零速度的地方)和成本函数(最小化最终时间)。

有人可以帮我修改以下型号吗?

# min tf
# dx/dt = 0
# dv/dt = a - R*v^2
# x(0) = 0; x(tf) = 100
# v(0) = 0; v(tf) = 0
# -3 <= a <= 1 (a is the control variable)

#!Python3.5
from pyomo.environ import *
from pyomo.dae import *

N = 20;
T = 10;
L = 100;

m = ConcreteModel()

# Parameters
m.R = Param(initialize=0.001)

# Variables
def x_init(m, i):
    return i*L/N

m.t = ContinuousSet(bounds=(0,1000))
m.x = Var(m.t, bounds=(0,None), initialize=x_init)
m.v = Var(m.t, bounds=(0,None), initialize=L/T)
m.a = Var(m.t, bounds=(-3.0,1.0), initialize=0)

# Derivatives
m.dxdt = DerivativeVar(m.x, wrt=m.t)
m.dvdt = DerivativeVar(m.v, wrt=m.t)

# Objetives
m.obj = Objective(expr=m.t[N])

# DAE
def _ode1(m, i):
    if i==0:
        return Constraint.Skip
    return m.dxdt[i] == m.v[i]
m.ode1 = Constraint(m.t, rule=_ode1)

def _ode2(m, i):
    if i==0:
        return Constraint.Skip
    return m.dvdt[i] == m.a[i] - m.R*m.v[i]**2
m.ode2 = Constraint(m.t, rule=_ode2)

# Constraints
def _init(m):
    yield m.x[0] == 0
    yield m.v[0] == 0
    yield ConstraintList.End
m.init = ConstraintList(rule=_init)

'''
def _end(m, i):
    if i==N:
        return m.x[i] == L amd m.v[i] == 0
    return Constraint.Skip
m.end = ConstraintList(rule=_end)
'''

# Discretize
discretizer = TransformationFactory('dae.finite_difference')
discretizer.apply_to(m, nfe=N, wrt=m.t, scheme='BACKWARD')

# Solve
solver = SolverFactory('ipopt', executable='C:\\EXTERNOS\\COIN-OR\\win32-msvc12\\bin\\ipopt')
results = solver.solve(m, tee=True)

1 个答案:

答案 0 :(得分:1)

目前,Pyomo中的ContinuousSet必须有限。这意味着为了使用此工具解决最小时间最优控制问题,必须重新制定问题以从ContinuousSet中移除时间缩放。此外,您必须引入一个额外的变量来表示最终时间。我在Pyomo github repository添加了一个示例,展示了如何为您的问题做到这一点。