7.2 符号对象和符号表达式(1)
符号数学工具箱中定义了一种新的数据类型,叫sym类。sym类的实例就是符号对象,符号对象是一种数据结构,是用来存储代表符号的字符串的复杂数据结构。
符号表达式是符号变量或常量的组合,在某些特定的情况下,符号变量和符号常量也可以被认为是符号表达式。符号表达式的创建依然使用函数sym。
7.2.1 符号对象的创建命令
作为符号对象的符号常量、符号变量、符号函数及符号表达式,可以使用函数sym()、syms()规定和创建,利用class()函数可以测试创建的操作对象为何种操作对象类型,以及是否为符号对象类型。
1.函数sym()
函数sym()的语法格式如下。
● S=sym(A):将非符号对象A(如数字、表达式、变量等)转换为符号对象,并存储在符号变量S中。
● x=sym('x'):创建符号变量x,其名字是'x',如alpha=sym('alpha')。
● x=sym('x','real'):假设x是实数,因此有x的共轭conj(x)等于x,如r=sym('Rho','real')。
● k=sym('k','positive'):创建一个正的(实数)符号变量。
● x=sym('x','clear'):创建一个没有额外属性的纯形式上的符号变量x(例如,创建符号变量x,但是并没指定它是正的或它是一个实数)。
函数sym()的调用格式有如下两种:
● variable=sym(A,flag)。
● S=sym('A',flag)。
命令公式由A来建立一个符号对象variable,其类型为sym。如果A(不带单引号)是一个数字、数值矩阵或数值表达式,则输出结果是由数值对象转换成的符号对象。如果A(带单引号)是一个字符串,则输出结果是由字符串转换成的符号对象。
其中flag为转换的符号对象应该符合的格式。如果被转换的对象为数值对象,则flag可以有如下选择。
● d:最接近的十进制浮点精确表示。
● e:带(数值计算时)估计误差的有理表示。
● f:十六进制浮点表示。
● r:为默认设置时,最接近有理表示的形式。
当被转换对象为字符串时,flag有如下几个选项。
● positive:限定A为正的实型符号变量。
● real:限定A为实型符号变量。
2.函数syms()
函数syms()的调用格式如下:
syms a b c flag
该命令可以建立3个或多个符号对象,如a、b、c。同样,flag为对转换格式的限定,具体选项同上。
提示:在利用syms()函数创建多个符号变量时,符号变量之间以空格隔开。
7.2.2 符号对象的创建示例
本节将依次介绍符号常量、符号变量、符号表达式(符号函数、符号方程)及符号矩阵的创建方法。
例7-1:符号常量的创建。
在sym()函数中,如果输入参数为数值常量,则函数返回值为一个符号常量。虽然看上去它是一个数值量,但实际上是一个符号对象。
在命令行窗口中输入:
r = sym(2/3)
输出结果:
r = 2/3
在命令行窗口中输入:
f = sym(2/3, 'f')
输出结果:
f = 6004799503160661/9007199254740992
在命令行窗口中输入:
d = sym(2/3, 'd')
输出结果:
d = 0.66666666666666662965923251249478
在命令行窗口中输入:
e = sym(2/3, 'e')
输出结果:
e = 2/3 - eps/6
例7-2:符号变量的创建。
在符号计算中,符号变量是内容可变的符号对象。通常,符号变量是指一个或多个特定的字符。符号变量的命名规则与MATLAB数值计算中变量的命名规则相同,主要包括以下3点:
● 变量名由英文字母开头,可以包括英文字母、数字和下画线。
● 变量名的长度不大于31个字符。
● 字母区分大小写。
MATLAB使用sym()函数或syms()函数来创建符号变量。符号变量名与变量字符串可以是相同的,也可以是不相同的。
在命令行窗口中输入:
x = sym('x')
输出结果:
x = x
在命令行窗口中输入:
y = sym('x')
输出结果:
y = x
在命令行窗口中输入:
z1 = sym('z1', 'real')
输出结果:
z1 = z1
在命令行窗口中输入:
z2 = sym('z2', 'positive')
输出结果:
z2 = z2
在命令行窗口中输入:
assumptions
输出结果:
ans = [ in(z1, 'real'), 0 < z2]
在命令行窗口中输入:
syms a b c a, b, c
输出结果:
a = a b = b c = c
例7-3:符号表达式的创建。
在符号计算中,符号表达式是由符号常量、符号变量、符号运算符及专用函数连接起来的符号对象组成的。符号表达式可以分为两类:不带等号的为符号函数;带等号的为符号方程。
MATLAB使用sym()函数或syms()函数来创建符号表达式。
在命令行窗口中输入:
syms a b c d e x; f = sym(a * x^4 + b * x^3 + c * x^2 + d * x + e)
输出结果:
f = a*x^4 + b*x^3 + c*x^2 + d*x + e
在命令行窗口中输入:
e = sym(x^2 + x^-2 == 1)
输出结果:
e = 1/x^2 + x^2 == 1
调用syms()函数来创建符号表达式。
在命令行窗口中输入:
syms a b c d e x; f = a * x^4 + b * x^3 + c * x^2 + d * x + e
输出结果:
f = a*x^4 + b*x^3 + c*x^2 + d*x + e
例7-4:符号矩阵的创建。
元素是符号对象的矩阵叫作符号矩阵。符号矩阵既可以构成符号矩阵函数,也可以构成符号矩阵方程,它们都是符号表达式。通过syms()函数或sym()函数可以创建符号矩阵。
在命令行窗口中输入:
syms x y; m1 = [1, 2 + x, 1; 2 + x, 1, 3 + y; 1, 3 + y, 0]
输出结果:
m1 = [ 1, x + 2, 1] [ x + 2, 1, y + 3] [ 1, y + 3, 0]
在命令行窗口中输入:
m2 = sym([1, 2 + x, 1; 2 + x, 1, 3 + y; 1, 3 + y, 0])
输出结果:
m2 = [ 1, x + 2, 1] [ x + 2, 1, y + 3] [ 1, y + 3, 0]
7.2.3 符号计算中的运算符和函数
自MATLAB 5.3集成的2.1版本的符号计算工具包开始,MATLAB采用全新的数据结构、面向对象编程和重载技术,使得符号计算和数值计算在形式和风格上浑然统一。符号计算表达式的运算符和基本函数,无论在形状、名称上,还是在使用方法上,都与数值计算中的运算符和基本函数近乎相同。
以下将介绍符号计算中的运算符和基本函数。
1.算术运算符
(1)运算符“+”“-”“*”“\”“/”“^”分别实现矩阵的加法、减法、乘法、左除、右除和求幂运算。
例7-5:符号矩阵加法运算。
在命令行窗口中输入:
syms a b c d e f g h; A = sym([a, b; c, d]) B = sym([e, f; g, h]) R = A + B
输出结果:
A = [ a, b] [ c, d] B = [ e, f] [ g, h] R = [ a + e, b + f] [ c + g, d + h]
例7-6:符号矩阵左除运算。
在命令行窗口中输入:
syms a b c d e f g h; A = sym([a, b; c, d]) B = sym([e, f; g, h]) R = A \ B
输出结果:
A = [ a, b] [ c, d] B = [ e, f] [ g, h] R = [ -(b*g - d*e)/(a*d - b*c), -(b*h - d*f)/(a*d - b*c)] [ (a*g - c*e)/(a*d - b*c), (a*h - c*f)/(a*d - b*c)]
(2)运算符“.*”“.\”“./”“.^”分别实现“元素对元素”的数组乘法、左除、右除和求幂运算。
例7-7:符号矩阵的乘法与点乘运算。
在命令行窗口中输入:
syms a b c d e f g h; A = sym([a, b; c, d]) B = sym([e, f; g, h]) R1 = A * B
输出结果:
A = [ a, b] [ c, d] B = [ e, f] [ g, h] R1 = [ a*e + b*g, a*f + b*h] [ c*e + d*g, c*f + d*h]
在命令行窗口中输入:
R2 = A .* B
输出结果:
R2 = [ a*e, b*f] [ c*g, d*h]
(3)运算符“'”“.'”分别实现矩阵的共轭转置和非共轭转置。
例7-8:符号矩阵的转置。
在命令行窗口中输入:
syms a b c d; A = sym([a, b; c, d]) R1 = A'
输出结果:
A = [ a, b] [ c, d] R1 = [ conj(a), conj(c)] [ conj(b), conj(d)]
在命令行窗口中输入:
R2 = A.'
输出结果:
R2 = [ a, c] [ b, d]
2.关系运算符
与数值计算中的关系运算符不同的是,符号计算中的关系运算符只有以下两种:
(1)运算符“==”表示对运算符两边的符号对象进行“相等”的比较,返回值为“1”表示相等,返回值为“0”表示不相等。
(2)运算符“~=”表示对运算符两边的符号对象进行“不相等”的比较,返回值为“1”表示不相等,返回值为“0”表示相等。
3.指数、对数函数
(1)sqrt、exp、expm等指数函数在符号计算中的使用方法与数值计算中的使用方法一致。
(2)自MATLAB 7.x版本开始,MATLAB新增加了log2函数和log10函数,其用法与数值计算中的用法一致。
4.三角函数、双曲函数及其反函数
除atan2函数仅能用于数值计算外,其余的三角函数、双曲函数及它们的反函数,无论在数值计算还是在符号计算中,用法一致。
5.复数函数
复数函数包括复数的共轭(conj)、实部(real)、虚部(imag)和模(abs)函数,在数值计算和符号计算中的用法都是一样的。
6.矩阵代数函数
在符号计算中,常用的矩阵代数函数包括:diag函数、triu函数、tril函数、inv函数、det函数、rank函数、rref函数、null函数、colspace函数、poly函数、expm函数、eig函数和svd函数。
除了svd函数的使用方法有所不同,其余函数的用法与数值计算中的用法一致。
例7-9:符号矩阵的SVD(奇异值分解)。
在命令行窗口中输入:
f = sym([1, 2, 1; 2, 3, 6; 1, 7, 5]) [U, S, V] = svd(f)
输出结果: