First for those, who are not familiar with Simulink, there is a imaginable outside-Simulink partial solution:
我需要创建一个满足以下条件的向量:
-
已知初始值
a1
-
已知最终 Value
a2
-
它具有预定义的步长,但长度不是预先确定的
-
整个范围内的一阶导数仅限于
v_max
resp .-v_max
-
整个范围内的二阶导数仅限于
a_max
resp .-a_max
-
整个范围内的三阶导数仅限于
j_max
resp .-j_max
-
在第一点和最后一点所有衍生物都是 zero .
在你问“你到目前为止尝试了什么”之前,我只是有想法在Simulink之外解决它,我尝试了下面的所有内容;)但也许你们有一个好主意,而我一直在研究我自己的解决方案 .
我想基于Simulink中的触发信号生成平滑的斜坡信号(三阶导数限制) .
为了获得触发步骤,我创建了一个触发子系统来传播触发输出 . 它看起来像这样:
但实际上我并不想要一步,我需要一个非常平滑的斜坡,有限的衍 生产环境 品直到第3阶 . 背后的数学是:
displacement: x
speed: v = x'
acceleration: a = v' = x''
jerk: j = a' = v'' = x'''
(如果这看起来很熟悉,我曾经有过一次非常similar question . 我想到了它的赏金,但在对问题进行必要的编辑后,两个答案都会无效)
由于只有1阶速率限制器,我使用了两个导数和一个双重积分来解决我的问题 . 但是有一个市长的缺点,我不能再忽视了 . 为了便于说明,我选择了相对较大的步长0.1 .
The complete minimal example (Fixed Step, stepsize: 0.1, ode4): Download here
It can be seen, that the signal not even reaches the intended step height of 10 and furthermore is not constant at the end.
在整个模型的开发过程中,这种方法对于小步长来说足够令人满意 . 但是我达到了我真正需要平滑坡道的程度 . 这意味着我需要一个最终恒定的信号,其值恰好是由步高增益指定的值 .
我已经花了好几天时间来解决这个问题,并希望现在能够提供一些帮助 .
我的一些想法:
-
动态地增加步长超过实际所需值并使最终输出饱和 . 如果速率限制,步长和模拟步长不灵活,则可能找到令人满意的解决方案 . 但由于一切都必须灵活,因此有太多情况会违反加速度和加加速度限制 .
-
我试图使用
Matlab function
块并编写我自己的3阶速率限制器 . 虽然我觉得触发时刻似乎是可能的,但我没有解决方法如何在斜坡结束时平滑"deceleration" . 此外,我需要C编译器,这将使我很难在其他系统上使用我的模型没有问题 . (至少我是这么认为的 . )
The solver can not be changed siginificantly (either ode3 or ode4) and a fixed step size is mandatory (0.00001 to 0.01).
Currently used, not really useful approach:
对于 dynamic amplification
1.07 我得到以下输出(所有值都在其极限上标准化):
虽然位移看起来不错,但违反加速度限制是非常有害的 .
对于 dynamic amplification
1.05 ,我得到以下输出(所有值在其极限上标准化):
加速度保持在其边界,但位移未达到预期值 . (图中并不是很清楚)混蛋仍然很大 . (我可以忍受,但这不好)
So it appears to me that a inside-Simulink solutions is far from reality. Any ideas how to create a well-behaving custom function block?
在模拟开始之前,已知模拟步长,步长和速率限制 . (但是我有很多这些触发了连续平滑的斜坡,它应该提供事件离散控制) . 因此,我可以设想在simulink外创建整个平滑斜坡并将其保存为 timeseries
对象,并在激活触发器时将其附加到当前信号上 .
3 回答
长度> 1的积分链不稳定!
有一个涉及轨迹规划的巨大研究领域 . 最简单的方法可能是使用FIR滤波器(Biagotti等)或实现在线轨迹规划器(Ezair等2014 / Knierim等2012) .
你看到的问题是因为差异不是很好 . 取差异可放大模拟中存在的数值 .
如果你尝试应用实际步骤,那么混蛋总是很大 . 我想对于你的方法,最好以相反的方式工作:即用你的步骤实现一个加速度,加速度和速度 .
我认为你正在寻找类似ref3块的东西:http://www.dct.tue.nl/home_of_ref3.htm注意网站上的免责声明,并且使用它有点麻烦 .
一种简单(尚未改进)的方法是使用速率限制器,然后使用带有滤波器的状态空间模型 . 从过滤器中获得速度,然后您可以应用速率限制器 . 继续使用速率限制器和过滤器,直到获得所需的曲线 .
否则,您可以使用runge kutta公式或有限差分来提出更高阶的数值限制器 . 然而有人指出,他们可能会受到不良条件的影响 .
我通常做的是使用一个速率限制器和三阶滤波器,并调整时间常数(1个三极),以满足我的需求 . 这很好用,尤其是