一個程序徹底搞懂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);