主要内容

sym

创建符号变量、表达式、函数、矩阵

说明

x = sym("x") 创建符号标量变量 x

示例

A = sym("a",[n1 ... nM]) 创建一个 n1×...×nM 符号数组,该数组中填充的元素是自动生成的。例如,A = sym("a",[1 3]) 创建行向量 A = [a1 a2 a3]。生成的元素 a1a2a3 不会出现在 MATLAB® 工作区中。对于多维数组,这些元素具有前缀 a,后跟元素的索引并使用 _ 作为分隔符,例如 a1_3_2

示例

A = sym("a",n) 创建一个 n×n 符号矩阵,该矩阵中填充的元素是自动生成的。

示例

sym(___,set) 创建一个符号变量或数组,并设置该变量或所有数组元素属于 set 的假设。此处,set 可以是 "real""positive""integer""rational"。您也可以通过指定字符串数组或字符向量元胞数组来组合多个假设。例如,通过将 set 指定为 ["positive" "rational"]{'positive','rational'} 来假设一个正有理数值。

示例

sym(___,"clear") 清除对符号变量或数组设置的假设。除了组合使用 "clear"set 之外,您可以在上述任何语法的输入参量之后指定 "clear"。您不能在对 sym 的同一个函数调用中既设置又清除假设。

sym(num) 将由 num 指定的数字或数值矩阵转换为符号数或符号矩阵。

示例

sym(num,flag) 使用由 flag 指定的方法将浮点数转换为符号数。

示例

sym(strnum) 将由 strnum 指定的字符向量或字符串转换为精确的符号数,而不进行近似计算。

示例

symexpr = sym(h) 从与函数句柄 h 相关联的匿名 MATLAB 函数创建符号表达式或矩阵 symexpr

示例

symexpr = sym(M)symmatrix 类型的符号矩阵变量 M 转换为 sym 类型的符号标量变量数组 symexpr

示例

示例

全部折叠

创建符号变量 xy

x = sym("x")
x = x
y = sym("y")
y = y

创建一个 1×4 符号向量 a,其中包含自动生成的元素 a1,...,a4

a = sym("a",[1 4])
a = (a1a2a3a4)

您可以通过在第一个参量内使用格式操作符来指定元素名称的格式。sym 会用元素的索引替换 %d 来生成元素名称。

b = sym("x_%d",[1 4])
b = (x1x2x3x4)

然而,这些语法不会在 MATLAB 工作区中创建符号变量 a1, ..., a4x1, ..., x4。要获得 ab 的元素,请使用标准的索引方法。

a(1)
ans = a1
b(2:3)
ans = (x2x3)

创建一个 3×4 符号矩阵,其中包含自动生成的元素。sym 函数生成 Ai,j 形式的矩阵元素。此处,sym 生成元素 A1,1, ..., A3,4

A = sym("A",[3 4])
A = 

(A1,1A1,2A1,3A1,4A2,1A2,2A2,3A2,4A3,1A3,2A3,3A3,4)

通过在第一个参量内使用格式操作符创建一个 4×4 矩阵,其元素名称为 x1,1, ..., x4,4sym 会用元素的索引替换 %d 来生成元素名称。

B = sym("x_%d_%d",4)
B = 

(x1,1x1,2x1,3x1,4x2,1x2,2x2,3x2,4x3,1x3,2x3,3x3,4x4,1x4,2x4,3x4,4)

这些语法不会在 MATLAB 工作区中创建符号变量 A1,1, ..., A3,4x1,1, ..., x4,4。要获得矩阵的元素,请使用圆括号。

A(2,3)
ans = A2,3
B(4,2)
ans = x4,2

创建一个 2×2×2 符号数组,其中包含自动生成的元素 a1,1,1,,a2,2,2

A = sym("a",[2 2 2])
A(:,:,1) = 

(a1,1,1a1,2,1a2,1,1a2,2,1)

A(:,:,2) = 

(a1,1,2a1,2,2a2,1,2a2,2,2)

将数值转换为符号数或表达式。为了获得更高的精度,请对子表达式而不是对整个表达式使用 sym。对整个表达式使用 sym 会导致结果不精确,因为 MATLAB® 首先会将表达式转换为浮点数,这会导致精度损失。sym 并不总是能恢复这种损失的精度。

inaccurate1 = sym(1/1234567)
inaccurate1 = 

76502392869235059444732965739290427392

accurate1 = 1/sym(1234567)
accurate1 = 

11234567

inaccurate2 = sym(sqrt(1234567))
inaccurate2 = 

48867165620185894398046511104

accurate2 = sqrt(sym(1234567))
accurate2 = 1234567
inaccurate3 = sym(exp(pi))
inaccurate3 = 

