玩转 matlab 之二维 gauss 数值积分公式使用及 matlab 源代码(1)-常量区间

一. 标准区间

按照一维情况类似方式,首先给出如下二重积分公式:
I = ∫ − 1 1 d x ∫ − 1 1 f ( x , y ) d y = Σ k = 1 m Σ l = 1 m A k l f ( x k , y l ) . I = \int_{-1}^1dx\int_{-1}^1 f(x,y)dy=\Sigma_{k=1}^m\Sigma_{l=1}^mA_{kl}f(x_k,y_l). I=11dx11f(x,y)dy=Σk=1mΣl=1mAklf(xk,yl).
这是标准的二维gauss积分 m × m m\times m m×m (即 x 轴和 y 轴分别取 m 个点对应 m 2 m^2 m2个点)公式的表达式,其中, x k l x_{kl} xkl 称作gauss积分点, A k l A_{kl} Akl称作 x k l x_{kl} xkl 点处的权重。 m = 1 , 2 , 3 m=1,2,3 m=1,2,3 时候草图如下所示:
gauss
下面给出部分gauss积分点和权重对应列表

gauss点个数 m 2 ( m × m ) m^2(m\times m) m2(m×m)gauss 点 ( x i , y i ) (x_i,y_i) (xi,yi)权重 A i A_i Ai精度(2m-1)
1 ( 1 × 1 1\times 1 1×1) x 1 = y 1 = 0 x_1=y_1=0 x1=y1=0 A 1 A_1 A1=41
4 ( 2 × 2 2 \times 2 2×2) x 1 = − 1 / 3 , y 1 = − 1 / 3 x_{1}=-1/\sqrt{3},y_{1}=-1/\sqrt{3} x1=1/3 ,y1=1/3
x 2 = 1 / 3 , y 2 = − 1 / 3 x_{2}=1/\sqrt{3},y_{2}=-1/\sqrt{3} x2=1/3 ,y2=1/3
x 3 = 1 / 3 , y 3 = 1 / 3 x_{3}=1/\sqrt{3},y_{3}=1/\sqrt{3} x3=1/3 ,y3=1/3
x 4 = − 1 / 3 , y 4 = 1 / 3 x_{4}=-1/\sqrt{3},y_{4}=1/\sqrt{3} x4=1/3 ,y4=1/3
A 1 = A 2 = A 3 = A 4 = 1 A_1=A_2=A_3=A_4=1 A1=A2=A3=A4=13
9 ( 3 × 3 3 \times 3 3×3)
g p t = 3 / 5 gpt=\sqrt{3/5} gpt=3/5
x 1 = − g p t , y 1 = − g p t x_1=-gpt,y_1=-gpt x1=gpt,y1=gpt
x 2 = g p t , y 2 = − g p t x_2=gpt,y_2=-gpt x2=gpt,y2=gpt
x 3 = g p t , y 3 = g p t x_3=gpt,y_3=gpt x3=gpt,y3=gpt
x 4 = − g p t , y 4 = g p t x_4=-gpt,y_4=gpt x4=gpt,y4=gpt
x 5 = 0 , y 5 = − g p t x_5=0,y_5=-gpt x5=0,y5=gpt
x 6 = g p t , y 6 = 0 x_6=gpt,y_6=0 x6=gpt,y6=0
x 7 = 0 , y 7 = g p t x_7=0,y_7=gpt x7=0,y7=gpt
x 8 = − g p t , y 8 = 0 x_8=-gpt,y_8=0 x8=gpt,y8=0
x 9 = 0 , y 9 = 0 x_9=0,y_9=0 x9=0,y9=0
A 1 = A 2 = A 3 = A 4 = 25 / 81 A_1=A_2=A_3=A_4=25/81 A1=A2=A3=A4=25/81
A 5 = A 6 = A 7 = A 8 = 40 / 81 A_5=A_6=A_7=A_8=40/81 A5=A6=A7=A8=40/81
A 9 = 64 / 81 A_9=64/81 A9=64/81
5

一般二重积分近似值也就是使用 2 × 2 , 3 × 3 2\times 2,\quad 3\times 3 2×2,3×3 公式就完全足够了。所以不需要太多的点,徒增计算量。因此就可以得到gauss积分的坐标表达式为:
I = ∫ − 1 1 d x ∫ − 1 1 f ( x , y ) d y = Σ i = 1 m 2 A i f ( x i , y i ) . I = \int_{-1}^1dx\int_{-1}^1 f(x,y)dy=\Sigma_{i=1}^{m^2}A_{i}f(x_i,y_i). I=11dx11f(x,y)dy=Σi=1m2Aif(xi,yi).

二. 一般区间

