主要内容

subs

符号代换

说明

代换符号标量变量和函数

snew = subs(s,match,replacement) 返回 s 的副本,将所有出现的 match 都替换为 replacement,然后计算 s。此处,s 是符号标量变量的表达式或符号函数的表达式,而 match 指定要代换的符号标量变量或符号函数。

  • 如果 matchreplacement 都是相同大小的向量或元胞数组,则 subsmatch 的每个元素替换为 replacement 的对应元素。

  • 如果 match 是标量,而 replacement 是向量或矩阵,则 subs(s,match,replacement)s 中的所有 match 实例都替换为 replacement,并按元素执行所有运算。s 中的所有常数项都会被替换为常数乘以一个全为 1 的向量或矩阵。

示例

snew = subs(s,replacement) 返回 s 的副本,将 s 中所有出现的默认符号标量变量都替换为 replacement,然后计算 s。默认变量由 symvar(s,1) 定义。

示例

snew = subs(s) 返回 s 的副本,将 s 中的符号标量变量替换为 MATLAB® 工作区中对应的赋值,然后计算 s。未赋值的变量仍保留为变量。

示例

代换符号矩阵变量和函数

sMnew = subs(sM,matchM,replacementM) 返回 sM 的副本,将所有出现的 matchM 都替换为 replacementM,然后计算 sM。此处,sM 是一个涉及符号矩阵变量和矩阵函数的表达式、方程或条件,而 matchM 指定要代换的符号矩阵变量和矩阵函数。代换值 replacementM 必须与 matchM 具有相同的大小。 (自 R2021b 起)

示例

sMnew = subs(sM,replacementM) 返回 sM 的副本,将 sM 中所有出现的默认符号矩阵变量都替换为 replacementM,然后计算 sM (自 R2021b 起)

示例

sMnew = subs(sM) 返回 sM 的副本,将 sM 中的符号矩阵变量替换为 MATLAB 工作区中对应的赋值,然后计算 sM。未赋值的变量仍保留为变量。 (自 R2023b 起)

示例

示例

全部折叠

将此表达式中的 a 替换为 4

syms a b
expr = subs(a + b,a,4)
expr = b+4

将此表达式中的 a*b 替换为 5

expr = subs(a*b^2,a*b,5)
expr = 5b

将以下表达式中的默认符号标量变量代换为 a。如果您未指定要替换的标量变量或表达式,则 subs 使用 symvar 来查找默认变量。对于 x + y,默认变量为 x

syms x y a
var = symvar(x + y,1)
var = x

因此,subsx 替换为 a

expr = subs(x + y,a)
expr = a+y

在为某个符号标量变量赋新值后,包含该变量的表达式不会自动进行计算。在这种情况下,需使用 subs 来计算表达式。

定义表达式 y = x^2

syms x
y = x^2;

2 赋值给 xy 的值仍然是 x^2,而不是 4

x = 2;
y
y = x2

使用 subs,根据 x 的新值来计算 y

yeval = subs(y)
yeval = 4

通过以向量形式指定要代换的变量和新值来进行多次代换。

syms a b
expr = subs(cos(a) + sin(b), [a,b], [sym("alpha"),2])
expr = sin(2)+cos(α)

或者,使用元胞数组进行多次代换。

expr = subs(cos(a) + sin(b), {a,b}, {sym("alpha"),2})
expr = sin(2)+cos(α)

将此表达式中的符号标量变量 a 替换为 3×3 幻方矩阵。请注意,常量 1 扩展为一个 3×3 矩阵,其所有元素都等于 1

syms a t
expr3by3 = subs(exp(a*t) + 1, a, -magic(3))
expr3by3 = 

(e-8t+1e-t+1e-6t+1e-3t+1e-5t+1e-7t+1e-4t+1e-9t+1e-2t+1)

您还可以将向量、矩阵或数组中的某个元素替换为非标量值。例如,创建以下 2×2 矩阵。

A = sym("A",[2,2])
A = 

