数值积分——(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=nba,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(ba)k=0nck(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)=n10n i=ki=0nkiti dt=nk!(nk)!(1)nk0ni=ki=0n(ti)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 2 90 \dfrac{2}{90} 902 32 90 \dfrac{32}{90} 9032 7 90 \dfrac{7}{90} 907
5 19 228 \dfrac{19}{228} 22819 75 228 \dfrac{75}{228} 22875 50 228 \dfrac{50}{228} 22850 50 228 \dfrac{50}{228} 22850 75 228 \dfrac{75}{228} 22875 19 228 \dfrac{19}{228} 22819
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)dx2ba(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)dx6ba(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)dx90ba(7f(x0)+32f(x1)+12f(x2)+32f(x3)+7f(x4)).

二、算法

♡ \heartsuit Newton-Cotes求积公式:[NC] = ncotes_integral(a,b,n,f)

  1. 输入

    • [ a , b ] [a,b] [a,b]
    • n n n:将 [ a , b ] [a,b] [a,b] n n n 等分
    • f f f:已经定义好的函数,支持向量运算
  2. 实现步骤

    • 通过 [ 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(ba)k=0nck(n)f(xk)=NC
  3. 输出

    • N C NC NC:通过Newton-Cotes公式得到的积分近似值

三、北太天元源程序

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 2/90 32/90 7/90];
Cotes{5} = [19/228 75/228 50/228 50/228 75/228 19/228];
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 n7 的求积公式。

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水折木

谢谢前辈的鼓励,我会继续加油的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值