高斯勒让德求积分Fortran程序 [我来说两句]
评论列表(评论 10)以下网友评论只代表网友个人观点,不代表本站观点。
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!谢谢!
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! 谢谢!
2018-09-06 23:36:52 2018023336(2018023336)
aoeo2jam 于 2017-04-24 11:30:03发布
vvt 于 2017-04-26 21:02:36发布不妨到论坛发个帖子,格式更容易控制。挺好的。不过有几个小地方可以改进: 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)
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)
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)
2016-08-13 16:30:09 无奈的小强(无奈的小强)
2015-09-09 19:32:20 fourierliu(fourierliu)
2014-07-03 10:39:01 altidore(altidore)
altidore 于 2014-07-02 23:27:36发布
chuxf 于 2014-07-03 07:01:11发布这是标准语法,所有F95的编译器都可以。你用的啥编辑器?
2014-07-03 07:01:11 楚香饭(楚香饭)
2014-07-02 23:27:36 altidore(altidore)
评论排行
- ·Simply Fortran 编译器(36)
- ·《FORTRAN常用算法程序集》...(15)
- ·塑性力学有限元-理论与应用...(15)
- ·FAQ之 Debug单步调试(12)
- ·Intent属性对结构体中动态...(11)
- ·高斯勒让德求积分Fortran程序(10)
- ·Intel Fortran编译器(10)
- ·《Intel Visual Fortran...(10)
- ·《Fortran95 程序设计》【...(10)
- ·FAQ之 Intel Fortran + VS 基本操作(10)
- ·任意表达式求值模块(9)
- ·《使用OpenMP 进行 Fortr...(9)
- ·差分进化算法(8)
- ·新语法系列 之 定义变量...(8)
- ·教你看懂 Intel Fortran...(8)
- ·《Fortran95 2003 For S...(8)
- ·堆栈(stack)的故事(8)
- ·快速傅里叶变换FFT(8)
- ·Fortran 95/2003科学计算与工程(8)
- ·FAQ之 Intel Fortran + VS 安装配置(7)
请您注意: