主要内容

simplify

代数简化

说明

S = simplify(expr)expr 执行代数简化。如果 expr 是符号向量或符号矩阵,此函数会简化 expr 的每个元素。

示例

S = simplify(expr,Name=Value) 使用由一个或多个 Name=Value 参量指定的附加选项,对 expr 执行代数简化。

示例

示例

全部折叠

简化以下符号表达式。

syms x a b c
S = simplify(sin(x)^2 + cos(x)^2)
S = 1
S = simplify(exp(c*log(sqrt(a+b))))
S = a+bc/2

对此符号矩阵调用 simplify。当输入参量是向量或矩阵时,simplify 会尝试求向量或矩阵的每个元素的更简形式。

syms x
M = [(x^2 + 5*x + 6)/(x + 2), sin(x)*sin(2*x) + cos(x)*cos(2*x);
		(exp(-x*1i)*1i)/2 - (exp(x*1i)*1i)/2, sqrt(16)];
S = simplify(M)
S = 

(x+3cos(x)sin(x)4)

简化包含对数和幂的符号表达式。默认情况下,simplify 不会合并幂和对数,因为对于一般的复数值,这种合并是无效的。

syms x
expr = (log(x^2 + 2*x + 1) - log(x + 1))*sqrt(x^2);
S = simplify(expr)
S = -log(x+1)-log(x+12)x2

要应用允许 simplify 函数合并幂和对数的简化规则,请将 IgnoreAnalyticConstraints 设置为 true

S = simplify(expr,IgnoreAnalyticConstraints=true)
S = xlog(x+1)

简化此表达式。

syms x
expr = ((exp(-x*1i)*1i) - (exp(x*1i)*1i))/(exp(-x*1i) + exp(x*1i));
S = simplify(expr)
S = 

-e2xii-ie2xi+1

默认情况下,simplify 使用一个内部简化步骤。您可以通过增加简化步数,获得不同且通常更短的简化结果。

S10 = simplify(expr,Steps=10)
S10 = 

2ie2xi+1-i

S30 = simplify(expr,Steps=30)
S30 = 

cos(x)-sin(x)iicos(x)-i

S50 = simplify(expr,Steps=50)
S50 = tan(x)

如果无法返回期望的结果,请尝试使用其他简化函数。请参阅Choose Function to Rearrange Expression

通过将 All 的值设置为 true,获取符号表达式的等效结果。

syms x
expr = cos(x)^2 - sin(x)^2;
S = simplify(expr,All=true)
S = 

(cos(2x)cos(x)2-sin(x)2)

将简化步数增加到 10。求同一表达式的其他等效结果。

S = simplify(expr,Steps=10,All=true)
S = 

(cos(2x)1-2sin(x)22cos(x)2-1cos(x)2-sin(x)2cot(2x)sin(2x)e-2xi2+e2xi2)

通过将 Criterion 的值设置为 "preferReal",尝试分离表达式的实部与虚部。

syms x
f = (exp(x + exp(-x*1i)/2 - exp(x*1i)/2)*1i)/2 -...
    (exp(-x - exp(-x*1i)/2 + exp(x*1i)/2)*1i)/2;
S = simplify(f,Criterion="preferReal",Steps=100)
S = sin(sin(x))cosh(x)+cos(sin(x))sinh(x)i

如果未将 Criterion 设置为 "preferReal",则 simplify 会返回更短的结果,但实部与虚部未分离。

S = simplify(f,Steps=100)
S = sin(sin(x)+xi)

如果将 Criterion 设置为 "preferReal",简化器会避免使用在子表达式中出现复数值的表达式形式。在嵌套子表达式中,复数值在表达式内部出现的位置越深,该表达式形式获得的优先级就越低。

通过将 Criterion 设置为 "preferReal",尝试避免在指数中出现虚数项。

通过对一个复数表达式在 Criterion 设置为和未设置为 "preferReal" 的情况下进行进化,来显示这一行为。当 Criterion 设置为 "preferReal" 时,simplify 会将虚数项放在指数外部。

expr = sym(1i)^(1i+1);
withoutPreferReal = simplify(expr,Steps=100)
withoutPreferReal = 

-112+12i

withPreferReal = simplify(expr,Criterion="preferReal",Steps=100)
withPreferReal = 

e-π2i

使用 simplify 简化包含相同维度的符号单位的表达式。

u = symunit;
expr = 300*u.cm + 40*u.inch + 2*u.m;
S = simplify(expr)
S = 

752125m"meter - a physical unit of length."

simplify 会自动选择要重写成的单位。要选择特定单位,请使用 rewrite

