计算化学公社

 找回密码 Forget password
 注册 Register

数值计算编程中务必要注意【数值不稳定】问题

查看数: 5662 | 评论数: 5 | 收藏 Add to favorites 10
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-9-22 12:15

正文摘要:

本帖最后由 coolrainbow 于 2018-9-22 12:42 编辑 问题的提出 昨天帮人查一个程序的bug。是一个看起来无害的纯数值程序,给定一个x,算出 f(x)。然而在x接近0的时候,给出了十分离谱的结果。最后发现是使用的 ...

回复 Reply

Warm_Cloud 发表于 Post on 2018-9-23 08:52:29
开方一个很小的数也会有问题。
coolrainbow 发表于 Post on 2018-9-22 21:25:36
granvia 发表于 2018-9-22 14:03
验证了一下,用Taylor展开exp(-2*x)前4项得到的表达式是:x^2/15*(2*x^2+x+1) = 6.67334666666667e-08
而 ...

exp(-x)/2/x*( (1-3/x+3/x^2)*exp(x) - (1+3/x+3/x^2)*exp(-x) )也是要进行Taylor展开计算的。直接算还是有误差。

之所以选择第二个形式,是因为它的Taylor展开是x^2+x^4+x^6....形式的,比直接展开x^2/15(..)收敛要快的多。
ene 发表于 Post on 2018-9-22 16:00:24
多谢分享,确实是应该仔细注意的问题
granvia 发表于 Post on 2018-9-22 14:03:54
本帖最后由 granvia 于 2018-9-22 14:05 编辑

我机子上的MATLAB的eps是2.22044604925031e-16
granvia 发表于 Post on 2018-9-22 14:03:43
本帖最后由 granvia 于 2018-9-22 14:09 编辑

验证了一下,用Taylor展开exp(-2*x)前4项得到的表达式是:x^2/15*(2*x^2+x+1) = 6.67334666666667e-08
而直接用MATLAB算式子exp(-x)/2/x*( (1-3/x+3/x^2)*exp(x) - (1+3/x+3/x^2)*exp(-x) )得到的是2.32597929386742e-07

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-23 21:18 , Processed in 0.185647 second(s), 27 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list