¿Limitador de velocidad de 3er orden en Simulink? ¿Cómo generar señales disparadas suaves?

Primero, para aquellos que no están familiarizados con Simulink, existe una solución parcial imaginable fuera de Simulink:

Necesito crear un vector que satisfaga las siguientes condiciones:

valor inicial conocidoa1valor final conocidoa2tiene un tamaño de paso predefinido, pero la longitud no está predeterminadaLa primera derivada en todo el rango se limita av_max resp.-v_maxLa segunda derivada en todo el rango se limita aa_max resp.-a_maxLa tercera derivada en todo el rango se limita aj_max resp.-j_maxEn el primer y último punto todos los derivados soncero.

Antes de preguntar "qué has intentado hasta ahora", solo tuve la idea de resolverlo fuera de Simulink y probé todas las cosas a continuación;) Pero quizás ustedes tengan una buena idea, mientras sigo trabajando en mi propia solución.

Me gustaría generar señales de rampa suaves (tercera derivada limitada) basadas en una señal de disparo en Simulink.

Para obtener un paso activado, creé un subsistema activado que propagaba la salida del activador. Se ve así:

Pero en realidad no quiero un paso, necesito una rampa muy suave con derivados limitados hasta el tercer orden. La matemática detrás es:

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

(Si esto te parece familiar, una vez tuve unapregunta similar. Pensé en una recompensa, pero después de la edición necesaria de la pregunta, ambas respuestas habrían sido inválidas)

Como solo hay limitadores de velocidad de 1er orden, usé dos derivados y una doble integración para resolver mi problema. Pero hay un inconveniente del alcalde, no puedo ignorarlo más. Por el bien de la ilustración, elegí un tamaño de paso relativamente grande de 0.1.

El ejemplo mínimo completo (Paso fijo, tamaño de paso: 0.1, ode4): Descarga aquí

Se puede ver, que la señal ni siquiera alcanza la altura de paso prevista de 10 y, además, no es constante al final.

Durante el proceso de desarrollo de todo mi modelo, este enfoque fue lo suficientemente satisfactorio para los pasos pequeños. Pero llegué al punto en el que realmente necesito la rampa suave como se esperaba. Eso significa que necesito una señal finalmente constante en el valor exacto, especificado por la ganancia de altura del paso.

Ya pasé días para resolver el problema, y ​​espero encontrar ayuda aquí ahora.

Algunas de mis ideas:

aumente dinámicamente la altura del escalón sobre el valor real deseado y sature la salida final. Si los límites de velocidad, la altura de los pasos y el tamaño de los pasos de la simulación no fueran flexibles, probablemente podría encontrar una solución satisfactoria. Pero como todo tiene que ser flexible, hay demasiados casos en los que se viola la aceleración y el límite de sacudidas.Traté de usar elMatlab function Bloquear y escribir mi propio limitador de 3er orden. Aunque me parece posible para el momento de activación, no tengo ninguna solución sobre cómo suavizar la "desaceleración" al final de la rampa. También necesitaría compiladores C, lo que dificultaría el uso de mi modelo en otros sistemas sin problemas. (Al menos eso pienso.)

El solucionador no se puede cambiar de forma significativa (ya sea ode3 o ode4) y es obligatorio un tamaño de paso fijo (0.00001 a 0.01).

Actualmente utilizado, no es realmente útil el enfoque:

Paradynamic amplification de1.07 Obtengo la siguiente salida (todos los valores se normalizan en sus límites): Aunque el desplazamiento se ve bien, la violación del límite de aceleración es muy perjudicial.

Paradynamic amplification de1.05 Obtengo la siguiente salida (todos los valores se normalizan en sus límites): La aceleración permanece en sus límites, pero el desplazamiento no alcanza el valor deseado. (no está muy claro en la imagen) El imbécil sigue siendo demasiado grande. (Podría vivir con eso, pero no es agradable)

Así que me parece que las soluciones internas de Simulink están lejos de la realidad. ¿Alguna idea de cómo crear un bloque de función personalizado que se comporte bien?

El tamaño de paso de simulación, la altura de paso y los límites de frecuencia se conocen antes de que comience la simulación. (Pero tengo muchas de estas rampas suaves activadas en una fila, debería alimentar un control discreto de eventos). Así que podría imaginar crear toda la rampa lisa fuera de Simulink y guardarla como unatimeseries Objetar y añadirlo a la señal actual cuando se activa el disparador.

Respuestas a la pregunta(3)

Su respuesta a la pregunta