在大多数情况下,使用 Symbolic Math Toolbox™ 简化符号表达式时,您只需使用 simplify 函数。但对于某些大型复杂表达式,您可以在应用 simplify 之前使用 expand 函数,以获得更快且更简化的结果。

例如,在求表示克尔度量 [1] 的矩阵的行列式时,此工作流可提供更好的结果。声明克尔度量的参数。

syms theta real;
syms r rs a real positive;

定义表示克尔度量的矩阵。

rho = sqrt(r^2 + a^2*cos(theta)^2);
delta  = r^2 + a^2 - r*rs;
g(1,1) = - (1 - r*rs/rho^2);
g(1,4) = - (rs*a*r*sin(theta)^2)/rho^2;
g(4,1) = - (rs*a*r*sin(theta)^2)/rho^2;
g(2,2) = rho^2/delta;
g(3,3) = rho^2;
g(4,4) = (r^2 + a^2 + rs*a^2*r*sin(theta)^2/rho^2)*sin(theta)^2;

计算克尔度量的行列式。

det_g = det(g)
det_g = 

-sin(θ)2a6cos(θ)4+a4r2cos(θ)4+2a4r2cos(θ)2+rsa4rcos(θ)2sin(θ)2-rsa4rcos(θ)2+2a2r4cos(θ)2+a2r4-rsa2r3cos(θ)2+rsa2r3sin(θ)2-rsa2r3+r6-rsr5a2+r2-rsr

使用 simplify 函数简化行列式。

D = simplify(det_g)
D = -sin(θ)2a2cos(θ)2+r2-a2sin(θ)2+a2+r2

相反,使用 expand 函数展平表达式,然后应用 simplify 函数。经过此额外步骤后,结果更简洁。

D = simplify(expand(det_g))
D = -sin(θ)2-a2sin(θ)2+a2+r22

输入参数

全部折叠

输入表达式,指定为符号表达式、符号函数、符号向量或符号矩阵。

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: Seconds=60 将简化过程限制为 60 秒。

用于返回等效结果的选项,指定为下列逻辑值之一。当您使用此选项时,输入参量 expr 必须为标量。

false使用默认选项,仅返回最终简化结果。
true返回由输入表达式的等效结果组成的列向量。您可以结合使用此选项与 Steps 选项,以获取简化过程中的替代表达式。

简化准则,指定为下列字符向量之一。

"default"使用默认(内部)简化准则。
"preferReal"优先使用包含实数值的 S 形式,而非包含复数值的形式。如果 S 的任何形式包含复数值,简化器会避免使用在子表达式中出现复数值的形式。对于嵌套子表达式,复数值在表达式内部出现的位置越深,该表达式形式获得的优先级就越低。

简化规则,指定为下列值之一。

false使用严格的简化规则。simplify 始终返回在解析方式上等效于初始表达式的结果。
true对表达式应用纯代数简化。将 IgnoreAnalyticConstraints 设置为 true 可以得到更简单的解,但这可能会导致结果并非在所有情况下都成立。换句话说,此选项应用方便的数学恒等式,但结果可能并不适用于变量的所有可能值。在某些情况下,结果可能不等效于初始表达式。有关详细信息,请参阅算法

简化过程的时间限制,指定为正值,表示最大时间(以秒为单位)。

简化步数,指定为正值,表示最大内部简化步数。请注意,增加简化步数可能会降低计算速度。

simplify(expr,Steps=n) 等效于 simplify(expr,n),其中 n 是简化步数。

提示

  • 数学表达式的简化并非一个定义明确的主题。对于哪种形式的表达式最简,并没有普遍适用的概念。对某个问题而言最简单的数学表达式形式对另一个问题而言可能很复杂,甚至不适用。

算法

当您使用 IgnoreAnalyticConstraints 时,simplify 遵循以下部分规则:

  • 对于 ab 的所有值,有 log(a) + log(b) = log(a·b) 。特别地,对于 abc 的所有值,以下等式成立:

    (a·b)c = ac·bc.

  • 对于 ab 的所有值,有 log(ab) = b·log(a) 。特别地,对于 abc 的所有值,以下等式成立:

    (ab)c = ab·c.

  • 如果 fg 是标准数学函数,并且对于所有小正数都有 f(g(x)) = x,则假设 f(g(x)) = x 对于 x 的所有复数值都成立。特别地:

    • log(ex) = x

    • asin(sin(x)) = x, acos(cos(x)) = x, atan(tan(x)) = x

    • asinh(sinh(x)) = x, acosh(cosh(x)) = x, atanh(tanh(x)) = x

    • 对于朗伯 W 函数的所有分支索引 k,都有 Wk(x·ex) = x

参考

[1] Zee, A. Einstein Gravity in a Nutshell. Princeton: Princeton University Press, 2013.

版本历史记录

在 R2006a 之前推出