易码技术论坛

 找回密码
 加入易码
搜索
查看: 185342|回复: 3

[请教]如何消除累积误差

[复制链接]
发表于 2006-12-16 19:10:48 | 显示全部楼层
我最近也在做一个有关动力学模拟的程序,关键的计算步骤在于积分。

看了一些数值分析的书,大多数积分算法是通过泰勒展开得到的多项式来减小误差。
我觉得一些预测-校正算法比较精确,比如Adams预测-校正算法。

分子动力学模拟还有几种常见的算法:Verlet速度积分、Leap Frog、Gear Predictor-Corrector等等。《游戏编程精粹4》上有一个例子就是用Verlet积分器来模拟由弹性绳子连起来的一些小球的运动。

不知道这些对楼主有没有帮助
发表于 2006-12-16 19:19:19 | 显示全部楼层
回头看看标题,是消除累积误差……上面说的似乎有点离题
不过有的积分算法是会收敛的,误差越来越小……
 楼主| 发表于 2006-12-16 20:23:34 | 显示全部楼层
其实我的那个图上面的点是对称的,也就是说同一直线上的两个点对中点的作用力的绝对值相等,不过向反。所以运算的结果是应该是每次得到两个相反数,累积结果一致保持0。

不过有个问题,我的程序在X方向上确实满足我上面说的,不过Z方向上很快就会出现误差,而且它用的是和X方向同样的参数,同样的算法。

而且我交换X、Z的计算顺序后,Z上面误差消失而X上面误差出现,情况和上面一样,虽然X和Z用的是不同的变量。

所以我后来计算X、Z方向的时候各自算出,即算X的时候清零Z,算Z的时候清零X,这样效果倒不错,至少在一定长的时间之内看不出有误差。
 楼主| 发表于 2006-12-15 21:08:34 | 显示全部楼层 |阅读模式
最近在做一个弹簧力的粒子系统,具体说明一下:
在一个n*m的点阵上,每个点与它的上、下、左、右4个点个有一根弹簧连接,弹簧保持原长,即各点之间相互没有力的作用。
然后移动一个点,使其偏移平衡位置,此时它和它的4个相连的点之间就有力的作用,将使该4个相邻点偏移平衡位置,并且对周围的点产生连锁反应。
不考虑阻尼因素,整个系统将一直抖动下去。

现在遇到如下问题:
以3*3的点阵为例,首先固定外围8个点(蓝色),只将中心点(红色)设为不固定,并且先将其移动到正Y方向,此时中心点将在弹簧力作用下,沿着Y轴上下运动,并一直这样运动。
grid_1.gif

然后将中心点的相邻点解除固定,即现在用5个点可以运动(红色)。由于4个相邻点在X和Z方向上对中心点的作用力相互抵消,所以中心点仍然只受Y方向上的力的作用。
grid_2.gif

不过程序为了普遍适用于各个点,对于一个点的受力情况,是将4个相邻的点对该点的4个分力进行累加运算后,再作用于该点上。所以上面的那种情况运行久了之后就会出现误差,导致中心点偏离Y轴
grid_3.gif

所以请教大家有没有什么好的误差消除方案。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-26 05:11 , Processed in 0.011701 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表