2016-10-10 18 views
0

我正在嘗試遷移Ipopt源代碼tarball中的振幅車問題作爲示例。我遇到了結束條件問題(在最終迭代中達到零速的地方)和成本函數(最小化最終時間)。重新構造AMPL車示例

有人可以幫我修改以下模型嗎?

# 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) 
+0

歡迎來到Stack Overflow!請參閱[問]和[mcve]。 – Mat

回答

1

目前,Pyomo中的ContinuousSet必須是有界的。這意味着爲了解決使用此工具的最小時間最優控制問題,必須重新構造問題以從連續集中移除時間縮放。另外,你必須引入一個額外的變量來表示最後的時間。我已向Pyomo github repository添加了一個示例,說明如何解決您的問題。

+0

太棒了!這與放大的方式是一樣的,使用一個自變量來表示時間。相同的概念,但語法真的不同,非常感謝! – Pablo