登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:累积流量不准的问题总结

点击:4942 回复:24

谢谢分享。
18-04-02 15:22
这个还是仪表带这个功能最好,通过模拟量或者通讯给plc之类的
18-04-02 17:21
现在的论坛已经不像以前的论坛了,以前讨论的人很多也很热闹,现在大家都在玩微信了,就像我也很久没有使用论坛了。冷清了许多。
流行博客的时候我把很多电脑上的工程心得整理了一些到博客上,后来由于工作变动就没有再更新了。之后博客也没多少人用了。云存储流行也用过一些产品,国外的使用一段时间发现不能登录了。还好国内的云也纷纷面世,但使用了几个后发现要么附加的东西实在太多不喜欢使用,要么就是技术不过关会出现不能同步的问题。最后还是选择用本地存储保险些,至少没有出现过不能同步的问题。
岁月流失,我又回到起点,重拾工业控制这一行业,发现以前的知识储备还能派上用场,至少可以有个承前启后的作用,不至于什么都重头再来,什么都重新学习。
18-04-02 18:32
接着总结这几天的验证。
方案2可以解决大数加小数不能累积的问题,可是还是不能做到足够准确。
偶然发现有人已经解决了这个问题,不好意思没有记住是在哪里看到的了也不记得是哪位的帖子了。
这就是Kahan算法,具体算法一搜就有,关键是要知道有这个算法存在。
原始Kahan算法肯定不是我现在理解的,但我至少理解了一些,也使用这个算法实现了相对准确地进行累积。
Kahan算法解决的是精度损失问题,基本原理是这样的:既然累积出现了损失那就把损失量计算出来嘛,下次累积把损失补偿回去就好了。
如何计算本次累积的损失呢?本次计算损失= (本次累积量 - 上次累积量)- 本次计算瞬时值。如果累积没有损失,也就是两次累积之差等于本次计算瞬时值,则损失为0,下次不用补偿。如果出现损失,也就是两次累积之差不等于本次计算瞬时值则产生一个损失值,如果损失值为正值,表明多累积了,下次用减法补偿回来。如果损失是负值,表明少累积了,下次加上损失值。那么下次计算瞬时值 = 流量瞬时值 - 上次损失值。
如果没有损失,则计算瞬时值=流量瞬时值,也就是普通算法。
我的疑惑是(本次累积量 - 上次累积量)能计算出来吗?
验证后知道可以计算出来,并且他们是同一数量级,没有问题。
本次损失值的计算也是同级计算,也不会有问题。
18-04-02 19:00
我又重启验证,还是10000次累积,在初始累积值比较小,比如260000时运行得很好,具体记录很可惜,我已经丢到垃圾桶去了,上面有四五根烟蒂。
我把方案2、3(这次是方案3)一起验证,方案1早删除了。用不同大小的瞬时值和不同级别的累积次数进行了很多次验证,基本得到结果了。(我的初始值修改为1*10^9,是个比较大的值了,从这个值开始累积)在瞬时值比较小时,10w次累积的结果方案2和方案3都可以正常累积,但结果不同,方案3更接近理论值,是个比较好的结果。
就在我觉的可以结束验证时一时来劲,用了个100w次累积,经过14分钟的累积,结果让我笑不出来了。
18-04-02 19:11
经过100w次累积,方案3在不知道第几万次时已经停止了累积,成了一个不会动的数,而方案2还在累积。此时100w次还没有结束。
也就是方案3也没有解决大数加小数的问题。
经过前几次的验证我也很快知道了原因。
方案3Kahan算法中中间一步是真正的累积:本次累积值 = 上次累积值 + 本次计算瞬时值。问题就出在这里,上次累积值和本次计算瞬时值不是一个级别,难免就出现大数加小数的老问题。本次累积值损失了本次计算瞬时值,也就是丢失了计算瞬时值,不能正常补偿了。
解决的方案大家都会想到了,就是把方案2结合起来。
方案4:在方案3的基础上把本次累积值做成小累积值,基本和瞬时值在一个数量级。也是超过1.0向暂存累积值整数部分的变量中累加,该变量专门存放累积值的整数部分,是Dint型。然后小累积值舍弃整数部分再当作本次累积值使用。在出现超过1.0时累积值应该和瞬时值一个级别,可以进行下面的损失计算。但是现在做总结时发现还是有问题。
18-04-02 19:24
1.0是我认为的一个小数,可是现实中却未必。
比如瞬时值是0.00000012345,它和1.0就不是一个级别的了。看来还需要改进。
18-04-02 19:26
接着总结,总结完了就修改验证。
马上我就进行了方案4、3、2的一起验证,结果喜人。
在瞬时值比较小时,比如0.001234567,方案4可以精确到理论值,但误差出现在小数点后5位,基本可以忽略。方案3和方案4类似,只是误差稍大些,但可以接受。方案2误差较大。在100w次累积后,方案4继续保持精度喜人,方案3已经停止累积了,方案2误差很大了。
以下是结果数据:
瞬时值:0.000123456,累积初始值260000,经过1000w次累积,没错1000w次。理论值:261234.56
方案2:261234.495144,
方案3:261234.5625
方案4:261234.56000408
数据都是用整数、小数分开来记录的,不然一个浮点数没法有如此的精度。
其他数据我就不写了。(从垃圾桶翻东西,还是有些想法的)
如果瞬时值加大,方案3出现了较大误差,方案2不如方案4精确。
如果初始值加大,方案3不能累积了,方案2也出现了较大误差,方案4继续稳定。
--------------------------------------------------------------------------
到此结束。
别看Kahan算法简单,用SCL写也就短短几行,但过程蛮曲折的,结果的精度也很高,基本做到了理论值的有效位都保持了。
18-04-02 19:51
谢谢分享
18-04-02 23:26
谢谢
对于脉冲信号的流量传感器,采样时间太短好像不如大一点的效果好,比如0.05,0.1与1s得出的流速(客户称流量)结果就差很多(电机速度稳定时)
18-04-03 08:02

上一页 下一页

工控新闻

更多新闻资讯