7.2 符号对象和符号表达式(2)
7.2.4 符号对象的类别识别函数
数值计算对象、符号计算对象、字符串作为MATLAB中最常使用的数据对象,它们遵循着各自不同的运算法则,但有时在外形上却十分相似。
为管理和使用方便,MATLAB提供了一些识别不同数据对象的函数,常用的有class函数、isa函数和whos函数。
class函数的返回值S是对象OBJ的数据类型。S的值参见表7-1,其调用格式如下:
S = class(OBJ)
表7-1 数据类型
数据类型 |
描述 |
double |
双精度浮点数组 |
single |
单精度浮点数组 |
logical |
逻辑数组 |
char |
字符数组 |
cell |
单元数组 |
struct |
结构体数组 |
function_handle |
函数句柄 |
int8 |
8位有符号整型数组 |
uint8 |
8位无符号整型数组 |
int16 |
16位有符号整型数组 |
uint16 |
16位无符号整型数组 |
int32 |
32位有符号整型数组 |
uint32 |
32位无符号整型数组 |
uint64 |
64位无符号整型数组 |
<class_name> |
MATLAB对象的MATLAB类名 |
<java_class> |
Java对象的Java类名 |
例7-10:class类别识别函数示例。
在命令行窗口中输入:
a = pi; b = 'pi'; c = sym('3.14159826'); d = sym('d'); syms e; classa = class(a) classb = class(b) classc = class(c) classd = class(d) classe = class(e)
输出结果:
classa = 'double' classb = 'char' classc = 'sym' classd = 'sym' classe = 'sym'
isa函数的调用格式如下。
● isa(OBJ,'classname'):该函数判断输入参数是否是某种类型的对象。函数返回值为1(true)表示OBJ是classname类型的;函数返回值为0(false)表示OBJ不是classname类型的。
例7-11:isa类别识别函数示例。
在命令行窗口中输入:
syms x; R = isa(x, 'sym')
输出结果:
R = logical 1
在命令行窗口中输入:
R = isa(x, 'double')
输出结果:
R = logical 0
在命令行窗口中输入:
y = double(2); R = isa(y, 'char')
输出结果:
R = logical 0
在命令行窗口中输入:
R = isa(y, 'double')
输出结果:
R = logical 1
whos函数用来列出当前工作区中的变量名及它们的详细信息,如size(大小)、bytes(字节)及class(数据类型)等。whos函数的调用格式如下。
● whos:列出当前工作区内的所有变量及其信息。
● whos VAR1 VAR2:列出当前工作区内的变量VAR1和VAR2的信息。
例7-12:whos类别识别函数示例。
在命令行窗口中输入:
clear x = 0.5; syms y; whos
输出结果:
Name Size Bytes Class Attributes x 1x1 8 double y 1x1 8 sym
在命令行窗口中输入:
whos y
输出结果:
Name Size Bytes Class Attributes y 1x1 8 sym
7.2.5 符号表达式中的变量确定
MATLAB中的符号对象可以表示符号常量和符号变量。symvar函数可以帮助用户查找一个符号表达式中的符号变量。该函数的调用格式如下:
● symvar(S)。
● symvar(S,N)。
函数返回符号表达式S中的所有符号变量;当指定N后,函数返回符号表达式S中距离符号变量x或X最接近的N个符号变量。
例7-13:symvar变量确定函数示例。
在命令行窗口中输入:
syms x y z u v w f = sym(3 * x^2 + 2 * y + z + u^-1 + v^-2 + w^-3); symvar(f)
输出结果:
ans = [ u, v, w, x, y, z]
在命令行窗口中输入:
symvar(f, 1)
输出结果:
ans = x
在命令行窗口中输入:
symvar(f, 2)
输出结果:
ans = [ x, y]
在命令行窗口中输入:
symvar(f, 3)
输出结果:
ans = [ w, x, y]
7.2.6 符号精度计算
符号计算的一个非常显著的特点是,由于计算过程中不会出现舍入误差,从而可以得到任意精度的数值解。如果希望计算结果精确,那么可以牺牲计算时间和存储空间,用符号计算来获得足够高的计算精度。
在符号运算工具箱中有3种不同类型的算术运算。
● 数值类型:MATLAB的浮点算术运算。
● 有理数类型:Maple的精确符号计算。
● VPA类型:Maple的任意精度算术运算。
这3种运算各有利弊,在计算时应根据计算精度、时间、存储空间的要求进行合理的选择。浮点算术运算是最快的运算,需要的计算机内存最小,但是结果不精确。
MATLAB双精度数输出的数字位数由format命令控制,但它内部采用的是由计算机硬件提供的8位浮点的表示方法。
符号运算中的有理数算术运算所需要的时间和内存开销都是最大的。只要有足够的内存和足够长的计算时间,总能产生精确的结果。
一般符号计算的结果都是字符串,特别是一些符号计算结果从形式上来看是数值,但从变量类型上看,它们仍然是字符串。要从精确解中获得任意精度的解,并改变默认精度,把任意精度符号解变成“真正的”数值解,就需要用到如下几个函数。
(1)digits()函数。
digits()函数的调用格式如下。
● digits(d):调用该函数后的近似解的精度变成d位有效数字。d的默认值是32位。
(2)vpa()函数。
vpa()函数的调用格式如下。
● vpa(A,d):求符号解A的近似解,该近似解的有效位数由参数d来指定。
(3)double()函数。
double()函数的调用格式如下。
● double(A):把符号矩阵或任意精度表示的矩阵A转换为双精度矩阵。
例7-14:符号精度计算示例。
在命令行窗口中输入:
syms x; f = sym(2 * x^2 + 3 * x - 4) s = solve(f) digits(4); vpa(s)
输出结果:
f = 2*x^2 + 3*x - 4 s = - 41^(1/2)/4 - 3/4 41^(1/2)/4 - 3/4 ans = -2.351 0.8508
在命令行窗口中输入:
vpa(s, 6)
输出结果:
ans = -2.35078 0.850781