(A1,1A1,2A2,1A2,2)

B = sym("B",[2,2])
B = 

(B1,1B1,2B2,1B2,2)

将矩阵 A 的第一个元素替换为矩阵 B。在进行此代换时,subs 将 2×2 矩阵 A 扩展为下面的 4×4 矩阵。

A4by4 = subs(A, A(1,1), B)
A4by4 = 

(B1,1B1,2A1,2A1,2B2,1B2,2A1,2A1,2A2,1A2,1A2,2A2,2A2,1A2,1A2,2A2,2)

subs 不允许您将非标量或矩阵替换为会缩小矩阵大小的标量。

创建一个结构体数组,其字段值为符号表达式。

syms x y z
S = struct("f1",x*y,"f2",y + z,"f3",y^2)
S = struct with fields:
    f1: x*y
    f2: y + z
    f3: y^2

将符号标量变量 xyz 替换为数值。

Sval = subs(S,[x y z],[0.5 1 1.5])
Sval = struct with fields:
    f1: 1/2
    f2: 5/2
    f3: 1

将表达式中的符号标量变量 xy 替换为下面的 2×2 矩阵。当进行涉及向量或矩阵的多次代换时,请使用元胞数组来指定要代换的变量及其新值。

syms x y
expr = subs(x*y, {x,y}, {[0 1; -1 0], [1 -1; -2 1]})
expr = 

(0-120)

请注意,由于 xy 是标量,因此这些代换是按元素进行的。

expr = [0 1; -1 0].*[1 -1; -2 1]
expr = 2×2

     0    -1
     2     0

在一个方程中,利用另一个方程的变量值来消除标量变量。在第二个方程中,使用 isolate 将变量隔离在左侧,然后在第一个方程中将该变量代换为右侧。

首先,声明方程 eqn1eqn2

syms x y
eqn1 = sin(x)+y == x^2 + y^2;
eqn2 = y*x == cos(x);

使用 isolateyeqn2 中隔离出来。

eqn2 = isolate(eqn2,y)
eqn2 = 

y=cos(x)x

通过用 eqn2 的右侧代换 eqn2 的左侧,从 eqn1 中消除 y

eqn1 = subs(eqn1,lhs(eqn2),rhs(eqn2))
eqn1 = 

sin(x)+cos(x)x=cos(x)2x2+x2

在下面的符号函数中,将 x 替换为 a

syms x y a
syms f(x,y)
f(x,y) = x + y;
f = subs(f,x,a)
f(x, y) = a+y

subs 替换符号函数公式中的值,但不会替换函数的输入参量。

formula = formula(f)
formula = a+y
args = argnames(f)
args = (xy)

显式替换符号函数的参量。

syms x y
f(x,y) = x + y;
f(a,y) = subs(f,x,a);
f
f(a, y) = a+y

假设您想验证以下方程组的解。

syms x y
eqs = [x^2 + y^2 == 1, x == y];
S = solve(eqs,[x y]);
S.x
ans = 

(-2222)

S.y
ans = 

(-2222)

将解代入原方程组进行验证。

tf = isAlways(subs(eqs,S))
tf = 2×2 logical array

   1   1
   1   1

创建一个包含一阶导数和二阶导数的符号表达式。

syms r(t)
expr = diff(r,t,t) + diff(r,t)
expr(t) = 

2t2 r(t)+t r(t)

将一阶导数代换为另一个变量 v0,将二阶导数代换为另一个变量 D2r。为此,您必须首先代换高阶导数,即二阶导数。

syms v_0 D2r
exprnew = subs(expr,diff(r,t,t),D2r);
exprnew = subs(exprnew,diff(r,t),v_0)
exprnew(t) = D2r+v0

您还可以通过将要替换的变量及其替换项指定为向量,在单个 subs 调用中进行这些代换。

exprnew = subs(expr,[diff(r,t,t) diff(r,t)],[D2r v_0])
exprnew(t) = D2r+v0

