2016-10-10 7 views
0

Ipopt 소스 코드 tarball에 포함 된 ampl car 문제를 예제로 마이그레이션하려고합니다. 최종 조건 (최종 반복에서 속도가 0 인 위치에 도달)과 비용 함수 (최종 시간 최소화)에 문제가 있습니다.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

스택 오버플로에 오신 것을 환영합니다! [ask] 및 [mcve]를 참조하십시오. – Mat

답변

1

현재 Pyomo의 ContinuousSet은 경계되어야합니다. 즉,이 도구를 사용하여 최소 시간 최적 제어 문제를 해결하려면 문제를 재구성하여 ContinuousSet에서 타임 스케일링을 제거해야합니다. 또한 최종 시간을 나타 내기 위해 추가 변수를 도입해야합니다. 이 문제를 어떻게 해결할 수 있는지 보여주는 예제를 Pyomo github repository에 추가했습니다.

+0

굉장! 그것은 ampl와 같은 방식으로 시간에 대한 독립 변수를 사용합니다. 같은 개념,하지만 정말 다른 구문, 고마워요! – Pablo