6513525919879993281474976710656

accurate3 = exp(sym(pi))
accurate3 = eπ

在创建 15 位或更多位数的符号数时,请使用引号来准确表示这些数字。

inaccurateNum = sym(11111111111111111111)
inaccurateNum = 11111111111111110656
accurateNum = sym("11111111111111111111")
accurateNum = 11111111111111111111

当您使用引号创建符号复数时,请将数字的虚部指定为 1i2i 等等。

sym("1234567 + 1i")
ans = 1234567+i

将与 MATLAB® 句柄相关联的匿名函数转换为符号表达式和符号矩阵。

h_expr = @(x)(sin(x) + cos(x));
sym_expr = sym(h_expr)
sym_expr = cos(x)+sin(x)
h_matrix = @(x)(x*pascal(3));
sym_matrix = sym(h_matrix)
sym_matrix = 

(xxxx2x3xx3x6x)

创建符号变量 xyzt 的同时设置假设:x 是实数,y 是正数,z 是有理数,t 是正整数。

x = sym("x","real");
y = sym("y","positive");
z = sym("z","rational");
t = sym("t",["positive" "integer"]);

使用 assumptions 检查对 xyzt 的假设。

assumptions
ans = (tZxRzQ1t0<y)

为了执行进一步的计算,请使用 assume 清除假设。

assume([x y z t],"clear")
assumptions
 
ans =
 
Empty sym: 1-by-0
 

创建一个符号矩阵,并设置对该矩阵的每个元素的假设。

A = sym("A%d%d",[2 2],"positive")
A = 

(A11A12A21A22)

求解涉及 A 的第一个元素的方程。MATLAB 假设这个元素是正数。

solve(A(1,1)^2-1, A(1,1))
ans = 1

使用 assumptions 检查对 A 的元素的假设。

assumptions(A)
ans = (0<A110<A120<A210<A22)

使用 assume 清除先前对该符号矩阵的元素设置的所有假设。

assume(A,"clear");
assumptions(A)
 
ans =
 
Empty sym: 1-by-0
 

再次求解同一个方程。

solve(A(1,1)^2-1, A(1,1))
ans = 

(-11)

pi 转换为符号值。

通过指定可选的第二个参量来选择转换方法,转换方法可以是 "r""f""d""e"。默认为 "r"。有关转换方法的详细信息,请参阅“输入参量”部分。

r = sym(pi)
r = π
f = sym(pi,"f")
f = 

884279719003555281474976710656

d = sym(pi,"d")
d = 3.1415926535897931159979634685442
e = sym(pi,"e")
e = 

π-198eps359

创建一个 3×3 和一个 3×1 符号矩阵变量。

syms A [3 3] matrix
syms X [3 1] matrix

XTAX 的黑塞矩阵。

