文章对应视频讲解:(Newton-Cotes)牛顿-科特斯求积公式
一、Newton-Cotes求积公式
对 [ a , b ] [a,b] [a,b] 的 n n n 等分点 x k = a + k h , h = b − a n , k = 0 , 1 , 2 , ⋯ , n x_{k}=a+kh,h=\frac{b-a}{n},k=0,1,2,\cdots,n xk=a+kh,h=nb−a,k=0,1,2,⋯,n
n
n
n 阶Newton-Cotes 公式
∫
a
b
f
(
x
)
d
x
≈
(
b
−
a
)
∑
k
=
0
n
c
k
(
n
)
f
(
x
k
)
\int_a^bf(x)\mathrm{d}x\approx(b-a)\sum_{k=0}^nc_k^{(n)}f(x_k)
∫abf(x)dx≈(b−a)k=0∑nck(n)f(xk)
Cotes 系数,令
x
=
a
+
t
h
x= a+th
x=a+th
C
k
(
n
)
=
1
n
∫
0
n
(
∏
i
=
0
i
≠
k
n
t
−
i
k
−
i
)
d
t
=
(
−
1
)
n
−
k
n
k
!
(
n
−
k
)
!
∫
0
n
∏
i
≠
k
i
=
0
n
(
t
−
i
)
d
t
C_{k}^{(n)}={\frac{1}{n}}\int_{0}^{n}\left(\prod_{i=0\atop i\neq k}^{n}{\frac{t-i}{k-i}}\right)\mathrm{d}t=\frac{(-1)^{n-k}}{nk!(n-k)!}\int_{0}^{n}\prod_{\overset{i=0}{i\neq k}}^{n}(t-i)\mathrm{d}t
Ck(n)=n1∫0n
i=ki=0∏nk−it−i
dt=nk!(n−k)!(−1)n−k∫0ni=ki=0∏n(t−i)dt
Cotes系数表
n | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) | C k ( n ) C_k^{(n)} Ck(n) |
---|---|---|---|---|---|---|---|---|---|
1 | 1 2 \dfrac{1}{2} 21 | 1 2 \dfrac{1}{2} 21 | |||||||
2 | 1 6 \dfrac{1}{6} 61 | 4 6 \dfrac{4}{6} 64 | 1 6 \dfrac{1}{6} 61 | ||||||
3 | 1 8 \dfrac{1}{8} 81 | 3 8 \dfrac{3}{8} 83 | 3 8 \dfrac{3}{8} 83 | 1 8 \dfrac{1}{8} 81 | |||||
4 | 7 90 \dfrac{7}{90} 907 | 32 90 \dfrac{32}{90} 9032 | 12 90 \dfrac{12}{90} 9012 | 32 90 \dfrac{32}{90} 9032 | 7 90 \dfrac{7}{90} 907 | ||||
5 | 19 288 \dfrac{19}{288} 28819 | 75 288 \dfrac{75}{288} 28875 | 50 288 \dfrac{50}{288} 28850 | 50 288 \dfrac{50}{288} 28850 | 75 288 \dfrac{75}{288} 28875 | 19 288 \dfrac{19}{288} 28819 | |||
6 | 41 840 \dfrac{41}{840} 84041 | 216 840 \dfrac{216}{840} 840216 | 27 840 \dfrac{27}{840} 84027 | 272 840 \dfrac{272}{840} 840272 | 27 840 \dfrac{27}{840} 84027 | 216 840 \dfrac{216}{840} 840216 | 41 840 \dfrac{41}{840} 84041 | ||
7 | 751 17280 \dfrac{751}{17280} 17280751 | 3577 17280 \dfrac{3577}{17280} 172803577 | 1323 17280 \dfrac{1323}{17280} 172801323 | 2989 17280 \dfrac{2989}{17280} 172802989 | 2989 17280 \dfrac{2989}{17280} 172802989 | 1323 17280 \dfrac{1323}{17280} 172801323 | 3577 17280 \dfrac{3577}{17280} 172803577 | 751 17280 \dfrac{751}{17280} 17280751 | |
8 | 989 28350 \dfrac{989}{28350} 28350989 | 5888 28350 \dfrac{5888}{28350} 283505888 | − 928 28350 -\dfrac{928}{28350} −28350928 | 10496 28350 \dfrac{10496}{28350} 2835010496 | − 4540 28350 -\dfrac{4540}{28350} −283504540 | 10496 28350 \dfrac{10496}{28350} 2835010496 | − 928 28350 -\dfrac{928}{28350} −28350928 | 5888 28350 \dfrac{5888}{28350} 283505888 | 989 28350 \dfrac{989}{28350} 28350989 |
⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ |
n=1 时,代入Cotes系数得到梯形公式
∫
a
b
f
(
x
)
d
x
≈
b
−
a
2
(
f
(
a
)
+
f
(
b
)
)
\int_{a}^{b}f(x)\mathrm{d}x\approx\frac{b-a}{2}(f(a)+f(b))
∫abf(x)dx≈2b−a(f(a)+f(b))
n=2 时,代入Cotes系数得到 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)).
n=4 时,代入Cotes系数得到 四阶Newton-Cotes公式
∫
a
b
f
(
x
)
d
x
≈
b
−
a
90
(
7
f
(
x
0
)
+
32
f
(
x
1
)
+
12
f
(
x
2
)
+
32
f
(
x
3
)
+
7
f
(
x
4
)
)
.
\int_a^bf(x)\mathrm{d}x\approx\frac{b-a}{90}(7f(x_0)+32f(x_1)+12f(x_2)+32f(x_3)+7f(x_4)).
∫abf(x)dx≈90b−a(7f(x0)+32f(x1)+12f(x2)+32f(x3)+7f(x4)).
二、算法
♡
\heartsuit
♡ Newton-Cotes求积公式:[NC] = ncotes_integral(a,b,n,f)
-
输入
- [ a , b ] [a,b] [a,b]
- n n n:将 [ a , b ] [a,b] [a,b] n n n 等分
- f f f:已经定义好的函数,支持向量运算
-
实现步骤
- 通过 [ 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)
- n n n 确定 Newton-Cotes求积公式的阶数,和所要用到的 Cotes 系数
- 代入
∫ a b f ( x ) d x ≈ ( b − a ) ∑ k = 0 n c k ( n ) f ( x k ) = N C \int_a^b f(x) \mathrm{d}x \approx (b-a) \sum_{k=0}^n c_k^{(n)} f(x_k) = NC ∫abf(x)dx≈(b−a)k=0∑nck(n)f(xk)=NC
-
输出
- N C NC NC:通过Newton-Cotes公式得到的积分近似值
三、北太天元 or matlab 实现
function [NC] = ncotes_integral(a,b,n,f)
% Newton-Cotes 求积公式
% [a,b] 的 n 等分
% f:提前定义好的函数,要求支持向量运算
% n 不超过 8
%linspace可以把[a,b]等分成n个点,n-1个区间
%
% Version: 1.0
% last modified: 07/06/2023
x0 = linspace(a,b,n+1); % 故此处是n+1
y0 = f(x0);
Cotes = cell(1,8); % 创建一个空的元胞数组
Cotes{1} = [1/2 1/2];
Cotes{2} = [1/6 4/6 1/6];
Cotes{3} = [1/8 3/8 3/8 1/8];
Cotes{4} = [7/90 32/90 12/90 32/90 7/90];
Cotes{5} = [19/288 75/288 50/288 50/288 75/288 19/288];
Cotes{6} = [41/840 216/840 27/840 272/840 27/840 216/840 41/840];
Cotes{7} = [751/17280 3577/17280 1323/17280 2989/17280 2989/17280 1323/17280 3588/17280 751/17280];
Cotes{8} = [989/28350 5888/28350 -928/28350 10496/28350 -4540/28350 10496/28350 -928/28350 5888/28350 989/28350];
sum_yc = sum(Cotes{n} .* y0);
NC = (b-a) * sum_yc;
end
保存为ncotes_integral.m
文件
四、数值算例
用Newton-Cotes公式计算
∫
−
4
4
d
x
1
+
x
2
=
2
arctan
(
4
)
≈
2.6516
\int_{-4}^4\frac{\mathrm{d}x}{1+x^2}=2\arctan(4)\approx2.6516
∫−441+x2dx=2arctan(4)≈2.6516
clc,clear all,format long;
f1 = @(x)1./(1+x.^2);
a = -4; b = 4;
real = 2.6516; % 真实值取4位小数的值
Nc = zeros(1,8);
delta = zeros(1,8);
for n =1:1:8
Nc(n) = ncotes_integral(a,b,n,f1);
delta(n) = abs(Nc(n)-real);
end
n =1:8;
figure(1);
plot(n,Nc,'-*b');
hold on
plot(n,real*ones(1,8),'-o')
legend('N-C','real')
title('不同n下N-C与真实值的区别')
figure(2);
plot(n,delta,'-*r');
运行后得
可以看到 n=8 时, 误差不降反增,这主要是因为Cotes系数中出现了负数,使其稳定性下降
实际应用时,只会使用 n ≤ 7 n\leq 7 n≤7 的求积公式。