高斯公式求积分,高斯型函数积分
无限区间(1)梯形法则,(2)psdfy法则,(3)zgdgb积分法或(4)kkdmf积分法都有一些适用的指导原则。
一般来说,高阶方法更适合平滑函数。如果不能,最好用更简单的方法,因为数据的变化不会反映在采样点上。梯形法则适用于在均匀间隔的采样点上整合实验数据。这对于性能较差的函数来说很好。为了精确,psdfy的规则依赖于被积函数的高阶近似。虽然kkdmf积分非常精确,但如果需要均匀分布的采样点,就不尽如人意了。
Kkdmf积分
######################################################################
#
#用于计算高斯积分点和权重的函数
#正交
#
# x,w=gaussxw(N)返回积分点x和积分
#权重w使得sum_i w[i]*f(x[i])是n阶
#积分int_{-1}^1 f(x) dx的高斯近似
# x,w=gaussxwab(N,a,b)得出积分点和权重
#映射到区间[a,b],使得sum_i w[i]*f(x[i])
#是积分的n阶高斯近似
# int_a^b f(x) dx
#
#这段代码使用以下方法找到第n个勒让德多项式的零点
#牛顿法,从阿布拉莫维茨给出的近似值开始
#和Stegun 22.16.6。勒让德多项式本身被评估
#使用Abramowitz和Stegun给出的递归关系
# 22.7.10.该函数已针对其他源进行了检查
# N的值最大为1000。它与第2版和第3版兼容
Python的# 3。
#
#单身的奇迹纽曼,2011年6月4日
#您可以自由使用、共享或修改此文件
#
##################%####################################################
从numpy导入一个,copy,cos,tan,pi,linspace
def gaussxw(N):
#勒让德多项式根的初始近似值
a=linspace(3,4*N-1,N)/(4 * N ^ 2)
x=cos(pi*a 1/(8*N*N*tan(a)))
#用牛顿法求根
=1e-15
增量=1.0
而:
P0=1(N,浮点)
p1=副本(x)
对于范围(1,N)中的k:
p0,p1=p1,((2 * k ^ 1)* x * P1-k * P0)/(k ^ 1)
DP=(N ^ 1)*(P0-x * P1)/(1-x * x)
dx=p1/dp
x -=dx
增量=最大值(abs(dx))
#计算重量
w=2 *(N ^ 1)*(N ^ 1)/(N * N *(1-x * x)* DP * DP)
返回x,w
def gaussxwab(N,a,b):
x,w=高斯xw(N)
返回0.5*(b-a)*x 0.5*(b a),0.5*(b-a)*w
计算示例
kkdmf积分的数值算法用于求解kkdmf积分
做积分变换
得到
从gaussxw导入gaussxwab
从数学导入导出
定义f(z):
return exp(-z * * 2/(1-z)* * 2)/(1-z)* * 2
N=50
a=0.0
b=1.0
x,w=gaussxwab(N,a,b)
s=0.0
对于范围(N)中的k:
s=w[k]*f(x[k])
印刷品
实际积分的值是/2,高斯求积精确到机器精度。
重写基本积分公式(6.3)通常是有用的,这样我们可以将加权函数W(x)从被积函数中分离出来:
Kkdmf求积法,若g (x)是(2 N-1)次多项式,则N点和权值选择的近似误差消失。为了获得这种令人难以置信的优化,点
最后,在[a,b]上有一个具体的分布。一般来说,如果g(x)是光滑的,或者可以通过提出一些W(x)使其光滑(表6.2.4),那么对于相同的点数,kkdmf算法会产生比梯形法则和psdfy法则更高的精度。有时被积函数可能不光滑,因为它在不同的区域有不同的行为。在这些情况下,将每个区域分别整合,然后将答案相加是有意义的。事实上,一些“智能”集成子例程决定使用多少个区间以及在每个区间中使用什么规则。
表6.2.4所示规则为kkdmf分布,一般形式为(6.32)。我们可以看到权函数在一种情况下是指数函数,在另一种情况下是kkdmf函数,在几种情况下是可积奇点。与等间距规则不同的是,在区间的极值处永远不存在积分点,点的值和权值随着点数n而变化。虽然我们会离开kkdmf点的推导和权的数值方法的介绍,但是我们注意到,对于普通的kkdmf(Gauss-Legendre)积分,然后是点容易变为零的Legendre多项式,与权0有关的微分。在数学函数库中,生成这些点和权重的子程序是标准的,可以在类似[AS 72]的表格中找到,也可以计算出来。我们的kkdmf子例程也将该点缩放到指定区域。为了检查你的观点是否正确,你可能需要将它们与表6.1中的四点集合进行比较。
映射点
高斯点. py
# GaussPoints.py: N点高斯正交pts Wts生成
将numpy作为np导入
def GaussPoints(NPT,a,b,x,w,eps):
m=0;I=0;j=0;t=0。t1=0。pp=0。
p1=0。p2=0。p3=0。
m=int((Npts 1)/2)
对于范围内的I(1,m ^ 1):
t=NP . cos(NP . pi *(float(I)-0.25)/(float(Npts)0.5))
t1=1
while((abs(t-t1))=eps):
p1=1。p2=0。
对于范围内的j(1,Npts 1):
p3=p2p2=p1
p1=((2。*float(j)-1)*t*p2 - (float(j)-1。)*p3)/(float(j))
pp=Npts*(t*p1 - p2)/(t*t - 1。)
t1=t
t=t1 - p1/pp
x[i-1]=-t
x[Npts-i]=t
w[i-1]=2。/( (1.-t*t)*pp*pp)
w[Npts-i]=w[i-1]
对于范围(0,Npts)中的j:# Scale[-1,1]到[a,b]
x[j]=x[j]*(b-a)/2。(b a)/2。
w[j]=w[j]*(b-a)/2。
从numpy导入*;从测量点导入测量点
Npts=10ans=0;a=0。b=1。eps=3。E-14
w=零(2001,浮点数);x=零(2001,浮点数)#数组
def f(x): return exp(x) #被积函数
高斯点(NPT,a,b,x,w,EPS)# EPS:pts的精度
对于范围(0,Npts)中的I:Ans=f(x[I])* w[I]#被积函数之和
打印( n Npts=,Npts,,Ans=,Ans)
print ( eps=,eps,,Error=,Ans-(exp(1)-1))