主题:如何在fortran中运用角度进行计算?
nosper
[专家分:60] 发布于 2007-04-22 13:57:00
!如何在fortran中运用角度进行计算?
!比如我想表示sin(30度)该怎么解决?
new: 在vc2005+ivf9.1中怎么才能多行注释?
最后更新于:2007-04-23 22:13:00
回复列表 (共17个回复)
11 楼
mltx [专家分:20880] 发布于 2007-04-23 12:32:00
计算圆周率这个问题有点意思,动手试了一下:
级数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 楼
asymptotic [专家分:16630] 发布于 2007-04-23 17:13:00
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 楼
nosper [专家分:60] 发布于 2007-04-23 18:24:00
大家这么热心,谢谢了
14 楼
nosper [专家分:60] 发布于 2007-04-23 19:05:00
mtlx 老师,可以把你的代码:级数1: 1-1/3+1/5-1/7+1/9......=pi/4 (Leibniz 定理) 发给贴出来看看么?
我那个遍的好像不怎么好, 想学习下,谢谢了
15 楼
mltx [专家分:20880] 发布于 2007-04-23 21:22:00
[quote]mltx 你没有进行误差估计并补偿之,所以用 sum(1/(k*k), k = 1, infinity) = Pi * Pi / 6 得到的精度并不高。我在另贴中附了源代码,你可以看看。...[/quote]
当然同意。
俺动手做了试算,是想理解“告诉你一个收敛的快的级数不用,用一个收敛的很慢的交错级数,”这句话在多大程度上是对的。俺想回答的是:不做任何附加算法,仅就两个级数的自然顺序求前n项和,是不是那个交错级数就收敛得很慢。
用附加算法提高精度或提高收敛速度,都应该另当别论。其实,包括反向求和都可以算是附加算法。而从对求和方向的敏感度来看,交错级数反而是不敏感的,也是更加稳定的。你的那段代码,若循环改为1,step,1,则马上成为不稳定的算法。
不过,学兄对级数算法很熟,学习。俺只是自己动手求第一手真知罢了。
探讨。。。
16 楼
mltx [专家分:20880] 发布于 2007-04-23 21:50:00
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 楼
nosper [专家分:60] 发布于 2007-04-23 22:08:00
谢谢忙里偷闲先生了
我来回复