matlab simulink中积分器的积分区间下限t0是怎么设定的?

做了个实验,发现我对积分器的认识有问题。。。如图,被积函数是e^(-t),对积分器做了点设置,限制了输出上限为1,并设置了溢出提示,这个提示接到示波器上。当输出值大于设定值时,示波器会输出1。按理说被积分后该是1-e^(-t),不能大于1,示波器该是一直为0。
但结果就像图里的一样,大于1了。
看了help,说积分器的积分区间是t0到t,并不是想象的从0到t。想问一下这t0是指什么,怎么设定?

楼上的回答有点想当然了(说的比较直接,抱歉)。

    这个问题是由浮点数的表示精度引起的。尽管理论上积分结果不会大于1,但会很接近1,由于浮点数的表示精度所限,在t较大时,就会等于1,而只要等于积分器的饱和值,Saturation port就会输出1。

    积分器的积分区间t0的问题:是指模型仿真参数设置中,开始时间你设的不是0。

     

    附加讨论:关于何时Saturation port会输出1:

    照理说,应该是exp(t)<=eps,这样算出来t大约为36秒,但从仿真结果看,在十几秒的时候就饱和了。我的理解,这可能受到仿真参数中误差限制的影响——默认绝对误差为1e-6,这样求出来-log(1e-6)大约是13.8秒。当然,结果还会受到相对误差的影响,更深入的分析您感兴趣的话可以继续,我只给提供一点思路,抛砖引玉。

追问

字数不够。。

 

追问1-----------------------------------

谢谢帮助   其实它不是等于1,而是大于1。如果用1减去那个积分再在示波器中显示,会发现t大于一定值时输出了负数。

最核心的问题就怎么才能得出正确的数学上的答案。。

如果t0是指开始的时间,那应该是0。源的开始时间没改动。

 

如此看来,问题就出在积分器的算法上了。。。

追答

    试了一下,你说的结果大于1的情况确实会出现。这是数值计算不能避免的事,可以使用我上面所说的误差控制将其控制在很小的范围(例如10^-14量级)。

    如果关注的不是可以将误差控制到多么小,而是在意误差的极性,那就只能建议你采用更好的表达方式了——例如,对于现在研究的这个问题,你既然知道积分得到的结果是1-e^(-t),那么不妨直接用fcn模块实现这个表达式。

    前面所说的开始时间t0,不是指Ramp模块的,而是整个模型的仿真时间中的Start time。尽管这个t0对解决你的问题没有什么作用,但既然你的提问是关于t0的,那就有必要再说明一下。

追问

。。。怎么发评论上了。
非常不好意思还得再追问个。。为了说明积分器有问题才用了e^(-t),但真正要用的函数就没指数函数这么简单了。换一个复杂函数,我就没法区分真实数据和误差了。。原本以为问题出在t0上,所以才这么问的。真正关心的怎样才能正确算出积分式子,至少极性要对啊,大于1和小于1差太多了。

追答

数值计算只能在一定范围内保证你的计算精度,而在精度范围内,误差是不分极性的。
对于绝大多数场合,大于1还是小于1没那么重要(在满足精度的条件下),如果你遇到的问题对这个非常敏感,那就根据具体问题再想办法吧。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-09
你想的有问题,e^(-t)是一个大于1的函数,那么积分时间越长,积分值将越大。大于1是肯定的。这个积分不是数学上的积分。追问

不懂啊,数学上e^(-t)当t大于0时小于1吧。 ,t趋于无穷才等于1啊。

积分器help里说输出值是这个公式得到的。也就是t0指什么?

 

或者要算该怎么做? 求大神帮忙下   many thanks

相似回答