matlab中提供了强大的符号运算功能,可以按照推理解析的方法进行运算
1.字符型数据变量的创建
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
2.符号型数据变量的创建
符号对象中的符号常量、变量、函数和表达式,可以用sym和syms函数创建。使用class函数测试建立的操作对象为何种操作对象类型及是否为符号对象类型
sym函数:可以生成单个的符号变量
- var = sym('var', set):创建一个符号变量,并设置符号对象的格式,set可以不选
- 'position':限定var表示正的实型符号变量
- 'real':限定var为实型符号变量
- 'unreal':限定var为非实行符号变量
- sym('var','clear'):清除先前设置的符号变量var
- Num = sym(Num,flag):将一个数值转换为符号形式,输入参数flag为转换的符合对象应该符合的格式类型
- 'r':最接近有理表示,为系数默认设置
- 'e':带估计误差的有理表示
- 'f':十六进制浮点表示
- 'd':最接近的十进制浮点精确表示
- A = sym('A',dim):创建一个矢量或矩阵的符号变量
- A = sym('A',set):创建一个符号矩阵,set用于设置矩阵的维数
- sym(A,'clear'):清除前面已创建的符号矩阵A
- f(arg1,...,argN) = sym('f(arg1,...,argN'):根据f指定的输入参数arg1,...,argN创建符号变量f(arg1,...,argN)
% 利用sym函数创建符号对象
>> sqrt(3)
ans =
1.7321
>> a = sqrt(sym(3))
a =
3^(1/2)
syms函数:可以创建任意多个符号变量
- syms var...varN:创建符号变量var...varN
- syms var...varN set:set指定符号对象的格式
- 'position':限定var表示正的实型符号变量
- 'real':限定var为实型符号变量
- syms var...varN clear:清除前面已经定义好的符号对象
- syms f(arg1,...,argN):创建符号函数f,函数中包含多个符号变量
利用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]]
3.符号计算的运算符与函数
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]
关系运算符号:
与数值计算中关系运算符号相区别的是,符号计算中的关系运算符还有以下两种
- 运算符号“==”表示对运算符两边的符号对象进行“相等”的比较,返回值“1”表示相等,“0”表示不等
- 运算符号“~=”表示对运算符号两边的符号对象进行不相等的标记。“1”表示不相等,“0”表示相等
复数函数:
复数函数包括复数的共轭、实部、虚部和模函数,与数值计算中是一致的
矩阵代数函数:
符号计算中,常用的矩阵代数函数有: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分解
4.寻找符号变量
matlab中的符号对象可以是符号常量也可以是符号变量,findsym函数可以找到符号表达式中的符号变量
- findsym(s):寻找符号表达式s中所有的符号变量
- findsym(s,n):寻找符号表达式n个在字母表中与x最接近的变量
>> 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
5.符号精度计算
符号计算的一个显著特点是:由于计算过程中不会出现舍入误差,从而可以得到任意精度的数值解。因此,如果想要使得计算结果精确,就可以牺牲计算时间和存储空间,用符号计算来获得计算精度。
在符号运算工具箱中,有三种不同类型的算术运算。
- 数值类型:MATLAB的浮点算术运算,最快的运算,需要的计算机内存很小,但是结果不精确
- 有理数类型:Maple的精度符号计算
- VPA类型:Maple的任意精度算术运算。
digits函数:digits函数用于设定所用数值的精度
- digits(d):符号对象的近似解的精度为d位有效数字,参数d的默认值为32位
- d = 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函数:用于进行可控精度运算
- R = vpa(A):计算符号矩阵A的近似解,精度为函数digits(d)指定的有效位数
- R = vpa(A,d):计算符号矩阵A的近似解,有效位数由参数d指定
>> 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
6.显示符号表达式
符号表达式的显示过程中,默认采用MATLAB形式的显示,除了默认的显示方式外,还可以使用pretty函数,允许用户将符号表达式显示为符合一般数学表达习惯的数学表达式。
- pretty(X):将符号表达式用书写方式显示出来,使用默认的宽
>> 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 /
7.合并符号表达式
collect函数用于实现将符号表达式中的同类项进行合并
- R = collect(S):将表达式S中相同次幂的项合并,系统默认为按照x的相同次幂项进行合并
- R = collect(S,v):将表达式S按照v的次幂项进行合并,输入参数S可以是表达式,也可以是一个符号矩阵
>> 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
8.展开符号表达式
expand函数用于实现将符号表达式展开。
- expand(S):表达式S中如果包含函数,matlab会利用恒等式变型将其写成相应的形式。
- expand(S,Name,Value):设置展开式的参数名Name及其对应的参数值Value
>> 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)