【发布时间】:2013-11-27 10:53:20
【问题描述】:
首先对于那些不熟悉 Simulink 的人来说,有一个可以想象的外部 Simulink 部分解决方案:
我需要创建一个满足以下条件的向量:
- 已知初始值
a1 - 已知最终值
a2 - 它有一个预定义的步长,但长度不是预先确定的
- 整个范围内的一阶导数限制为
v_maxresp。-v_max - 整个范围内的二阶导数限制为
a_maxresp。-a_max - 整个范围内的三阶导数限制为
j_maxresp。-j_max - 在第一点和最后一点,所有导数都零。
在你问“到目前为止你尝试了什么”之前,我只是想在 Simulink 之外解决它,然后我尝试了下面的全部内容;) 但也许你们有一个好主意,而我一直在研究自己的解决方案。
我想根据 Simulink 中的触发信号生成平滑斜坡信号(三阶导数限制)。
为了获得触发步骤,我创建了一个触发子系统来传播触发输出。看起来是这样的:
但我实际上不想要一个步骤,我需要一个非常平滑的斜坡,其导数有限,直到 3 阶。背后的数学是:
displacement: x
speed: v = x'
acceleration: a = v' = x''
jerk: j = a' = v'' = x'''
(如果你觉得这很熟悉,我曾经有一个非常 similar question。我想过要赏金,但在对问题进行必要的编辑后,两个答案都将无效)
由于只有一阶速率限制器,我使用了两个导数和一个双重积分来解决我的问题。但是有一个市长的缺点,我不能再忽视了。为了便于说明,我选择了一个相对较大的步长 0.1。
完整的最小示例(Fixed Step,stepsize:0.1,ode4):Download here
可以看出,信号甚至没有达到预期的步高10,而且最后也不是恒定的。
在我的整个模型的开发过程中,这种方法对于小步长来说已经足够令人满意了。但我达到了我真正需要按预期平滑坡道的地步。这意味着我需要一个最终恒定的信号,其值正好是由步高增益指定的值。
我已经花了几天的时间来解决这个问题,现在希望在这里得到一些帮助。
我的一些想法:
- 动态增加步高超过实际所需值并使最终输出饱和。如果速率限制、步高和仿真步长不灵活,可能会找到一个令人满意的解决方案。但由于一切都必须灵活,因此违反加速度和加加速度限制的情况太多了。
- 我尝试使用
Matlab function块并编写我自己的三阶限速器。尽管触发时刻对我来说似乎是可能的,但我没有解决如何在坡道末端平滑“减速”的方法。我还需要 C 编译器,这会使我的模型很难在其他系统上毫无问题地使用。 (至少我是这么认为的。)
求解器不能显着改变(ode3 或 ode4),并且必须有固定的步长(0.00001 到 0.01)。
目前使用的,不是很实用的方法:
对于 1.07 的 dynamic amplification,我得到以下输出(所有值均按其限制标准化):
虽然位移看起来不错,但违反加速度限制是非常有害的。
对于 1.05 的 dynamic amplification,我得到以下输出(所有值均按其限制标准化):
加速度保持在其边界内,但位移未达到预期值。 (在图片中不是很清楚)混蛋仍然很大。 (我可以忍受,但这并不好)
所以在我看来,Simulink 内部的解决方案远非现实。任何想法如何创建一个表现良好的自定义功能块?
在模拟开始之前,模拟步长、步高和速率限制是已知的。 (但是我连续有很多这些触发的平滑斜坡,它应该提供一个事件离散控件)。所以我可以想象在 simulink 之外创建整个平滑斜坡并将其保存为timeseries 对象,并在触发器激活时将其附加到当前信号上。
【问题讨论】:
-
我不完全确定我理解您的非 Simulink 解释。我想您正在寻找的是一个向量
x,它代表了一段时间内的位置,并且有一个对应的向量t指定了时间,对吧?向量的长度不是固定的,但diff(t)是一个给定的常数dt。然后通过导数,您的意思是diff(x) ./ diff(t),它与diff(t) / dt相同。这是正确的吗? -
第二个问题:我感觉可能有很多向量可以满足您的约束。您是否有一些最优标准来选择其中一种解决方案?
-
@A.Donda: diff(x) 在 Simulink 中应该是 du/dt。有许多解决方案,但只有一种可以在最短的时间内达到台阶高度。我目前正在与我的同事一起研究非 Simulink 解决方案,因为他告诉我,我什至有 4 个不同的加加速度值(黄色曲线的峰值)和 2 个不同的加速度值(绿色)来表征我的斜坡。解决方案是微不足道的(他已经有 2000 行 python 代码)。简化的案例,我实际上在这里要求可以更容易地完成,我只是还没有时间在这里发布。
-
我想我会将此作为一个优化问题来处理。指定多个步骤,通过
j向量定义所有内容,计算a、v和x到cumsum,将约束实现为软约束,即超过最大值的惩罚等。如果对于给定数量的步骤有一个解决方案,应该找到它。减少步骤数,直到不再找到解决方案。我想试一试,但现在没有时间。如果过几天你还需要它,我可能会坐下来做。 -
@A.Donda 我不能完全关注你。我不需要它,因为我要解决更复杂的情况。那我可能不会在圣诞节前找到时间再次简化它来回答这个问题。因此,如果您有动力并且真的想回答这个问题,好吧,但是如果没有解决方案,我会很好。无论如何谢谢你! :)