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)



请您注意: