回 帖 发 新 帖 刷新版面

主题:Fortran精度问题

用以下程序计算tent map时间序列,结果大家可以看到迭代十几步之后精度的误差就这么大,完全偏离预期结果,不知道要怎么办,求解!!!!
program tent 
implicit none
   parameter N=1000
   integer :: i
   double precision :: x(N) 
   open(10,file='data.txt')
    x(1)=0.2_8    
    do i=2,N
      x(i)=1.0-2.0*abs(x(i-1)-0.5)
    end do
    do i=1,N
      write(10,*)i,x(i)
    enddo
end

结果:
           1  0.200000000000000     
           2  0.400000000000000     
           3  0.800000000000000     
           4  0.400000000000000     
           5  0.800000000000000     
           6  0.400000000000000     
           7  0.800000000000001     
           8  0.399999999999999     
           9  0.799999999999997     
          10  0.400000000000006     
          11  0.800000000000011     
          12  0.399999999999977     
          13  0.799999999999955     
          14  0.400000000000091     
          15  0.800000000000182
PS:编译环境用的是CVF6.6

回复列表 (共16个回复)

11 楼

勋哥, 改成整型就没有那个误差问题了. 有个问题是x(1)初始值是否由某种原因而给定的, 那样的话改成整型就可能出问题了.
剩下的靠楼主自己判断和发挥创造力了.

12 楼

[quote]勋哥, 改成整型就没有那个误差问题了. 有个问题是x(1)初始值是否由某种原因而给定的, 那样的话改成整型就可能出问题了.
剩下的靠楼主自己判断和发挥创造力了.[/quote]
什么意思?
我觉得lz的意思就是提高相当精度吧,甚至理论解吧。
我上面说的就是高精度算法的一种最简单情形。

13 楼


我想讨论的问题实际上是为什么进行了一定次数的迭代之后最后一位小数会出现一个小扰动,而且这个扰动会越来越大,大家请看第6个迭代结果是0.400000000000000,而第7次的迭代就是0.800000000000001,实际上这里只是在上一次的结果乘以2.0而已,并不复杂的运算,关键是这个误差越来越大,导致最后的结果偏离理论值。。。

14 楼

每次乘以2. 第15次就有可能放大2^15=32768 那么多倍.
如有必要重新设计算法而不要由一个无法精确表达的数值开始. 不过那样会很麻烦. 但到上面为止问题算是解决了.

15 楼

其实这个问题是数值稳定性的范畴,而且讨论结果在一个多少有效数字下才是有意义的。

有效数字在计算机中的表现即变量的类型精度,而有效数字的后一位总是可疑的。

浮点数在计算机中经过加减乘除后有效数字的位数必然减少。

没有人讨论数值解时说在一个极小值eps内是精确表达的。

16 楼

如果非要这么追求精度,可以使用任意精度模块,论文有帖子,可以搜索一下。

我来回复

您尚未登录,请登录后再回复。点此登录或注册