如果您只想代换一阶导数,而保留二阶导数不变,则可以通过将临时变量 D2r 改回 2t2r(t) 来继续之前的流程。

exprnew = subs(exprnew,D2r,diff(r,t,t))
exprnew(t) = 

2t2 r(t)+v0

为了进行比较,如果您首先用 v0 代换原始表达式中的一阶导数,则结果为 v0。此处,subs 将一阶导数替换为 v0,将二阶导数替换为 tr(t)t=tv0=0。这样代换得到的表达式中不包含二阶导数。

syms v_0
exprnew = subs(expr,diff(r,t),v_0)
exprnew(t) = v0

自 R2021b 起

定义两个 2×2 矩阵的乘积。将矩阵声明为 symmatrix 数据类型的符号矩阵变量。

syms X Y [2 2] matrix
sM = X*Y
sM = XY

将矩阵变量 XY 替换为 2×2 符号矩阵。当进行涉及向量或矩阵的多次代换时,请使用元胞数组来指定要代换的矩阵变量及其新值。新值必须与要代换的矩阵变量具有相同的大小。

S = subs(sM,{X,Y},{[0 sqrt(sym(2)); sqrt(sym(2)) 0], [1 -1; -2 1]})
S = 

Σ1where  Σ1=(-2222-2)

将表达式 S 转换为 sym 数据类型,以显示代换后的矩阵乘法结果。

Ssym = symmatrix2sym(S)
Ssym = 

(-2222-2)

自 R2021b 起

创建符号数矩阵。

A = sym([1 4 2; 4 1 2; 2 2 3])
A = 

(142412223)

使用 charpoly 函数计算 A 的特征多项式系数。

c = charpoly(A)
c = (1-5-1721)

接下来,将 X 定义为一个 3×3 符号矩阵变量。使用系数 c 创建多项式 p(X)=c1X3+c2X2+c3X+c4I3,其中 X 是一个不定元,表示一个 3×3 矩阵。

syms X [3 3] matrix
p = c(1)*X^3 + c(2)*X^2 + c(3)*X + c(4)*X^0
p = 21I3-17X-5X2+X3

使用 subs 函数将多项式 p(X) 中的 X 代换为 A。根据凯莱-哈密顿定理,系数 cA 的特征多项式,因此这个代换的结果是一个 3×3 的零矩阵。使用 symmatrix2sym 将代换后的表达式转换为符号数矩阵。

Y = subs(p,A)
Y = 

-17Σ1-5Σ12+Σ13+21I3where  Σ1=(142412223)

Z = symmatrix2sym(Y)
Z = 

(000000000)

自 R2022a 起

定义函数 f(A)=A2-2A+I2,其中 A 是一个 2×2 矩阵,I2 是一个 2×2 单位矩阵。将变量 A 代换为另一个表达式,并计算新函数。

创建一个 2×2 符号矩阵变量 A。创建符号矩阵函数 f(A),保留工作区中 A 的现有定义。将多项式表达式赋给 f(A)

syms A 2 matrix
syms f(A) 2 matrix keepargs
f(A) = A*A - 2*A + eye(2)
f(A) = I2-2A+A2

接下来,创建新的符号矩阵变量 BC。创建新的符号矩阵函数 g(B,C),保留工作区中 BC 的现有定义。

syms B C 2 matrix
syms g(B,C) 2 matrix keepargs

f(A) 中的变量 A 代换为 B+C。将代换后的结果赋给新函数 g(B,C)

g(B,C) = subs(f,A,B+C)
g(B, C) = B+C2+I2-2B-2C

使用 subs 计算矩阵值 B=[01-10]C=[1-1-21] 对应的 g(B,C)

S = subs(g(B,C),{B,C},{[0 1; -1 0],[1 -1; -2 1]})
S = 

-2Σ1-2Σ2+Σ1+Σ22+I2where  Σ1=(01-10)  Σ2=(1-1-21)

将表达式 Ssymmatrix 数据类型转换为 sym 数据类型,以显示代换后的多项式的结果。

