做了个实验,发现我对积分器的认识有问题。。。如图,被积函数是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没那么重要(在满足精度的条件下),如果你遇到的问题对这个非常敏感,那就根据具体问题再想办法吧。