高斯勒让德求积分Fortran程序 [我来说两句]

最新 最热

评论列表(评论 10)以下网友评论只代表网友个人观点,不代表本站观点。

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)
不妨到论坛发个帖子,格式更容易控制。
回复 支持11
2016-08-13 16:30:09 无奈的小强(无奈的小强)
您好,我想问下,在这个程序中我能否用于积分上下限为函数,而不是数值的程序呢?
回复 支持10
2015-09-09 19:32:20 fourierliu(fourierliu)
这个程序是谢兴兵老师写的,你可以问他
回复 支持6
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)
回复 支持5
2022-06-09 10:25:18 PotsyYZhou(PotsyYZhou)
同上:II ************************ 高斯点序号 1 高斯点 -0.90617984593866363 高斯点权重 0.23692688505619192 高斯点序号 2 高斯点 -0.53846931010568355 高斯点权重 0.47862867049936547 高斯点序号 3 高斯点 -5.3111019847741723E-016 高斯点权重 0.56888888888888889 高斯点序号 4 高斯点 0.53846931010568355 高斯点权重 0.47862867049936547 高斯点序号 5 高斯点 0.90617984593866374 高斯点权重 0.23692688505619142 3.0000000000000142 ...Program finished with exit code 0 Press ENTER to exit console. ************************************ ok!谢谢!
回复 支持2
2022-06-09 10:22:15 PotsyYZhou(PotsyYZhou)
在线编辑器,环境5G通讯,运行测试验证如下: 高斯点序号 1 高斯点 -0.90617984593866363 高斯点权重 0.23692688505619192 高斯点序号 2 高斯点 -0.53846931010568355 高斯点权重 0.47862867049936547 高斯点序号 3 高斯点 -5.3111019847741723E-016 高斯点权重 0.56888888888888889 高斯点序号 4 高斯点 0.53846931010568355 高斯点权重 0.47862867049936547 高斯点序号 5 高斯点 0.90617984593866374 高斯点权重 0.23692688505619142 高斯_勒让德求积分结果 0.11111111111111134 ...Program finished with exit code 0 Press ENTER to exit console. **************************** ok! 谢谢!
回复 支持2
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对点的个数有限制没。不过如果积分区间过大可以分段积分吧
回复 支持2
2014-07-03 07:01:11 楚香饭(楚香饭)
altidore 于 2014-07-02 23:27:36发布
你用的啥编辑器?
这是标准语法,所有F95的编译器都可以。
回复 支持2
2018-09-06 23:36:52 2018023336(2018023336)
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)
vvt 于 2017-04-26 21:02:36发布不妨到论坛发个帖子,格式更容易控制。
您好,我想问下,在这个程序中我能否用于积分上下限为函数,而不是数值的程序呢?
回复 支持1
2014-07-02 23:27:36 altidore(altidore)
你用的啥编辑器?
回复 支持1
对该文发表评论
我的态度:

    登录 | 注册 需要登陆才可发布评论
请您注意:
  • 自觉遵守:爱国、守法、自律、真实、文明的原则
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
  • 严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 您在本站评论发表的作品,本站有权在网站内保留、转载、引用或者删除
  • 参与本评论即表明您已经阅读并接受上述条款