数值积分——(Newton-Cotes)牛顿-科特斯求积公式 | 北太天元 or matlab

本文介绍了Newton-Cotes求积公式,包括其基本原理、Cotes系数表以及Matlab中的算法实现。通过实例展示了如何使用这些公式计算积分并分析其在不同阶数下的精度。
摘要由CSDN通过智能技术生成

文章对应视频讲解:(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 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)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公式得到的积分近似值

三、北太天元 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 n7 的求积公式。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清水折木

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

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

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

打赏作者

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

抵扣说明:

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

余额充值