导论
关于积分的基础知识,本文不再赘述。牛顿-科特斯公式的基本思想是:使用容易积分的多项式代替复杂函数或列表数据,通用公式如下:
其中:
根据选取多项式的阶数,可分为梯形法则(一阶多项式);辛普森法则(辛普森1/3法则(二次多项式)、辛普森3/8法则(三次多项式));...
在整个区间应用一次牛顿-斯科特公式精度较低,常用的方法是将a~b积分区间分成很多小区间,在每个小区间上应用牛顿-斯科特公式,称为复合斯科特公式。
复合梯形法则
在一个区间中应用梯形法则公式如下:
a~b之间划分n个等宽小区间,则复合梯形法则公式为:
下面给出一个梯形法则的Matalb实现:
function I = trap(func, a, b, n, varargin)
% 牛顿-科特斯公式求解积分(梯形法则)
if nargin<4||isempty(n),n = 100;end
x = a; h = (b-a)/n;
s = func(a, varargin{:});
for i = 1:n-1
x = x+h;
s = s + 2*func(x, varargin{:});
end
s = s + func(b, varargin{:});
I = (b-a) * s/(2*n);
end
复合辛普森1/3法则
当f(x0)和f(x2)之间另外添加一个中点,那么这三个点可以用抛物线相连:
则将a~b之间划分多个等距的小区间,总的积分表示为:
注意:该方法中小区间的个数必须为偶数
下面给出一个辛普森1/3法则的Matlab实现:
function I = simpson(func, a, b, n, varargin)
% 辛普森1/3法则计算积分(小区间个数必须为偶数个,即n必须为偶数)
x = a; h = (b-a) / n;
s = func(a, varargin{:});
for i = 1:n-1
x = x+h;
if mod(i, 2) == 0
s = s + 4*func(x, varargin{:});
else
s = s + 2*func(x, varargin{:});
end
end
s = s + func(b, varargin{:});
I = (b-a) * s / (3*n);
end
辛普森3/8法则
对四个点进行三次拉格朗日插值然后积分得到:
一般将辛普森1/3法则和辛普森3/8法则结合使用以应对奇数个区间的情况。
非等距积分
可使用复合梯形法则/复合辛普森法则,但无法得出最后的公式,而是通过循环在每一个小区间进行积分。
Matlab中的积分函数
一重积分
z = trapz(x, y);
其中两个向量x和y分别存储自变量和因变量,z为积分结果。
z = cumtrapz(x, y);
此函数用于计算累积积分,z为向量,其元素z(k)是从x(1)到x(k)的积分值。
trapz与cumtrapz两个函数针对离散数据点积分,而integral函数针对函数表达式进行积分。
z = integral(fun, xmin, xmax);
多重积分
q = integral2(fun, xmin, xmax, ymin, ymax);
q = integral3(fun, xmin, xmax, ymin, ymax, zmin, zmax);
q为函数fun在xmin到xmax和ymin到ymax区域上的二重积分。