Ошибка с начальными условиями при использовании Pyomo

Я работаю над реализацией проблемы Brachistochrone в Pyomo, используя оптимизацию Чебышева, как определено в эта статья.

Начальные условия задачи утверждают, что x (0) = y (0) = 0.

Однако как только я запускаю код, я получаю следующую ошибку

Ошибка при оценке ограничения 1: невозможно оценить sqrt '(0).

Я записал свои переменные как

def x_initialize (model,i):   
    return 0.5*(i/value(m.n))  
m.x = Var(m.N, within = NonNegativeReals, initialize = x_initialize)

def y_initialize (model,i):   
    return 0.5*((i)/value(m.n))   
m.y = Var(m.N, within = NonNegativeReals, initialize = y_initialize)

и

def f_x_definition(model, i):
    return m.f_x[i] == sqrt(2*g*m.y[i])*cos(m.angle[i])
 m.f_x_const = Constraint(m.N, rule = f_x_definition)

 def f_y_definition(model, i):
     return m.f_y[i] == sqrt(2*g*m.y[i])*sin(m.angle[i])
 m.f_y_const = Constraint(m.N, rule = f_y_definition)

Я попытался добавить небольшое число в def x_initialize (model, i): и def y_initialize (model, i): для компенсации, но затем программа вернула ошибку сбоя восстановления. Другая попытка заключалась в использовании ** (1/2) вместо sqrt, но это тоже не сработало.

Я не могу придумать другого решения этой проблемы.

С Уважением.


person slow_learner    schedule 10.12.2019    source источник


Ответы (1)


В конце концов, я вручную ввел значение для i = 0, используя if as

def f_x_definition(model, i):
    if i == 0:
        return m.f_x[i] ==0
    else:
        return m.f_x[i] == ((2*g*m.y[i])**(1/2))*cos(m.angle[i])
person slow_learner    schedule 10.12.2019