高斯-勒让德求积公式及Matlab实现

初学Markdown编辑器,编排及内容错误请指正,谢谢。

1. 引言

       众所周知,微积分的两大部分是微分与积分。微分实际上是求一函数的导数,而积分是已知一函数的导数,求这一函数。所以,微分与积分互为逆运算。实际上,积分还可以分为两部分。第一种,是单纯的积分,也就是已知导数求原函数,称为不定积分。相对而言,另一种就是定积分了,之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,而不是一个函数。计算定积分的方法很多,而高斯—勒让德公式就是其中之一。
       高斯积分法是精度最高的插值型数值积分,具有 2n+1 2 n + 1 阶精度,并且高斯积分总是稳定。而高斯求积系数,可以由Lagrange多项式插值系数进行积分得到。
       高斯-勒让德求积公式是构造高精度差值积分的最好方法之一。他是通过让节点和积分系数待定让函数 f(x) f ( x ) 以此取 i=0,1,2....n i = 0 , 1 , 2.... n 次多项式使其尽可能多的能够精确成立来求出积分节点和积分系数。高斯积分的代数精度是 2n1 2 n − 1 ,而且是最高的。通常运用的是 (1,1) ( − 1 , 1 ) 的积分节点和积分系数,其他积分域是通过一定的变换变换到-1到1之间积分。

2. 高斯-勒让德求积公式

       在区间 [1,1] [ − 1 , 1 ] 上,高斯-勒让德求积公式为

11f(x)dxk=0xAkf(xk) ∫ − 1 1 f ( x ) d x ≈ ∑ k = 0 x A k f ( x k )
我们知道勒让德多项式 Pn+1(x) P n + 1 ( x ) 的零点就是求积公式的高斯点,形如上式的高斯公式特别的称为高斯-勒让德公式。
       若取 P1(x)=x P 1 ( x ) = x 的零点 x0=0 x 0 = 0 做节点构造求积公式
11f(x)dxA0f(0) ∫ − 1 1 f ( x ) d x ≈ A 0 f ( 0 )
令它对 f(x)=1 f ( x ) = 1 准确成立,即可定出 A0=2 A 0 = 2 。这样构造出的一点高斯-勒让德求积公式是中矩形公式,再取 P2(x)=12(3x21) P 2 ( x ) = 1 2 ( 3 x 2 − 1 ) 的两个零点 ±13 ± 1 3 构造求积公式
11f(x)dxA0f(13)+A1f(13) ∫ − 1 1 f ( x ) d x ≈ A 0 f ( − 1 3 ) + A 1 f ( 1 3 )
令它对 f(x)=1,x f ( x ) = 1 , x 都准确成立,有
A0+A1=2,A0(13)+A1(13)=0 { A 0 + A 1 = 2 , A 0 ( − 1 3 ) + A 1 ( 1 3 ) = 0

由此解出 A0=A1=1 A 0 = A 1 = 1 ,从而得到两点高斯-勒让德求积公式
11f(x)dxf(13)+f(13) ∫ − 1 1 f ( x ) d x ≈ f ( − 1 3 ) + f ( 1 3 )

三点高斯-勒让德公式的形式是
11f(x)dx59f(155)+89f(0)+59f(155) ∫ − 1 1 f ( x ) d x ≈ 5 9 f ( − 15 5 ) + 8 9 f ( 0 ) + 5 9 f ( 15 5 )
下表给出常用的高斯-勒让德求积公式的节点和系数

节点数 xk x k Ak A k
1 0.0000000 2.0000000
2 ± ± 0.5773503 1.0000000
3 ± ± 0.7745967 0.0000000 0.5555556 0.8888889
4 ± ± 0.8611363 ± ± 0.3399810 0.3478548 0.6521452

当积分区间不是 [1,1] [ − 1 , 1 ] ,而是一般的区间 [a,b] [ a , b ] ,只要做变换

x=ba2t+a+b2 x = b − a 2 t + a + b 2
可将 [a,b] [ a , b ] 化为 [1,1] [ − 1 , 1 ] ,这时
baf(x)dx=ba211f(ba2t+a+b2)dt ∫ a b f ( x ) d x = b − a 2 ∫ − 1 1 f ( b − a 2 t + a + b 2 ) d t

3. Matlab数值求解高斯-勒让德积分

例1:用两点高斯-勒让德积分公式求 10x3dx ∫ 0 1 x 3 d x
       我们可以很容易知道结果为 0.25 0.25 接下来用matlab数值求解:

GaussP=[-0.5773503 0.5773503];                              %高斯点
GaussA=[1 1];                                               %高斯系数
h = 0.1;                                                    %剖分步长
x = 0:h:1;                                                  %区间[0,1]
for i=1:length(x)-1
    points = h/2*GaussP + (x(i+1)+x(i))/2;                  %区间变换
    f(i) = 0;
    for k=1:2
        f(i) = f(i) + h/2*points(k)^2*GaussA(k);
    end
end
result = sum(f)

可以得到结果为:0.250000000133413。
例2:用三点高斯-勒让德积分公式求 10x2(1x)2dx ∫ 0 1 x 2 ( 1 − x ) 2 d x
       我们可以很容易知道结果为 1300.033333333333333 1 30 ≈ 0.033333333333333 接下来用matlab数值求解:

GaussP=[-0.7745967 0 0.7745967];                            %高斯点
GaussA=[0.5555556 0.8888889 0.5555556];                     %高斯系数
h = 0.1;                                                    %剖分步长
x = 0:h:1;                                                  %区间[0,1]
for i=1:length(x)-1
    points = h/2*GaussP + (x(i+1)+x(i))/2;                  %区间变换
    f(i) = 0;
    for k=1:3
        f(i) = f(i) + h/2*(points(k)^2*(1-points(k))^2)*GaussA(k);
    end
end
result = sum(f)

结果为:0.033333334999780

你可能感兴趣的:(数学)