f = X.'*A*X;
M = diff(f,X,X.')
M = AT+A

将结果从符号矩阵变量转换为符号标量变量矩阵。

S = sym(M)
S = 

(2A1,1A1,2+A2,1A1,3+A3,1A1,2+A2,12A2,2A2,3+A3,2A1,3+A3,1A2,3+A3,22A3,3)

您也可以使用 symmatrix2sym 将符号矩阵变量转换为符号标量变量数组。

S = symmatrix2sym(M)
S = 

(2A1,1A1,2+A2,1A1,3+A3,1A1,2+A2,12A2,2A2,3+A3,2A1,3+A3,1A2,3+A3,22A3,3)

输入参数

全部折叠

变量名称,指定为字符串或字符向量。参量 x 必须是有效的变量名称。也就是说,x 必须以字母开头,并且仅包含字母数字字符和下划线。要验证名称是否为有效的变量名称,请使用 isvarname

示例: "x", "y123", 'z_1'

自动生成的矩阵元素的前缀,指定为字符串或字符向量。参量 a 必须是有效的变量名称。也就是说,a 必须以字母开头,并且仅包含字母数字字符和下划线。要验证名称是否为有效的变量名称,请使用 isvarname

如果您在参量 [n1 ... nM] 中指定参量 a 及其向量、矩阵或数组维度,则 a 可以包含格式化操作符,例如 "a_%d_%d"。有关示例,请参阅创建符号向量创建符号矩阵

示例: "a", "b", 'a_bc'

向量、矩阵或数组维度,指定为整数向量。作为一种快捷方式,您可以通过仅指定一个整数来创建方阵。例如,A = sym("A",3) 会创建一个 3×3 方阵。

示例: [2 3]

对符号变量或矩阵的假设,指定为字符向量、字符串数组或字符向量元胞数组。可用的假设有 "integer""rational""real""positive"

您可以通过指定字符串数组或字符向量元胞数组来组合多个假设。例如,通过将 set 指定为 ["positive" "rational"]{'positive','rational'} 来假设一个正有理数值。

示例: "integer"

要转换为符号数或矩阵的数值,指定为数字、符号常数或数字矩阵。

示例: pi

转换方法,指定为下表中列出的字符之一。

"r"sym 使用有理数模式时,它将通过计算 p/qp*pi/qsqrt(p)2^q10^q(对于中等大小的整数 pq)形式的表达式获得的浮点数转换为相应的符号形式。例如,sym(1/10,"r") 会返回 1/10。此模式可有效地补偿原始计算中涉及的舍入误差,但可能无法精确地表示浮点值。如果 sym 无法求出简单的有理逼近值,它会采用与使用标志 "f" 时相同的方法。
"d"sym 使用十进制模式时,它会从 digits 的当前设置中获得数字位数。少于 16 位的转换会损失一定的精度,而超过 16 位的转换可能并无必要。例如,sym(4/3,"d") 在 10 位精度下返回 1.333333333,而在 20 位精度下返回 1.3333333333333332593。虽然后者不以多个连续的 3 结尾,但它是最接近 4/3 的浮点数的精确十进制表示。
"e"sym 使用估计误差模式时,它会在以有理数模式求出的结果的基础上,补充一个涉及变量 eps 的项。该项用于估计理论有理表达式与其实际浮点值之间的差值。例如,sym(3*pi/4,"e") 会返回 (3*pi)/4 - (103*eps)/249
"f"sym 使用浮点数转有理数模式时,它会返回 N*2^e-N*2^e 形式的所有值的符号形式,其中 N >= 0 是非负整数,e 是整数。返回的符号数是一个精确的有理数,它等于浮点值。例如,sym(1/10,"f") 会返回 3602879701896397/36028797018963968

表示符号数的字符串,指定为字符串或字符向量。

示例: '1/10'

匿名函数,指定为 MATLAB 函数句柄。有关详细信息,请参阅匿名函数

示例: h = @(x)sin(x)

要转换的符号矩阵变量,指定为符号矩阵变量。

您也可以使用 symmatrix2sym 将符号矩阵变量转换为符号标量变量数组。

示例: syms A 2 matrix; M = A^2 + eye(2)

数据类型: symmatrix

输出参量

全部折叠

变量,以符号标量变量形式返回。

具有自动生成的元素的向量或矩阵,以符号向量或符号标量变量矩阵形式返回。此向量或矩阵的元素不会出现在 MATLAB 工作区中。

从匿名 MATLAB 函数或符号矩阵变量转换而来的表达式或矩阵,以符号表达式或符号标量变量矩阵形式返回。

数据类型: sym

提示

  • pi = sym(pi)delta = sym("1/10") 这样的语句会创建符号数,以避免用浮点数近似表示 pi1/10 的值所固有的误差。以这种方式创建的 pi 将符号数存储在名为 pi 的工作区变量中,该变量会暂时替换同名的内置数值函数。使用 clear pi 可恢复 pi 的浮点表示形式。

  • sym 始终将字符向量输入中的 i 视为标识符。要输入虚数 i,请改用 1i

  • clear x 不会清除关于该符号对象的假设,例如实数、正数或者由 assumesymsyms 设置的任何假设。要删除假设,请使用以下选项之一:

    • assume(x,"clear") 会删除影响 x 的所有假设。

    • clear all 会清除 MATLAB 工作区中的所有对象并重置符号引擎。

    • assumeassumeAlso 在对变量设置假设方面提供更大的灵活性。

  • 当用符号数替换数值向量或矩阵的一个或多个元素时,MATLAB 会将该数字转换为双精度数。

    A = eye(3);
    A(1,1) = sym(pi)
    A =
        3.1416         0         0
             0    1.0000         0
             0         0    1.0000

    您无法将数值向量或矩阵的元素替换为符号变量、表达式或函数,因为这些元素无法转换为双精度数。例如,A(1,1) = sym("a") 会抛出错误。

  • 当您使用语法 A = sym("a",[n1 ... nM]) 时,sym 函数仅会将符号数组 A 赋值给 MATLAB 工作区。要将 A 的自动生成元素赋值给 MATLAB 工作区,请改用 syms 函数。例如,syms a [1 3] 会在 MATLAB 工作区中创建行向量 a = [a1 a2 a3] 以及符号变量 a1a2a3

替代功能

创建符号变量的替代方法

要在一次函数调用中创建多个符号变量,请使用 syms。使用 syms 还可清除命名变量的假设。

版本历史记录

在 R2006a 之前推出

全部展开