Оптимальная траектория для минимизации силы, проблемы с конечными условиями - PullRequest
2 голосов
/ 15 апреля 2020

Я пытаюсь найти траекторию, которая минимизирует квадратный интеграл силы для перемещения блока из одной точки в другую. Вот динамика системы:

dx/dt = v (derivative of position is velocity)
dv/dt = u (derivative of velocity is acceleration, which is what I am trying to minimize)
min integral of u**2

Начальные и конечные условия:

x(0) = 0, v(0) = 0
x(1) = 1, v(1) = 1

Я реализовал это в python с использованием библиотеки Gekko, но не могу получить Конечные условия работают правильно. Использование m.fix() для исправления конечной позиции делает проблему неразрешимой.

Чтение в режиме онлайн, я использовал m.Minimize() для мягкого ограничения, но решение было очень далеко от конечных условий. Я добавил дополнительное уравнение, чтобы сделать скорость меньше нуля в конце, и это сделало решение похожим на правильное решение, хотя конечное положение было неправильным (если решение было масштабировано с коэффициентом, это было бы правильно).

Должен ли я правильно решить эту проблему?

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

##model

m = GEKKO() # initialize gekko

nt = 101
m.time = np.linspace(0,1,nt)

# Variables
x = m.Var(value=0)
v = m.Var(value=0)

u = m.Var( fixed_initial=False)

p = np.zeros(nt) # mark final time point
p[-1] = 1.0
final = m.Param(value=p)

# Equations
m.Equation(x.dt()==v)
m.Equation(v.dt()==u)

#m.Equation(x*final >= 1) #@error: Solution Not Found
m.Equation(v*final <= 0)

m.Minimize(final*(x-1)**2)
m.Minimize(final*(v-0)**2)

m.Obj(m.integral(u**2)*final) # Objective function

m.options.IMODE = 6 # optimal control mode

##solve
m.solve() # solve

##plot
plt.figure(1) # plot results
plt.plot(m.time,x.value,'k-',label=r'$x$')
plt.plot(m.time,v.value,'b-',label=r'$v$')
plt.plot(m.time,u.value,'r--',label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')

##show plot
plt.show()

График моих результатов

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете решить проблему, указав более высокий вес в конечных условиях:

m.Minimize(final*1e5*(x-1)**2)
m.Minimize(final*1e5*(v-0)**2)

Все еще есть некоторый компромисс с минимизацией u, но он минимален.

ограничение m.Equation(x*final >= 1) недопустимо при final=0, так как это приводит к неравенству 0 >= 1. Если вы хотите использовать ограничение конечной позиции, вам нужно будет использовать m.Equation((x-1)*final >= 0), чтобы ограничение применялось только в конце, но выполнимо (0 >= 0) в другом месте. Вам не обязательно нужны жесткие ограничения с мягкими (целевая функция) ограничениями для конечного условия. Вот проблема , связанная с перевернутым маятником .

cart results

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

m = GEKKO() # initialize gekko
nt = 101; m.time = np.linspace(0,1,nt)
# Variables
x = m.Var(value=0)
v = m.Var(value=0)
u = m.Var(fixed_initial=False)
p = np.zeros(nt) # mark final time point
p[-1] = 1.0
final = m.Param(value=p)
# Equations
m.Equation(x.dt()==v)
m.Equation(v.dt()==u)
m.Equation((x-1)*final >= 0)
m.Equation(v*final <= 0)
m.Minimize(final*1e5*(x-1)**2)
m.Minimize(final*1e5*(v-0)**2)
m.Obj(m.integral(u**2)*final) # Objective function
m.options.IMODE = 6 # optimal control mode

m.solve() # solve

plt.figure(1) # plot results
plt.grid()
plt.plot(m.time,x.value,'k-',label=r'$x$')
plt.plot(m.time,v.value,'b-',label=r'$v$')
plt.plot(m.time,u.value,'r--',label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()
...