xxhui 发表于 2011-7-21 00:47:07

simulink里如何实现高阶微分

大家好,我现在做控制器设计,还在simulink仿真阶段。现在需要对一个阶梯信号求三次微分,一阶,二阶,三阶微分在之后的subsystem都要用到。但是微分效果都不好,即使我把模拟步长设置的很小。

我试了一下一阶微分后接一个积分器得出信号和输入是重合的。但是二阶微分之后加两个积分却不能和输入完全重合,偏差很大。请问是为什么,做控制的人都知道,在matlab里面积分(1/s)很容易实现,但是微分(s)就难了。我也知道纯微分是不可能实现的,simulink里时间连续域用的还是差分,采样时间就是步长。即是我用离散域的差分和积分也是得出这个效果。我这里设置的步长是0.0001s才有这个结果 ,但实际中控制器采样率不可能到那么高。

在这里就是想问一下,为什么会出现那个现象。有人说高阶差分引起的roundoff error,还有人说微分(差分)部分前要加低通。
下面是附图

xxhui 发表于 2011-7-21 19:03:34

:o:o:o:o:P:P:$

机械虫虫 发表于 2011-7-25 03:42:59

看误差越来越大倾向认为确实是由于截断/舍入误差引起,看微分图这里微分的数值稳定性也很差。可以尝试:1.增加仿真数据精度Simulation->Configuration Parameters->Solver中改小tolorance;2.如你所言微分后加低通;3.若subsystem形式不复杂并有确切的传递函数的话,可以考虑不用simulink而直接用控制系统工具箱,用命令实现符号运算,再数值化最终结果。PS:simulink偶也是初学,不保证管用哈..:loveliness:

ljelly 发表于 2011-7-25 09:06:23

单纯差分的方式,似乎难以有好的效果,可以试试其他微分的方法,用S-函数来实现,在simulink中使用

xxhui 发表于 2011-7-26 06:25:02

3# 机械虫虫
可以考虑不用simulink而直接用控制系统工具箱,用命令实现符号运算


请问这里是意思啊?

xxhui 发表于 2011-7-26 06:25:33

4# ljelly
S 试过了,里面用的还是diff命令,结果也不好

xxhui 发表于 2011-7-26 06:26:39

还有,我现在把微分和积分都换成时间离散的,并设置仿真步长为固定且很小,可以得到很好的结果。

ljelly 发表于 2011-7-26 11:40:23

4# ljelly
S 试过了,里面用的还是diff命令,结果也不好
xxhui 发表于 2011-7-26 06:25 http://forum.simwe.com/images/common/back.gif
我说的是自己写的,你怎么会试过了
S-函数,不是simulink中的微分模块

xxhui 发表于 2011-7-28 22:54:36

我自己也写了s函数

TBE_Legend 发表于 2011-7-28 23:13:07

我自己也写了s函数
xxhui 发表于 2011-7-28 22:54 http://forum.simwe.com/images/common/back.gif

maple 有个产品好像叫 maple toolbox formatlab , 可以保证很好的数值精度, 你可以试试。 simulink 不知道行不行。

http://www.cybernet.sh.cn/cca/cn/maple/maplematlab/index.asp

Jasonluo 发表于 2011-8-1 11:55:25

关注这个问题~

TBE_Legend 发表于 2011-8-2 22:12:52

这里有个很有启发的关于 round off error 的帖子
http://blogs.mathworks.com/seth/2009/12/14/round-off-error/

TBE_Legend 发表于 2011-8-2 22:19:40

本帖最后由 TBE_Legend 于 2011-8-2 22:21 编辑

嗯, 这很可能是个比较好的解决方案。 文件中还有例子哦 :victory:

http://www.mathworks.de/matlabce ... ce-with-mathematica
页: [1]
查看完整版本: simulink里如何实现高阶微分