Alex_McAvoy

想要成为渔夫的猎手

Matlab 符号表达式

【符号表达式的创建】

在创建符号表达式时,分为两种情况:

  • 对于带等号的符号表达式,称为符号方程,利用 sym 创建
  • 对于不带等号的符号表达式,称为符号函数,利用 syms 创建
1
2
3
4
5
6
7
8
9
10
11
% 符号方程
>> syms x
>> e=sym(x^2+2*x==-1)
e =
x^2 + 2*x == -1

% 符号函数
>> syms a b c x
>> f=a*x^3+b*x^2+c*x
f =
a*x^3 + b*x^2 + c*x

【符号表达式的显示】

在 matlab 中,采用默认的计算机方式对符号表达式进行表达,为了更直观的显示,可以利用 pretty() 函数来将符号表达式显示为符合数学习惯的数学表达式

1
2
3
4
5
6
7
8
9
>> syms a b c d e x
>> f=sym(5*a^3+3*b*x^5/c+7*c*x-x^e)
f =
7*c*x - x^e + 5*a^3 + (3*b*x^5)/c
>> pretty(f)
5
e 3 3 b x
7 c x - x + 5 a + ------
c

【符号表达式的展开与合并】

对于符号表达式,可以利用 expand() 函数将其展开:

  • expand(S):将符号表达式 S 中的各项进行展开,若包含超越函数,则利用恒等变形的方法将他们展开,S 可为符号表达式矩阵
1
2
3
4
5
6
7
>> syms x
>> f=sym(x^2+(x-1)^2)
f =
(x - 1)^2 + x^2
>> expand(f)
ans =
2*x^2 - 2*x + 1

对于符号表达式,可以利用 collect() 函数将同类项进行合并:

  • collect(S):将符号表达式 S 中的默认变量的相同幂次的项进行合并,S 可为符号表达式矩阵,默认变量由 symvar() 获得
  • collect(S,var):将符号表达式 S 中 var 的相同次幂的项进行合并,S 可为符号表达式矩阵
1
2
3
4
5
6
7
8
9
10
>> syms x y z
>> f=sym((x^2+y*z+z^2)*x+z)
f =
z + x*(x^2 + z^2 + y*z)
>> collect(f)
ans =
x^3 + (z^2 + y*z)*x + z
>> collect(f,z)
ans =
x*z^2 + (x*y + 1)*z + x^3

【符号表达式的嵌套与分解】

对于符号表达式,可以利用 horner() 函数将其转为嵌套的形式:

  • horner(S):将符号表达式 S 转换为嵌套的形式,S 可为符号表达式矩阵
1
2
3
4
5
6
7
>> syms x
>> f=sym(x^3+6*x^2+3*x+1)
f =
x^3 + 6*x^2 + 3*x + 1
>> horner(f)
ans =
x*(x*(x + 6) + 3) + 1

对于符号表达式,可以利用 factor() 函数将其进行因式分解:

  • factor(S):符号表达式 S 是多项式,会返回该多项式的因子组成的行向量,若 S 不能分解为有理多项式乘积的形式,则会返回 S 本身 ,S 可为符号表达式矩阵或一个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>> syms x y
>> f= x*y + 2*x + y + 2
f =
2*x + y + x*y + 2
>> factor(f)
ans =
[ y + 2, x + 1]

>> factor(231321216546545)
ans =
5 271 17183 9935213

>> f= x*y + 2*x + y*5 + 2
f =
2*x + 5*y + x*y + 2
>> factor(f)
ans =
2*x + 5*y + x*y + 2

【符号表达式的简化】

matlab 会根据一定的规则对符号表达式进行简化,简化的函数有:

  • simplify(S):依照 Maple 化简规则简化,S 可为符号表达式矩阵

【符号表达式的替换】

matlab 中提供了符号表达式变量代换的函数,以便利用换元法简化模型。

  • R=subs(S):用工作区中的变量值替代符号表达式 S 中的所有符号变量,S 可以是符号表达式矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>> syms x y
>> f=sym(x^2+x*y+x)
f =
x + x*y + x^2
>> a=sym(2)
a = 2
>> x=a
x = 2
>> subs(f)
ans =
2*y + 6

>> syms t
>> x=1/t
x = 1/t
>> subs(f)
ans =
y/t + 1/t + 1/t^2
  • R=subs(S,New):用新符号变量 New 来替代符号表达式 S 中的默认变量,默认变量由 symvar() 获得,S 可以是符号表达式矩阵
1
2
3
4
5
6
>> f
f =
x + x*y + x^2
>> subs(f,1/t)
ans =
y/t + 1/t + 1/t^2
  • R=subs(S,Old,New):用新符号变量 New 来替代符号表达式 S 中的变量 Old,S 可以是符号表达式矩阵
1
2
3
4
5
6
>> f
f =
x + x*y + x^2
>> subs(f,y,1/t)
ans =
x + x/t + x^2
  • subexpr(S):自动寻找符号表达式中重复出现的字符串,将其替换为 sigma,之后返回 sigma 和替换完毕后的符号表达式
1
2
3
4
5
6
7
8
9
10
>> syms x y
>> f=sym((1*x+2*x^2+3*x^3+4*x^4)*y+(1*x+2*x^2+3*x^3+4*x^4)*y^2+(1*x+2*x^2+3*x^3+4*x^4)*y^3)
f =
(4*x^4 + 3*x^3 + 2*x^2 + x)*y^3 + (4*x^4 + 3*x^3 + 2*x^2 + x)*y^2 + (4*x^4 + 3*x^3 + 2*x^2 + x)*y

>> subexpr(f)
sigma =
4*x^4 + 3*x^3 + 2*x^2 + x
ans =
sigma*y^3 + sigma*y^2 + sigma*y

【符号表达式的复合函数与反函数】

在数学上,存在复合函数的概念,matlab 中也提供了相应的函数:

  • compose(f,g):返回 f=f(x) 与 g=g(y) 的复合 f(g(y)),x、y 是 symvar() 给出的默认符号变量
  • compose(f,g,'t'):返回 f=f(x) 与 g=g(y) 的复合 f(g(y)),并将自变量改为 t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>> syms x y
>> f=sym(2*x+1)
f =
2*x + 1
>> g=sym(y^2)
g =
y^2

>> compose(f,g)
ans =
2*y^2 + 1
>> compose(g,f)
ans =
(2*x+1)^2

>> syms t
>> compose(f,g,t)
ans =
2*t^2 + 1

在数学上,存在反函数的概念,matlab 中也提供了相应的函数:

  • finverse(f):返回 f 的反函数,自变量为 symvar() 给出的默认符号变量
  • finverse(f,y):返回 f 的反函数,自变量为 y,要求 f 中不止一个变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>> syms x y
>> y=2*x+1
y =
2*x + 1
>> finverse(y)
ans =
x/2 - 1/2

>> syms x y f
>> f=x^2+1+y^2+2*x*y
f =
x^2 + 2*x*y + y^2 + 1
>> finverse(f,y)
ans =
(y - 1)^(1/2) - x
>> finverse(f,x)
ans =
(x - 1)^(1/2) - y
感谢您对我的支持,让我继续努力分享有用的技术与知识点!