主要内容

积分

如果 f 是一个符号表达式,则

int(f)

尝试找到另一个符号表达式 F,使得 diff(F) = f。也就是说,int(f) 返回 f 的不定积分或原函数(如果存在闭式形式的不定积分或原函数)。与微分类似,

int(f,v)

使用符号对象 v 作为积分变量,而不是由 symvar 确定的变量。您可以通过查看下表了解 int 的工作原理。

数学运算

MATLAB® 命令

xndx={log(x)if n=1xn+1n+1otherwise.

int(x^n)int(x^n,x)

0π/2sin(2x)dx=1

int(sin(2*x), 0, pi/2)int(sin(2*x), x, 0, pi/2)

g = cos(at + b)

g(t)dt=sin(at+b)/a

g = cos(a*t + b) int(g)int(g, t)

J1(z)dz=J0(z)

int(besselj(1, z))int(besselj(1, z), z)

与微分相比,符号积分是一项更为复杂的任务。计算积分时可能会出现许多困难:

  • 原函数 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)

计算定积分也可以。

定积分

命令

abf(x)dx

int(f, a, b)

abf(v)dv

int(f, v, a, b)

以下是一些其他示例。

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 是任意正实数,则表达式

eax2

表示为正的钟形曲线,当 x 趋于 ±∞ 时,该曲线趋于 0。您可以取 a = 1/2,创建这样一条曲线。

syms x
a = sym(1/2);
f = exp(-a*x^2);
fplot(f)

Figure contains an axes object. The axes object contains an object of type functionline.

但是,如果您尝试计算积分

eax2dx

而不给 a 赋值,则 MATLAB 假设 a 表示一个复数,因此返回一个取决于参量 a 的分段解。如果您只对 a 为正实数的情况感兴趣,请使用 assumea 设置假设:

syms a
assume(a > 0)

现在您可以使用以下命令计算前面的积分

syms x
f = exp(-a*x^2);
int(f, x, -inf, inf)

此命令返回

ans =
pi^(1/2)/a^(1/2)

使用带复数参数的积分

要计算积分

1a2+x2dx

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 定义为:

signIm(z)={1if Im(z)>0, or Im(z)=0 and Re(z)<00if  z=0-1otherwise.

Cartesian representation of a complex number z, showing regions where signIm has a value of 1, 0, and -1

要计算 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 函数则使用双精度算术。

使用 integralvpaintegralbesseli(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

另请参阅

| |

外部网站