MATLAB - 梯形法则



梯形法则是一种用于逼近函数定积分的数值方法。它通过将曲线下的面积分成一系列梯形而不是矩形(如矩形法则),然后将它们的面积相加来获得总积分的估计值。

梯形法则的步骤详解

步骤 1 - 分割区间 [a, b]

应用梯形法则的第一步是将要积分函数 f(x) 的区间 [a,b] 分成 n 个宽度相等的子区间 Δx。

每个子区间的宽度 Δx 计算如下:

$$\mathrm{\Delta x\: = \: \frac{b \: - \: a}{n}}$$

此分割得到 n+1 个点 x0,x1,x2,…,xn,其中

$$\mathrm{x_{i} \: = \: a \: + \: i\cdot\Delta x \:\:for\: i \: = \: 0,1,2,\dots, n }$$

这里,x0 = a 和 xn = b 表示区间的端点。

步骤 2 - 形成梯形

$$\mathrm{\begin{bmatrix} x_{i - 1}, & x_{i} \end{bmatrix}}$$

对于每个子区间,使用子区间端点处的函数值形成一个梯形:

$$\mathrm{f(x_{i-1}) \: and \: f(x_{i})}$$

$$\mathrm{\begin{bmatrix} x_{i - 1}, & x_{i} \end{bmatrix}}$$

底边为 f(xi-1) 和 f(xi),高为 Δx 的梯形的面积由下式给出:

$$\mathrm{梯形_{i}面积 \: = \: \frac{1}{2} \: \times \: \Delta x \: \times \: [f(x_{i-1}) \: + \: f(x_{i})]}$$

曲线下的总近似面积(代表积分)是所有梯形面积的总和。

步骤 3 - 对梯形面积求和

区间 [a,b] 上函数 f(x) 的积分近似于所有梯形面积的总和:

$$\mathrm{\displaystyle\int_{a}^{b} f(x)\: dx\: \approx \: \displaystyle\sum\limits_{i=1}^n \: 梯形_{i}面积}$$

代入面积公式,则变为:

$$\mathrm{\displaystyle\int_{a}^{b} f(x)\: dx\: \approx \: \frac{\Delta x}{2} \left[f(x_{0}) \: + \: 2 \displaystyle\sum\limits_{i=1}^{n-1} f(x_{i}) \: + \: f(x_{n})\right]}$$

此公式给出了函数值的加权和,其中端点 f(x0) 和 f(xn) 各计数一次,而所有中间函数值 f(x1), f(x2), …..f(xn-1) 各计数两次。

现在让我们看看如何在 matlab 中实现梯形法则。

可以使用循环进行手动方法或利用内置的 trapz 函数在 MATLAB 中实现梯形法则。

语法

Q = trapz(Y)
Q = trapz(X,Y)
Q = trapz(___,dim)

语法解释

trapz(Y) - 对于向量 Y,它使用梯形法则计算 Y 中值的近似积分,假设点是等距的。

对于矩阵 Y,它分别计算每一列的积分,得到一个包含结果的行向量。对于多维数组 Y,它沿第一个具有多个元素的维度计算积分。计算后,此维度变为单个值,而其他维度保持不变。

trapz(X,Y) - 它使用梯形法则计算 Y 的积分,关于 X 给出的值或间距。

如果 X 是坐标向量:X 中的元素个数必须与 Y 的第一个具有多个元素的维度的尺寸匹配。

如果 X 是单个数字(标量),trapz(X,Y) 与将该数字 X 乘以 trapz(Y) 的结果相同,后者假设均匀间距。

trapz(___,dim) - 对于 Q = trapz(___,dim):它使用梯形法则沿 Y 的特定维度 dim 计算积分。必须指定 Y,也可以选择性地指定 X。如果提供 X,它可以是单个数字(标量)或长度与 Y 沿指定的维度 dim 的大小匹配的向量。例如:如果 Y 是矩阵并且使用 trapz(X,Y,2),它将对 Y 的每一行进行积分。

示例 1:使用 trapz(Y),其中 Y 是向量

Y = [1, 4, 9, 16, 25];
Q = trapz(Y);
disp(Q);

该向量表示一系列等距点(假设相隔 1 个单位)的值。trapz(Y) 函数计算这些值的近似积分。

输出 Q 是 Y 中值的近似积分,它给出了这些点表示的曲线下的总面积。

执行后,输出为:

>> Y = [1, 4, 9, 16, 25];
Q = trapz(Y);
disp(Q);

    42

>> 

示例 2:使用 trapz(Y),其中 Y 是矩阵

Y = [1 2 3; 4 5 6; 7 8 9];
Q = trapz(Y);
disp(Q);

该矩阵表示多组数据,每列一组。trapz(Y) 函数分别计算每一列的积分。输出 Q 是一个行向量,包含 Y 的每一列的积分值。对于此矩阵,trapz(Y) 给出的结果类似于 [8 10 12]。

执行后,输出为:

>> Y = [1 2 3; 4 5 6; 7 8 9];
Q = trapz(Y);
disp(Q);
     8    10    12

>> 

示例 3:使用 trapz(X,Y),其中 X 和 Y 是向量

X = [1, 2, 3, 4, 5];
Y = [1, 4, 9, 16, 25];
Q = trapz(X, Y);
disp(Q);

这里,X 是一个向量,其长度必须与 Y 的第一维的大小匹配(两者都有 5 个元素)。

trapz(X,Y) 计算 Y 关于 X 的积分,考虑 X 中点之间的实际间距。

代码执行后,我们得到的输出如下:

>> X = [1, 2, 3, 4, 5];
Y = [1, 4, 9, 16, 25];
Q = trapz(X, Y);
disp(Q);

    42

>> 

示例 4:使用 trapz(X,Y),其中 X 是一个标量数

X = 1;
Y = [1, 4, 9, 16, 25];
Q = trapz(X, Y);
disp(Q);

这里,X 是一个表示点之间均匀间距的单个数字。

trapz(X,Y) 等效于将 X 乘以 trapz(Y) 的结果。由于 X=1,它只返回 trapz(Y) 的结果,假设点是等距的。

输出 Q 将给出 Y 的近似积分,假设点之间有 1 个单位的均匀间距。

代码执行后,我们得到的输出如下。

>> X = 1;
Y = [1, 4, 9, 16, 25];
Q = trapz(X, Y);
disp(Q);

    42

>> 

示例 5:沿列进行积分,dim=1

我们拥有的代码是:

Y = [1 2 3; 
     4 5 6; 
     7 8 9];

Q = trapz(Y, 1);
disp(Q);

维度:dim = 1 表示沿矩阵的每一列进行积分。结果将是一个行向量,其中每个元素表示 Y 的对应列的积分。这里,Q 中的每个值都是 Y 的每一列值的积分。

执行后,我们得到的输出是。

>> Y = [1 2 3; 
     4 5 6; 
     7 8 9];

Q = trapz(Y, 1);
disp(Q);

     8    10    12

>> 

示例 6:沿行进行积分 (dim = 2)

我们拥有的代码是。

Y = [1 2 3; 
     4 5 6; 
     7 8 9];

Q = trapz(Y, 2);
disp(Q);

维度 - dim = 2 表示沿矩阵的每一行进行积分。

结果将是一个列向量,其中每个元素表示 Y 的对应行的积分。

代码执行后,输出是

>> Y = [1 2 3; 
     4 5 6; 
     7 8 9];

Q = trapz(Y, 2);
disp(Q);

     4
    10
    16

>> 
广告