创建符号表达式,需要先创建符号变量,再使用它们编写表达式。
使用关键字syms
创建符号变量:
syms a b c % 一次可以创建多个变量,变量之间只能用空格衔接
syms A [3 4] % 创建符号矩阵
% A =
%
% [ A1_1, A1_2, A1_3, A1_4]
% [ A2_1, A2_2, A2_3, A2_4]
% [ A3_1, A3_2, A3_3, A3_4]
syms 'A%d%d' [2 2] % 可以通过占位符%d来改变默认格式
% A =
%
% [ A11, A12]
% [ A21, A22]
syms M 3 % 3阶方阵
% M =
%
% [ M1_1, M1_2, M1_3]
% [ M2_1, M2_2, M2_3]
% [ M3_1, M3_2, M3_3]
先将变量创建好,才能将含有该变量字符串转化为符号表达式
syms x
str = 'x^3+2*x+1'; % 不识别2x,即*不可省略
S = eval(str); % 将字符串转化为符号表达式
% S =
%
% x^3 + 2*x + 1
也可以通过多项式部分提到的函数ploy2sym(p)
,将系数向量转化为符号表达式
P = [1 2 2 1];
S = poly2sym(P);
% S =
%
% x^3 + 2*x^2 + 2*x + 1
可以通过函数sym(A)
将矩阵 A A A转化为符号表达式sym
格式。只有符号表达式可以与符号表达式计算,数值表达式无法直接与符号表达式进行计算。
A = ones(2,3);
S = sym(A) % 2*3 sym
% S =
%
% [ 1, 1, 1]
% [ 1, 1, 1]
使用sym()
函数处理数值表达式时,应从尽量小的单位入手,以免产生精度上的误差,如
>> sym(1/1234567) % 错误
ans =
7650239286923505/9444732965739290427392
>> 1/sym(1234567) % 正确
ans =
1/1234567
% ------------------------------------------------
>> sym(exp(pi)) % 错误
ans =
6513525919879993/281474976710656
>> exp(sym(pi)) % 正确
ans =
exp(pi)
转置
Matlab默认符号属于复数,在使用'
求转置时,会自动求出共轭转置。因此若只想求转置,应该使用.'
syms 'A%d%d' [2 3]
% A =
%
% [ A11, A12, A13]
% [ A21, A22, A23]
B = A.'
% B =
%
% [ A11, A21]
% [ A12, A22]
% [ A13, A23]
行列式
syms 'A%d%d' 2
% A =
%
% [ A11, A12]
% [ A21, A22]
d = det(A)
% d =
%
% A11*A22 - A12*A21
求逆
inv(A); % A必须是方阵,结果用A中元素表示
求秩
rank(A); % 返回一个整数
其他
函数 | 说明 |
---|---|
inv(A) |
求矩阵的逆,结果用 A A A中的元素表示 |
rank(A) |
求矩阵的秩,返回一个整数 |
eig(A) |
求特征值、特征向量 |
svd(A) |
奇异值分解 |
jordan(A) |
Jordan标准形运算 |
因式分解
使用函数factor(S)
实现
S = poly2sym([1 3 2]); % S = X^2+3*x+2
factor(S)
% ans =
%
% [ x + 2, x + 1]
也可用于质因数分解
S = sym(276);
factor(S) % [2 2 3 23]
表达式展开
syms x
S = eval('(x+1)*(x+2)');
expand(S) % x^2 + 3*x + 2
也可以用于三角函数、指数函数、对数函数的展开
syms x y
S = eval('sin(x+y)');
expand(S) % cos(x)*sin(y) + cos(y)*sin(x)
表达式化简
syms x
S = eval('sin(x)^2+cos(x)^2');
simplify(S) % x+1
分式通分
syms x y
S = eval('1/x+1/y');
[n, d] = numden(S)
% n - 分子 n=x+y
% d - 分母 d=x*y
通过函数subs(S,old,new)
实现,返回值仍是sym
类型。
syms F m a Ff
str = 'Ff+F';
S = eval(str);
S = subs(S,F,a*m) % 用a*m代换F
% S =
%
% Ff + a*m
res = subs(S,[a m Ff],[2 10 15]) % 分别给[a m Ff]赋值为[2 10 15]
% res =
%
% 35