Ограничитель скорости 3-го порядка в Simulink? Как генерировать гладкие сработавшие сигналы?

Во-первых, для тех, кто не знаком с Simulink, существует возможное частичное решение за пределами Simulink:

Мне нужно создать вектор, удовлетворяющий следующим условиям:

известное начальное значениеa1известное окончательное значениеa2он имеет заранее определенный размер шага, но длина не определена заранеепервая производная во всем диапазоне ограниченаv_max соответственно-v_maxвторая производная во всем диапазоне ограниченаa_max соответственно-a_maxтретья производная во всем диапазоне ограниченаj_max соответственно-j_maxв первой и последней точке все производныенуль.

Прежде чем спроситьчто ты уже испробовал"У меня просто возникла идея решить ее вне Simulink, и я попробовал все это ниже;) Но, может быть, у вас, ребята, есть хорошая идея, пока я продолжаю работать над своим собственным решением.

Я хотел бы генерировать плавные сигналы линейного изменения (3-я производная ограничена) на основе сигнала запуска в Simulink.

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

Но я на самом деле неМне не нужен шаг, мне нужна очень плавная рампа с ограниченными производными до 3-го порядка. Математика позади:

displacement: x
speed: v = x'
acceleration: a = v' = x''
jerk: j = a' = v'' = x'''

(Если это выглядит знакомым, у меня когда-то был оченьаналогичный вопрос, Я думал о награде за нее, но после необходимого редактирования вопроса оба ответа были бы недействительными)

Поскольку существуют только ограничители скорости 1-го порядка, я использовал две производные и двойную интеграцию для решения моей проблемы. Но есть недостаток мэра, я не могу больше игнорировать. Для иллюстрации я выбрал относительно большой шаг в 0,1.

Полный минимальный пример (Fixed Step, stepsize: 0.1, ode4): Скачать здесь

Можно видеть, что сигнал даже не достигает намеченной высоты шага 10 и, кроме того, не является постоянным в конце.

В процессе разработки всей моей модели этот подход был достаточно удовлетворительным для небольших размеров шагов. Но я дошел до того момента, когда мне действительно нужно плавное движение по назначению. Это означает, что мне нужен наконец-то постоянный сигнал, точно равный значению, указанному приростом высоты шага.

Я уже потратил несколько дней, чтобы решить эту проблему, и надеюсь оштрафовать здесь и сейчас.

Некоторые из моих идей:

динамически увеличивайте высоту шага над фактическим желаемым значением и насыщайте конечный результат. Если пределы скорости, высота шага и размер шага симуляции не будутБудучи гибким, можно было бы найти удовлетворительное решение. Но так как все должно быть гибким, слишком много случаев, когда ограничение ускорения и рывка нарушается.Я пытался использоватьMatlab function заблокировать и написать свой собственный ограничитель скорости 3-го порядка. Хотя это кажется возможным для момента запуска, у меня нет решения, как сгладить "торможения» в конце рампы. Также я'Мне нужны C-компиляторы, которые затрудняют использование моей модели в других системах без проблем. (По крайней мере, я так думаю.)

Решатель не может быть существенно изменен (ode3 или ode4), и фиксированный размер шага является обязательным (от 0,00001 до 0,01).

В настоящее время используется не очень полезный подход:

Дляdynamic amplification из1,07 Я получаю следующий вывод (все значения нормированы на их пределы): Хотя смещение выглядит красиво, нарушение предела ускорения очень вредно.

Дляdynamic amplification из1,05 Я получаю следующий вывод (все значения нормированы на их пределы): Ускорение остается в своих границах, но смещение не достигает предполагаемого значения. (не совсем ясно на картинке) Рывок все еще велик. (Я мог бы жить с этим, но этоне приятно)

Так что мне кажется, что решения внутри Simulink далеки от реальности. Любые идеи, как создать хорошо функционирующий пользовательский функциональный блок?

Размер шага моделирования, высота шага и пределы скорости известны до начала моделирования. (Но у меня есть много сработавших плавных рамп подряд, они должны обеспечивать дискретный контроль событий). Таким образом, я мог представить себе создание всей плавной рампы вне simulink и сохранить ее какtimeseries объект и добавить его к текущему сигналу, когда триггер активирован.

Ответы на вопрос(3)

Ваш ответ на вопрос