一个程序彻底搞懂Matlab的数值积分、符号积分问题。
- 数值积分问题,给定被积分函数和积分上下限,使用 integral 函数得到积分值;
- 符号积分问题,通常结果是解析解,即需要知道被积分函数的原函数表达式;如果原函数未知或者表达形式过于复杂(同样没有明确的表达式),可以自定义一个积分函数(给定一个积分区间,返回一个积分值)来简短表达;
- 一重积分问题本质上得到的是面积,当然可以用积分定义来计算总积分。
function IntegralDemo()
clear; clc;
%% 数值积分
% sample 1
fun1 = @(x) sin(x);
result = integral(fun1, 0, pi);
disp(result); % 2.0000
% sample 2
fun2 = @(x) sin(x) ./ x; % 注意运算符 ./
result = integral(fun2, 0, 1);
disp(result); % 0.9461
%% 解析解
syms x t
% sample 3
y1 = sin(x);
f1 = int(y1, x, 0, t);
disp(f1); % 1 - cos(t)
% sample 4
y2 = sin(x) / x;
f2 = int(y2, x, 0, t);
disp(f2); % sinint(t)
disp(double(subs(f2, t, 1))); % 0.9461,相当于 sample 2 的结果;
disp(MyIntegral1(fun2, 0, 1, 10000)); % 0.9461, 用自定义的积分方法
disp(MyIntegral2(fun2, 0, 1)); % 0.9461, 用自定义的积分方法
% f2 和 MyIntegral1(fun, 0, t, 10000) 或者 MyIntegral2(fun, 0, t) 等价
% 情况复杂一点,被积分函数没有原函数或者没有明确的表达式,可以采用自定义函数这种方法
function result = MyIntegral1(fun, minX, maxX, intervalCount)
% fun: 函数句柄
% minX: 积分下限
% maxX: 积分上限
% intervalCount: 积分区间份数
% 利用积分的定义来求面积
result = 0;
h = (maxX - minX) / intervalCount; % 步长
for i = 1 : intervalCount
result = result + h * fun(minX + (i - 0.5) * h); % 采用简单矩形公式:面积 = 底 × 高
end
function result = MyIntegral2(fun, minX, maxX)
% fun: 函数句柄
% minX: 积分下限
% maxX: 积分上限
% 调用 integral 函数
result = integral(fun, minX, maxX);