Оптимизация траектории для «Ракеты» с использованием scipy.optimize.minimize - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь создать алгоритм оптимизации траектории для твердого тела, к которому могут быть применены крутящие моменты, чтобы вращать его в трехмерном пространстве, а также для того, чтобы закрепить ось X, которая может использоваться дляускорить объект с фиксированным ускорением (в этом случае либо 0, либо 1000 единиц / с ^ 2).А пока я просто удаляю уравнения вращения для своей задачи оптимизации, пока не пойму, как достаточно хорошо использовать функцию scipy.optimize.minimize для включения этих других динамических ограничений.Я также считаю, что ускорение может быть значением в любом месте в диапазоне от 0 до 1000, и применить широтно-импульсную модуляцию к регулятору тяги для эмуляции ускорения в диапазоне от 0 до 1000

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

J = t_f, где t_f - конечное время, J - мой функционал затрат, который я хотел бы минимизировать

Допустим, у меня естьнекоторые граничные условия (или ограничения): x (t_f) = [s_f, v_f]

и начальные условия x (0) = [s_0, v_0]

, где x - это состояниеобъект: x = [положение, скорость]

Я хотел бы оптимизировать управляющий вход u (t) (который является моим идеальным вектором ускорения, u = [ax, ay, az]) так, чтобы я достигконечное состояние за минимальное время.(и, конечно, мои значения ускорения здесь находятся в world_frame)

u имеет ограничение | u |<= 1000. Опять же для простоты я считаю, что вращательная динамика ракеты здесь не играет роли, и я могу мгновенно применить это ускорение к ракете без необходимости ориентировать ракету в направлении векторов ускорения.</p>

Динамические ограничения - это уравнения движения Ньютона, которые я собирался рассмотреть в дискретном времени.

x0 = ((u (t) + гравитация) * (delta_t ^ 2) / 2) + (x1 * delta_t) + x0

x1 = (u (t) + g) * (delta_t) + x1

Есть ли подобный вопрос, который я пропустил?Или я пропустил пример, который привел бы меня к нахождению вектора управления u (t)?

Я много читал о методе 'SLSQP', и кажется, что это правильный путь, но я все еще не уверен, как правильно применить свою целевую функцию и ограничения, чтобы я могполучить мой управляющий вход за весь промежуток времени.

Для упрощения: я хотел бы минимизировать некоторую функцию J = t_f, используя scipy.optimize.minize (method = 'SLSQP')

Constrainedпо некоторым динамическим и граничным условиям,

x (t_f) = [s_f, v_f]

x (t_0) = [s_0, v_0]

x0 = ((u(t) + гравитация) * (delta_t ^ 2) / 2) + (x1 * delta_t) + x0

x1 = (u (t) + g) * (delta_t) + x1

| у |<1000 </p>

И моей переменной, которой можно управлять для минимизации функции, является u.

Как только функция завершится, я бы хотел, чтобы у вас были все U в течение всего промежутка времени отt_0 до t_f.

...