数值积分——复化(Simpson)辛普森求积公式 | 北太天元 or matlab
清水折木 2024-07-04 10:05:02 阅读 56
文章对应的视频讲解 :复化(Simpson)辛普森求积公式
复化Simpson求积公式
Simpson公式
∫
a
b
f
(
x
)
d
x
≈
b
−
a
6
(
f
(
a
)
+
4
f
(
a
+
b
2
)
+
f
(
b
)
)
.
\int_a^bf(x)\mathrm{d}x\approx\frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right).
∫abf(x)dx≈6b−a(f(a)+4f(2a+b)+f(b)).
将积分区间
[
a
,
b
]
[a,b]
[a,b]进行
2
m
2m
2m(偶)等分,记
n
=
2
m
n = 2m
n=2m,其中
n
+
1
n+1
n+1 是节点总数,
m
m
m 是积分子区间的总数。
步长
h
=
b
−
a
n
h=\frac{b-a}{n}
h=nb−a,节点
x
k
=
a
+
k
h
,
(
k
=
0
,
1
,
2
,
⋯
,
n
)
x_{k}=a+kh,(k=0,1,2,\cdots,n)
xk=a+kh,(k=0,1,2,⋯,n)
∫
a
b
f
(
x
)
d
x
=
∑
i
=
0
m
−
1
∫
x
2
i
x
2
i
+
2
f
(
x
)
d
x
\int_{a}^{b}f(x)\mathrm{d}x=\sum_{i=0}^{m-1}\int_{x_{2i}}^{x_{2i+2}}f(x)\mathrm{d}x
∫abf(x)dx=i=0∑m−1∫x2ix2i+2f(x)dx
在$ [x_{2i},x_{2i+2}] $上用Simpson公式
∫
x
2
i
x
2
i
+
2
f
(
x
)
d
x
≈
h
3
[
f
(
x
2
i
)
+
4
f
(
x
2
i
+
1
)
+
f
(
x
2
i
+
2
)
]
\int_{x_{2i}}^{x_{2i+2}}f(x)\mathrm{d}x \approx \frac{h}{3}[f(x_{2i})+4f(x_{2i+1})+f(x_{2i+2})]
∫x2ix2i+2f(x)dx≈3h[f(x2i)+4f(x2i+1)+f(x2i+2)]
累加得复化Simpson求积公式
S
n
(
f
)
≈
h
3
[
f
(
a
)
+
4
∑
i
=
0
m
−
1
f
(
x
2
i
+
1
)
+
2
∑
i
=
1
m
−
1
f
(
x
2
i
)
+
f
(
b
)
]
S_n(f) \approx\frac{h}{3}\left[f(a)+4\sum_{i=0}^{m-1}f(x_{2i+1})+2\sum_{i=1}^{m-1}f(x_{2i})+f(b)\right]
Sn(f)≈3h[f(a)+4i=0∑m−1f(x2i+1)+2i=1∑m−1f(x2i)+f(b)]
算法
♡
\heartsuit
♡ 复化Simpson积分:<code>S = comp_simpson_integral(a,b,n,f)
输入
[
a
,
b
]
[a,b]
[a,b]
n
n
n:将
[
a
,
b
]
[a,b]
[a,b]
n
n
n等分 ,要求
n
n
n为偶数
f
f
f:已经定义好的函数,支持向量运算
实现过程
判断
n
n
n是否是偶数,若不是,
+
1
+1
+1变为偶数
m
=
n
2
m = \frac{n}{2}
m=2n计算出
[
a
,
b
]
[a, b]
[a,b]
n
n
n等分后得到的
n
+
1
n + 1
n+1个节点,构成向量
x
0
x_0
x0
y
0
=
f
(
x
0
)
y_0 = f(x_0)
y0=f(x0)计算
s
u
m
y
1
=
∑
i
=
0
m
−
1
f
(
x
2
i
+
1
)
sumy1 = \sum_{i=0}^{m-1}f(x_{2i+1})
sumy1=i=0∑m−1f(x2i+1)
s
u
m
y
2
=
∑
i
=
1
m
−
1
f
(
x
2
i
)
sumy2 = \sum_{i=1}^{m-1}f(x_{2i})
sumy2=i=1∑m−1f(x2i)
S
=
h
3
[
f
(
a
)
+
4
∗
s
u
m
y
1
+
2
∗
s
u
m
y
2
+
f
(
b
)
]
S =\frac{h}{3}\left[f(a)+4*sumy1+2*sumy2+f(b)\right]
S=3h[f(a)+4∗sumy1+2∗sumy2+f(b)]
输出
S
S
S
北太天元 or matlab 实现
function S = comp_simpson_integral(a,b,n,f)
% 复化Simpson求积
% [a,b]
% n :小区间的个数, 要求是偶数
% f:定义好的函数
%
% Version: 1.0
% last modified: 07/14/2023
if mod(n,2) != 0 % 判断n是否为偶数,如果不是,使其变为偶数
n = n+1;
end
h = (b-a)/n;
k = 0:1:n;
xi = a + k * h;
yi = f(xi);
m = n/2;
i1 = 0:1:m-1;
sumy1 = sum(yi(2*i1+1 +1)); % f(x_{2i+1})求和
i2 = 1:1:m-1;
sumy2 = sum(yi(2*i2 +1)); % f(x_{2i})求和
S = (yi(1) + 4*sumy1 + 2*sumy2 + yi(n+1)) * h/3;
end
保存为 comp_simpson_integral.m
文件
数值算例
用数值积分法近似计算
π
=
4
∫
0
1
1
1
+
x
2
d
x
\pi = 4\int_0^1 \frac{1}{1+x^2}\mathrm{d}x
π=4∫011+x21dx编写复化Simpson公式的实现程序,分别取剖分段数 $ n = 10, 20, 40, 80, 160, $ 计算积分值与
π
\pi
π 的误差并作图;
clc;clear all;format long;
f = @(x) 4./(1+x.^2);
N = [10 20 40 80 160];
delta = zeros(1,5);
delta1 =delta;
delta2 = delta;
k = 1;
for n = N
S = comp_simpson_integral(0,1,n,f);
T = comp_tra_integral(0,1,n,f);
delta1(k) = abs(pi - S);
delta2(k) = abs(pi - T);
k++;
end
figure(1)
plot(N,delta1,'-or');
title('复化Simpson误差随n的变化')
figure(2)
plot(N,delta2,'-*b');
title('复化梯形误差随n的变化')
运行后得到
对比这两个图像,发现,n= 20 时,两者的误差远远不在一个量级
复化Simpson下,下降速度明显,优势巨大
下一篇: 深度长文解析SpringWebFlux响应式框架15个核心组件源码
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。