aoeo2jam 于 2017-04-24 11:30:03发布
不妨到论坛发个帖子,格式更容易控制。
挺好的。不过有几个小地方可以改进: 1. f和f1可以写成1个函数,把阶数也作为自变量 2. 二分法求根应改成牛顿法求根,提高计算速度 3. 高斯节点是对称的,只求正的即可,n为奇数时0也是节点 此外,计算x**2/3在0至1之间积分的例子,由于被积函数是二次多项式,如果采用n>=2的高斯勒让德积分,结果应该是准确值,其数值计算结果只应在最后一位有误差。本文显示的结果却有两位误差,可以说明f、f1或求根的计算有一定误差。 改进后的程序 Module AF_Gauss_Legendre Implicit None Integer, Parameter :: n_GL=5 Integer, Parameter :: iKind=8 ! 16 Real(kind=iKind) , parameter :: acc_GL_Abscissae=1e-15_iKind ! 1e-31_iKind Contains Real (Kind=iKind) Function P_Legendre(n,x) ! n阶勒让德多项式 Implicit None Integer :: i,n Real (Kind=iKind) :: a(n), x a(1)=x ! 1阶勒让德多项式 a(2)=1.5e0_iKind*x*x-0.5e0_iKind ! 2阶勒让德多项式 Do i=3,n a(i)=((i+i-1)*x*a(i-1)-(i-1)*a(i-2))/i ! 利用递推关系产生n阶勒让德多项式 End Do P_Legendre=a(n) !生成的n阶勒让德多项式 End Function P_Legendre Real (Kind=iKind) Function DP_Legendre(n,x) Implicit None Integer :: i,n Real (Kind=iKind) :: a(n), x a(1)=x ! 1阶勒让德多项式 a(2)=1.5e0_iKind*x*x-0.5e0_iKind ! 2阶勒让德多项式 Do i=3,n a(i)=((i+i-1)*x*a(i-1)-(i-1)*a(i-2))/i ! 利用递推关系产生n阶勒让德多项式 End Do DP_Legendre=(a(n-1)-x*a(n))*n/(1e0_iKind-x*x) ! 生成n阶勒让德多项式的导数表达式 End Function DP_Legendre Real (Kind=iKind) Function root(a, b) ! 牛顿法求解函数在(a,b)内的解 Implicit None Real (Kind=iKind) :: a, b, c, x, dx Integer :: i x=(a+b)*0.5e0_iKind Do dx=-P_Legendre(n_GL,x)/DP_Legendre(n_GL,x) x=x+dx If (ABS(dx)
请您注意: