回 帖 发 新 帖 刷新版面

主题:如何在fortran中运用角度进行计算?

   !如何在fortran中运用角度进行计算?

   !比如我想表示sin(30度)该怎么解决?

new: 在vc2005+ivf9.1中怎么才能多行注释?

回复列表 (共17个回复)

11 楼

计算圆周率这个问题有点意思,动手试了一下:

级数1: 1-1/3+1/5-1/7+1/9......=pi/4         (Leibniz 定理)
级数2: sum( 1/(k*k),  k=1,infinity ) = Pi * Pi / 6

貌似级数2应该快很多,其实不然。

下面给出的结果中:
n=取的项数
级数1的Pi, 其误差
级数2的Pi, 其误差


计算结果:
=============
n=1000=1e3
   3.14059265383979,  -9.999997499989810E-004
   3.14063805620599,  -9.545973837985500E-004

n=100000=1e5
   3.14158265358972,  -1.000000007334023E-005
   3.14158310432646,  -9.549263336960934E-006

n=10000000=1e7
   3.14159255358979,   -1.000000016126990E-007
   3.14159255809590,   -9.549389057283975E-008

n=1000000000=1e9 
   3.14159265258805,   -1.001742688799823E-009
   3.14159264498239,   -8.607403234606181E-009

   反向求和(见讨论5)
   3.14159265258979,  -9.999996386511611E-010
   3.14159265263486,  -9.549299129218980E-010

n=10000000000=1e10
   3.14159265348835,  -1.014472950089385E-010
   3.14159264498239,  -8.607403234606181E-009

   反向求和(见讨论5)
   3.14159265348979,  -1.000000082740371E-010
   3.14159265349430,  -9.549294688326881E-011

取同样项数n,收敛速度的讨论:
1。级数2一比级数1快一点,但并不显著,基本上是同量级的;
2。当项数取到约为1e9时,级数2开始放慢,级数1精度超出。

3。级数2的一般项为1/(k*k)量级,当k大到1e9的量级时,其值约为1e-18的量级,太小,加不到3.14量级的数上去;
4。级数1的一般项为1/k量级,当k为1e9的量级时,其值约为1e-9的量级,仍然可以加到3.14量级的数上去,使结果得到改善。

5。一种更加稳定的算法是从最小值的项开始计算,反向求和(k=n,1,-1),其结果矫正了数值不稳定,仍然显示级数2比级数1稍快一点。

6。此外,级数2收敛到Pi*Pi,计算Pi时还要开方,而开方运算是放大误差的。

探讨。。。

12 楼

mltx 你没有进行误差估计并补偿之,所以用 sum(1/(k*k), k = 1, infinity) = Pi * Pi / 6 得到的精度并不高。我在另贴中附了源代码,你可以看看。

    另外,开放不一定放大误差。比如 y = sqrt(x)
delta(y) = delta(x) / (2 sqrt(x)), 当 x 较大时, delta(y) 也会较小。

13 楼

大家这么热心,谢谢了

14 楼

mtlx 老师,可以把你的代码:级数1: 1-1/3+1/5-1/7+1/9......=pi/4         (Leibniz 定理)    发给贴出来看看么?

   我那个遍的好像不怎么好,  想学习下,谢谢了

15 楼

[quote]mltx 你没有进行误差估计并补偿之,所以用 sum(1/(k*k), k = 1, infinity) = Pi * Pi / 6 得到的精度并不高。我在另贴中附了源代码,你可以看看。...[/quote]

当然同意。

俺动手做了试算,是想理解“告诉你一个收敛的快的级数不用,用一个收敛的很慢的交错级数,”这句话在多大程度上是对的。俺想回答的是:不做任何附加算法,仅就两个级数的自然顺序求前n项和,是不是那个交错级数就收敛得很慢。

用附加算法提高精度或提高收敛速度,都应该另当别论。其实,包括反向求和都可以算是附加算法。而从对求和方向的敏感度来看,交错级数反而是不敏感的,也是更加稳定的。你的那段代码,若循环改为1,step,1,则马上成为不稳定的算法。

不过,学兄对级数算法很熟,学习。俺只是自己动手求第一手真知罢了。

探讨。。。

16 楼

nosper:
俺没贴出代码是因为俺的代码不很精细,只是为了检验收敛速度而简单编写的。学兄可参考代码编写,要想真正有用,还要在算法上下功夫,如asymptotic所列举的带有误差补偿的算法。

[color=FF0000]搂主肯自己动手尝试编写代码,获得实战经验,是值得鼓励的[/color]!

program Pi
   implicit none
   real(8)    :: val,rk
   integer(8) :: k,s,n=1000000

   !   1-1/3+1/5-1/7+1/9......=pi/4   (Leibniz 定理)
   val = 0.d0
   s = -1
   do k=1,n
      s = -s
      rk = real(2*k-1,8)
      val = val + s/rk
   end do
   write(*,*) val*4,  n,  abs(val*4)-atan(1.d0)*4

   stop
end program Pi

17 楼

谢谢忙里偷闲先生了

我来回复

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