对该文发表评论已有7条评论,点击全部查看
我的态度:

    登录 | 注册 需要登陆才可发布评论
最新 最热
2017-04-26 21:02:36 vvt(vvt)
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)
不妨到论坛发个帖子,格式更容易控制。
回复 支持1
2017-04-24 11:30:03 aoeo2jam(aoeo2jam)
挺好的。不过有几个小地方可以改进: 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)
回复 支持1
2016-08-13 16:30:09 无奈的小强(无奈的小强)
您好,我想问下,在这个程序中我能否用于积分上下限为函数,而不是数值的程序呢?
回复 支持6
2015-09-09 19:32:20 fourierliu(fourierliu)
这个程序是谢兴兵老师写的,你可以问他
回复 支持5
2014-07-03 10:39:01 altidore(altidore)
altidore 于 2014-07-02 23:27:36发布
你用的啥编辑器?
chuxf 于 2014-07-03 07:01:11发布这是标准语法,所有F95的编译器都可以。
我是问编辑器……不过我觉得有个能改进的地方就是在求Gauss点和对应的Gauss系数时,可以借助于IMSL中的子程序GQRUL,就是不知道GQRUL对点的个数有限制没。不过如果积分区间过大可以分段积分吧
回复 支持1
2014-07-03 07:01:11 楚香饭(楚香饭)
altidore 于 2014-07-02 23:27:36发布
你用的啥编辑器?
这是标准语法,所有F95的编译器都可以。
回复 支持1
2014-07-02 23:27:36 altidore(altidore)
你用的啥编辑器?
回复 支持0