2016-10-10 5 views
0

Я пытаюсь выполнить миграцию проблемы с усилителем, которая поставляется в исходном коде исходного кода Ipopt в качестве примера. У меня возникают проблемы с конечным условием (до конечной итерации), а также с функцией стоимости (свести к минимуму конечное время).Реформирование примера автомобиля 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

В настоящее время ContinuousSet in Pyomo должен быть ограничен. Это означает, что для решения проблемы с минимальным временем оптимального управления с помощью этого инструмента проблема должна быть переформулирована для удаления масштаба времени из ContinuousSet. Кроме того, вы должны ввести дополнительную переменную для представления последнего времени. Я добавил пример Pyomo github repository, показывающий, как это можно сделать для вашей проблемы.

+0

Awesome !!! Это то же самое, что и усилитель, используя независимую переменную для времени. Такая же концепция, но действительно отличный синтаксис, спасибо большое! – Pablo

 Смежные вопросы

  • Нет связанных вопросов^_^