积分
如果 f 是一个符号表达式,则
int(f)
尝试找到另一个符号表达式 F,使得 diff(F) = f。也就是说,int(f) 返回 f 的不定积分或原函数(如果存在闭式形式的不定积分或原函数)。与微分类似,
int(f,v)
使用符号对象 v 作为积分变量,而不是由 symvar 确定的变量。您可以通过查看下表了解 int 的工作原理。
数学运算 | MATLAB® 命令 |
|---|---|
| |
| |
g = cos(at + b) |
|
|
与微分相比,符号积分是一项更为复杂的任务。计算积分时可能会出现许多困难:
原函数
F可能不存在闭式形式。原函数可能定义了一个不熟悉的函数。
原函数可能存在,但软件找不到它。
软件在更强大的计算机上可能找到原函数,但在当前可用的计算机上会因超时或内存不足而失败。
尽管如此,在许多情况下,MATLAB 仍可成功执行符号积分。例如,创建符号变量
syms a b theta x y n u z
下表说明了包含这些变量的表达式的积分。
f | int(f) |
|---|---|
syms x n f = x^n; | int(f) ans = piecewise(n == -1, log(x), n ~= -1,... x^(n + 1)/(n + 1)) |
syms y f = y^(-1); | int(f) ans = log(y) |
syms x n f = n^x; | int(f) ans = n^x/log(n) |
syms a b theta f = sin(a*theta+b); | int(f) ans = -cos(b + a*theta)/a |
syms u f = 1/(1+u^2); | int(f) ans = atan(u) |
syms x f = exp(-x^2); | int(f) ans = (pi^(1/2)*erf(x))/2 |
在最后一个示例 exp(-x^2) 中,无法使用标准微积分表达式(如三角函数和指数函数)来表示该积分的公式。在这种情况下,MATLAB 返回一个以误差函数 erf 表示的解。
如果 MATLAB 无法求解函数 f 的积分,则直接返回 int(f)。
计算定积分也可以。
定积分 | 命令 |
|---|---|
|
|
|
|
以下是一些其他示例。
f | a, b | int(f, a, b) |
|---|---|---|
syms x f = x^7; | a = 0; b = 1; | int(f, a, b) ans = 1/8 |
syms x f = 1/x; | a = 1; b = 2; | int(f, a, b) ans = log(2) |
syms x f = log(x)*sqrt(x); | a = 0; b = 1; | int(f, a, b) ans = -4/9 |
syms x f = exp(-x^2); | a = 0; b = inf; | int(f, a, b) ans = pi^(1/2)/2 |
syms z f = besselj(1,z)^2; | a = 0; b = 1; | int(f, a, b) ans =
hypergeom([3/2, 3/2],...
[2, 5/2, 3], -1)/12 |
对于贝塞尔函数 (besselj) 示例,可以使用 double 函数计算积分值的数值逼近。命令
syms z a = int(besselj(1,z)^2,0,1)
返回
a = hypergeom([3/2, 3/2], [2, 5/2, 3], -1)/12
而命令
a = double(a)
返回
a =
0.0717使用带实参数的积分
符号积分涉及的一个微妙之处在于各参数的“取值”。例如,如果 a 是任意正实数,则表达式
表示为正的钟形曲线,当 x 趋于 ±∞ 时,该曲线趋于 0。您可以取 a = 1/2,创建这样一条曲线。
syms x
a = sym(1/2);
f = exp(-a*x^2);
fplot(f)
但是,如果您尝试计算积分
而不给 a 赋值,则 MATLAB 假设 a 表示一个复数,因此返回一个取决于参量 a 的分段解。如果您只对 a 为正实数的情况感兴趣,请使用 assume 对 a 设置假设:
syms a assume(a > 0)
现在您可以使用以下命令计算前面的积分
syms x f = exp(-a*x^2); int(f, x, -inf, inf)
此命令返回
ans = pi^(1/2)/a^(1/2)
使用带复数参数的积分
要计算积分
当 a 为复数时,请输入
syms a x f = 1/(a^2 + x^2); F = int(f, x, -inf, inf)
使用 syms 清除关于变量的所有假设。有关符号变量及其相关假设的详细信息,请参阅Use Assumptions on Symbolic Variables。
前面的命令会产生复数输出
F = (pi*signIm(1i/a))/a
函数 signIm 定义为:

要计算 a = 1 + i 处的 F 值,请输入
g = subs(F, 1 + i)
g = pi*(1/2 - 1i/2)
double(g)
ans = 1.5708 - 1.5708i
使用可变精度算术进行高精度数值积分
高精度数值积分可通过 Symbolic Math Toolbox™ 的 vpaintegral 函数实现。vpaintegral 使用可变精度算术,而 MATLAB 的 integral 函数则使用双精度算术。
使用 integral 和 vpaintegral 对 besseli(5,25*u).*exp(-u*25) 进行积分。integral 函数返回 NaN 并发出警告,而 vpaintegral 函数返回正确结果。
syms u f = besseli(5,25*x).*exp(-x*25); fun = @(u)besseli(5,25*u).*exp(-u*25); usingIntegral = integral(fun, 0, 30) usingVpaintegral = vpaintegral(f, 0, 30)
Warning: Infinite or Not-a-Number value encountered. usingIntegral = NaN usingVpaintegral = 0.688424
有关详细信息,请参阅 vpaintegral。
另请参阅
int | diff | vpaintegral