一. 标准区间
按照一维情况类似方式,首先给出如下二重积分公式:
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=∫−11dx∫−11f(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点个数 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=4 | 1 |
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=1 | 3 |
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=∫−11dx∫−11f(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=∫abdx∫cdf(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+(b−a)s,则dx=2b−ads,y=2d+c+(d−c)t,则dy=2d−cdt.记jac=4(b−a)(d−c),则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=∫abdx∫cdf(x,y)dy=jac×∫−11ds∫−11f(2b+a+(b−a)s,2d+c+(d−c)t)dt.=jac×Σi=1m2Aif(2b+a+(b−a)si,2d+c+(d−c)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=∫abdx∫cdf(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+2∗y),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 Im−I) |
---|---|---|
4( 2 × 2 2\times 2 2×2) | 0.429556088022242 | 1.56E-06 |
9( 3 × 3 3\times 3 3×3) | 0.429554531152490 | 3.60E-09 |
四. 总结和下节预告
- 从实验数据可以发现,二重gauss数值积分使用 2 × 2 2\times 2 2×2 4个点的情况下,结果已经很准确了,达到了1e-6的误差,所以在实际计算中,一般使用4点或者9点的gauss公式就可以满足要求了。
- 下一节介绍当积分区间在变系数下的二重gauss公式的计算方法
- 欢迎与我交流,数值分析,矩阵计算,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