matlab中提供了强大的符号运算功能,可以按照推理解析的方法进行运算
var = 'expression'
字符型变量是以矩阵的形式存在MATLAB的工作空间中的
>> C = 'china'
C =
china
>> A = '1 + sin(2) / 3'
A =
1 + sin(2) / 3
>> size(C)
ans =
1 5
>> size(A)
ans =
1 14
符号对象中的符号常量、变量、函数和表达式,可以用sym和syms函数创建。使用class函数测试建立的操作对象为何种操作对象类型及是否为符号对象类型
sym函数:可以生成单个的符号变量
% 利用sym函数创建符号对象
>> sqrt(3)
ans =
1.7321
>> a = sqrt(sym(3))
a =
3^(1/2)
syms函数:可以创建任意多个符号变量
利用syms函数创建符号表达式
>> syms s(t) f(x,y)
>> f(x,y) = x + 2 * y
f(x, y) =
x + 2*y
>> f(1,3)
ans =
7
利用sym和syms也可生成符号矩阵
>> m1 = [1,2+x,1;3-x,1,4+y;1,2+y,0]
m1 =
[ 1, x + 2, 1]
[ 3 - x, 1, y + 4]
[ 1, y + 2, 0]
>> m2 = sym('[[1,2+x,1;3-x,1,4+y;1,2+y,0]]')
m2 =
[ [1, x + 2, 1], [3 - x, 1, y + 4], [1, y + 2, 0]]
MATLAB采用了全新的数据结构、面向对象编程和重载技术,使得符号计算和数值计算在形式上和风格上浑然统一。
算术运算符号:
(1)运算符号“+”,“-”,“*”,“/”,“\”,“^”分别实现符号矩阵的加法、减法、乘法、左除、右除和求幂运算
>> A = sym('[x^2 3;4 * xcos(x)]');
>> B = sym('[1/x^2 2*x;3 x^2+x]')
>> C = A + B
C =
[ 1/x^2 + x^2, 2*x + 3]
[ 4*xcos(x) + 3, x^2 + x]
>> J = A / B
J =
[ (x*(x^4 + x^3 - 9))/(- 6*x^2 + x + 1), -(2*x^5 - 3)/(- 6*x^3 + x^2 + x)]
[ (4*x^2*xcos(x)*(x + 1))/(- 6*x^2 + x + 1), -(8*x^2*xcos(x))/(- 6*x^2 + x + 1)]
(2)运算符号“.*”,“./”,“.\”,“/^”分别实现“元素对元素”的乘法、左除、右除和求幂运算
>> syms a b c d e f g h;
>> A = sym('[a,b;c,d]')
A =
[ a, b]
[ c, d]
>> B = sym('[e,f;g,h]')
B =
[ e, f]
[ g, h]
>> R = A * B
R =
[ a*e + b*g, a*f + b*h]
[ c*e + d*g, c*f + d*h]
>> R1 = A .* B
R1 =
[ a*e, b*f]
[ c*g, d*h]
(3)运算符号“ ' ”," .' "分别试下符号矩阵的共轭和非共轭转置
>> syms a b c d;
>> A = sym('[a b;c d]');
>> R = A'
R =
[ conj(a), conj(c)]
[ conj(b), conj(d)]
>> R2 = A.'
R2 =
[ a, c]
[ b, d]
关系运算符号:
与数值计算中关系运算符号相区别的是,符号计算中的关系运算符还有以下两种
复数函数:
复数函数包括复数的共轭、实部、虚部和模函数,与数值计算中是一致的
矩阵代数函数:
符号计算中,常用的矩阵代数函数有:diag函数,triu函数,tril函数,inv函数,det函数,rank函数,rref函数,null函数,colspace函数,ploy函数、expm函数,eig函数和svd函数。
>> f = sym('[1 2 1; 2 3 5;1 7 9]')
f =
[ 1, 2, 1]
[ 2, 3, 5]
[ 1, 7, 9]
>> [U,S,V] = svd(f)
U =
[ 0.16282766200529790566464473003047, 0.36344034057570734984922459430431, 0.91727764135407896387284636832453]
[ 0.46068074153566191523968894576701, 0.79411905473576600135312190977843, -0.39641919893431769076779069408513]
[ 0.87250238215379167379020797827246, -0.4871201553495680712962919278634, 0.038125416563908403817930647866644]
注意:符号工具箱仅支持元素为符号常量的符号矩阵的SVD分解
matlab中的符号对象可以是符号常量也可以是符号变量,findsym函数可以找到符号表达式中的符号变量
>> syms s b x y;
>> f = a ^ 2 + 6 * b + cos(x - 2) + log(5 + y) + 4 - 5i
f =
a^2 + 6*b + cos(x - 2) + log(y + 5) + (4 - 5i)
>> findsym(f)
ans =
a,b,x,y
>> findsym(f,2)
ans =
x,y
符号计算的一个显著特点是:由于计算过程中不会出现舍入误差,从而可以得到任意精度的数值解。因此,如果想要使得计算结果精确,就可以牺牲计算时间和存储空间,用符号计算来获得计算精度。
在符号运算工具箱中,有三种不同类型的算术运算。
digits函数:digits函数用于设定所用数值的精度
>> digits
Digits = 32
>> a1 = sym(1.6,'d')
a1 =
1.6000000000000000888178419700125
>> digits(42)
>> digits
Digits = 42
>> a2 = sym(1.6,'d')
a2 =
1.60000000000000008881784197001252323389053
vpa函数:用于进行可控精度运算
>> a = vpa(hilb(2))
a =
[ 1.0, 0.5]
[ 0.5, 0.333333333333333333333333333333333333333333]
>> b = vpa(hilb(3),6)
b =
[ 1.0, 0.5, 0.333333]
[ 0.5, 0.333333, 0.25]
[ 0.333333, 0.25, 0.2]
>> c = vpa(pi)
c =
3.14159265358979323846264338327950288419717
符号表达式的显示过程中,默认采用MATLAB形式的显示,除了默认的显示方式外,还可以使用pretty函数,允许用户将符号表达式显示为符合一般数学表达习惯的数学表达式。
>> syms x
>> s = solve(x^4 + 2*x + 1,x,'MaxDegree',3);
>> pretty(s)
/ -1 \
| |
| 2 1 |
| #2 - ---- + - |
| 9 #2 3 |
| |
| 1 #2 1 |
| ---- - #1 - -- + - |
| 9 #2 2 3 |
| |
| 1 #2 1 |
| #1 + ---- - -- + - |
\ 9 #2 2 3 /
where
/ 2 \
sqrt(3) | ---- + #2 | 1i
\ 9 #2 /
#1 == ------------------------
2
/ sqrt(11) sqrt(27) 17 \1/3
#2 == | ----------------- - -- |
\ 27 27 /
collect函数用于实现将符号表达式中的同类项进行合并
>> syms x y
>> collect((exp(x) + x) * (x + 2))
ans =
x^2 + (exp(x) + 2)*x + 2*exp(x)
>> collect(x^2*y + y*x - x^2 - 2*x,x)
ans =
(y - 1)*x^2 + (y - 2)*x
expand函数用于实现将符号表达式展开。
>> syms x y a b c t
>> expand((x - 2) * (x - 4))
ans =
x^2 - 6*x + 8
>> expand(cos(x + y))
ans =
cos(x)*cos(y) - sin(x)*sin(y)