Ssym = symmatrix2sym(S)
Ssym = 

(0000)

自 R2022b 起

定义方程 XT X f(X,A)=2 A,其中 A 是一个 3×3 矩阵,X 是一个 3×1 矩阵。将 f(X,A) 代换为另一个符号表达式,将 A 代换为符号值。检查该方程对于这些值是否成立。

创建两个符号矩阵变量 AX。创建符号矩阵函数 f(X,A),保留工作区中 AX 的现有定义。创建方程。

syms A [3 3] matrix
syms X [3 1] matrix
syms f(X,A) [1 1] matrix keepargs
eq = diff(diff(f,X),X.') == 2*A
eq(X, A) = 

XT X f(X,A)=2A

f(X,A) 代换为 XTAX,并计算该表达式中方程的二阶微分函数。

eq = subs(eq,f,X.'*A*X)
eq(X, A) = AT+A=2A

A 代换为 3 阶希尔伯特矩阵。

eq = subs(eq,A,hilb(3))
eq(X, A) = 

Σ1+Σ1T=2Σ1where  Σ1=(11213121314131415)

使用 isAlways 检查方程对于这些值是否成立。因为 isAlways 只接受 symfun 类型或 sym 类型的符号输入,所以在使用 isAlways 之前,请将 eqsymfunmatrix 类型转换为 symfun 类型。

tf = isAlways(symfunmatrix2symfun(eq))
tf = 3×3 logical array

   1   1   1
   1   1   1
   1   1   1

自 R2023b 起

定义表达式 XY2-YX2,其中 XY 是 3×3 矩阵。将矩阵创建为符号矩阵变量。

syms X Y [3 3] matrix
C = X*Y^2 - Y*X^2
C = XY2-YX2

为矩阵 XY 赋值。

X = [-1 2 pi; 0 1/2 2; 2 1 0];
Y = [3 2 2; -1 2 1; 1 2 -1];

使用 subsXY 的赋值计算表达式 C

Cnew = subs(C)
Cnew = 

-Σ1Σ22+Σ2Σ12where  Σ1=(322-12112-1)  Σ2=(-12π0122210)

将结果从 symmatrix 数据类型转换为 double 数据类型。

Cnum = double(Cnew)
Cnum = 3×3

  -42.8496  -13.3584  -13.4336
   -0.7168    3.1416    0.0752
   -3.2832   29.8584   16.4248

输入参数

全部折叠

符号输入,指定为符号标量变量、符号表达式、符号方程、符号函数、符号数组、符号矩阵或结构体。

数据类型: sym | symfun | struct

要代换的标量变量,指定为符号标量变量、符号函数、符号表达式、符号数组或元胞数组。

数据类型: sym | symfun | cell

要代换为的新替换值,指定为数字、符号数、符号标量变量、符号函数、符号表达式、符号数组、结构体或元胞数组。

数据类型: sym | symfun | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | struct | cell

符号输入,指定为符号矩阵变量、符号矩阵函数、符号表达式、符号方程或符号条件。

数据类型: symmatrix | symfunmatrix

要代换的矩阵变量或函数,指定为符号矩阵变量、符号矩阵函数、符号表达式或元胞数组。

数据类型: symmatrix | symfunmatrix | cell

要代换为的新替换值,指定为数字、符号数、符号矩阵变量、符号矩阵函数、符号表达式、符号数组或元胞数组。replacementM 必须与 matchMsM 中的默认符号矩阵变量具有相同的大小。

数据类型: sym | symmatrix | symfunmatrix | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | struct | cell

提示

  • subs(s,__) 不会修改 s。要修改 s,请使用 s = subs(s,__)

  • 如果 s 是一个一元多项式,replacement 是一个数值矩阵,则需使用 polyvalm(sym2poly(s),replacement)s 作为矩阵求值。所有常数项都会被替换为常数乘以单位矩阵。

版本历史记录

在 R2006a 之前推出

全部展开