对于一般区间,先考虑区间端点为常量情况(下一节介绍区间为变量情况),即
I = ∫ a b d x ∫ c d f ( x , y ) d y . I = \int_{a}^bdx\int_{c}^d f(x,y)dy. I=abdxcdf(x,y)dy.
其中 a , b , c , d a,b,c,d a,b,c,d 都是已知常数。与一维情况类似,只需要做变量变换,于是 [ s , t ] ∈ [ − 1 , 1 ] × [ − 1 , 1 ] [s,t]\in[-1,1]\times [-1,1] [s,t][1,1]×[1,1](通俗讲就是换元法)
令 x = b + a + ( b − a ) s 2 , 则 d x = b − a 2 d s , y = d + c + ( d − c ) t 2 , 则 d y = d − c 2 d t . 记 j a c = ( b − a ) ( d − c ) 4 , 则 d x d y = j a c × d s d t 令 \quad x =\frac{b+a+(b-a)s}{2},\qquad 则\quad dx=\frac{b-a}{2}ds,\\ \quad y =\frac{d+c+(d-c)t}{2},\qquad 则\quad dy=\frac{d-c}{2}dt.\\ 记\qquad jac = \frac{(b-a)(d-c)}{4},\qquad 则 \quad dxdy=jac\times dsdt x=2b+a+(ba)s,dx=2bads,y=2d+c+(dc)t,dy=2dcdt.jac=4(ba)(dc),dxdy=jac×dsdt
于是二重积分就变成了
I = ∫ a b d x ∫ c d f ( x , y ) d y = j a c × ∫ − 1 1 d s ∫ − 1 1 f ( b + a + ( b − a ) s 2 , d + c + ( d − c ) t 2 ) d t . = j a c × Σ i = 1 m 2 A i f ( b + a + ( b − a ) s i 2 , d + c + ( d − c ) t i 2 ) . I = \int_{a}^bdx\int_{c}^d f(x,y)dy =jac\times\int_{-1}^1ds\int_{-1}^1f(\frac{b+a+(b-a)s}{2},\frac{d+c+(d-c)t}{2})dt.\\=jac\times\Sigma_{i=1}^{m^2}A_{i}f(\frac{b+a+(b-a)s_i}{2},\frac{d+c+(d-c)t_i}{2}). I=abdxcdf(x,y)dy=jac×11ds11f(2b+a+(ba)s,2d+c+(dc)t)dt.=jac×Σi=1m2Aif(2b+a+(ba)si,2d+c+(dc)ti).
其中 ( s i , t i ) (s_i,t_i) (si,ti) 即为上表中的 gauss 节点,对应的权重因子为 A i A_i Ai

三. 数值实验(没有编程的计算是不完整的)

使用matlab2018a 计算结果,并且与matlab自带函数 integral2 计算的结果进行比较给出误差。

算例如下:
计 算 定 积 分 I = ∫ a b d x ∫ c d f ( x , y ) d y 计算定积分 I = \int_{a}^bdx\int_{c}^d f(x,y)dy I=abdxcdf(x,y)dy
其中, a = 1.4 , b = 2 , c = 1 , d = 1.5 , f ( x , y ) = l n ( x + 2 ∗ y ) , l n a=1.4,b=2,c=1,d=1.5,f(x,y)=ln(x+2*y), ln a=1.4,b=2,c=1,d=1.5,f(x,y)=ln(x+2y),ln是以e为底对数函数。使用matlab的integral2 函数计算结果为 I = 0.429554527548275 I =0.429554527548275 I=0.429554527548275.

自己编程计算结果如下:

高斯点数 m 2 ( m × m ) m^2(m\times m) m2(m×m)积分值 I m I_m Im误差norm( I m − I I_m-I ImI)
4( 2 × 2 2\times 2 2×2)0.4295560880222421.56E-06
9( 3 × 3 3\times 3 3×3)0.4295545311524903.60E-09

四. 总结和下节预告

  1. 从实验数据可以发现,二重gauss数值积分使用 2 × 2 2\times 2 2×2 4个点的情况下,结果已经很准确了,达到了1e-6的误差,所以在实际计算中,一般使用4点或者9点的gauss公式就可以满足要求了。
  2. 下一节介绍当积分区间在变系数下的二重gauss公式的计算方法
  3. 欢迎与我交流,数值分析,矩阵计算,PDE数值解等,QQ群 315241287

五. matlab源代码

clc;clear;
%   compute int_a^b [int_c)^d    f(x,y)]
%   (x,y) \in [a,b] X [c,d]
%%  setup the integral interval and gauss point and weight
a = 1.4;    b = 2;
c = 1;      d =1.5;
fun=@(x,y)    log(x+2*y);
fprintf('***********************************************\n')
for gauss = 2:3 %    m points rule in 2 dimensional case
    if gauss == 2
        fprintf('*******  2X2 points gauss rule result *******')
        gpt=1/sqrt(3);
        s(1) = -gpt;  t(1) = -gpt;
        s(2) =  gpt;  t(2) = -gpt;
        s(3) =  gpt;  t(3) =  gpt;
        s(4) = -gpt;  t(4) =  gpt;
        wt = [1 1 1 1];        
    elseif gauss == 3
        gpt=sqrt(0.6);
        fprintf('*******   3X3 points gauss rule     *******')
        s(1) = -gpt; t(1) = -gpt; wt(1)=25/81;
        s(2) =  gpt; t(2) = -gpt; wt(2)=25/81;
        s(3) =  gpt; t(3) =  gpt; wt(3)=25/81;
        s(4) = -gpt; t(4) =  gpt; wt(4)=25/81;
        s(5) =  0.0; t(5) = -gpt; wt(5)=40/81;
        s(6) =  gpt; t(6) =  0.0; wt(6)=40/81;
        s(7) =  0.0; t(7) =  gpt; wt(7)=40/81;
        s(8) = -gpt; t(8) =  0.0; wt(8)=40/81;
        s(9) =  0.0; t(9) =  0.0; wt(9)=64/81;        
    end
    %%   区间变换到   [-1,1] X [-1,1]
    jac = (b-a)*(d-c)/4;
    x = (b+a+(b-a)*s)/2;
    y = (d+c+(d-c)*t)/2;
    f = fun(x,y);
    comp = wt(:) .* f(:) .* jac;%无论一个向量是行还是列,写成x(:)都会变成列向量
    
    format long
    comp = sum(comp)
    exact = integral2(fun,a,b,c,d);
    
    fprintf('the error is norm(comp-exact)=%10.6e\n\n',norm(comp-exact))
    
end
fprintf('******************************************\n')
fprintf('matlab  built-in function ''integral2''\n')
exact
format short
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值