第7章 符号计算——7.2 符号对象和符号表达式(2)

简介: 第7章 符号计算——7.2 符号对象和符号表达式(2)

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-10class类别识别函数示例。

在命令行窗口中输入:

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'):该函数判断输入参数是否是某种类型的对象。函数返回值为1true)表示OBJclassname类型的;函数返回值为0false)表示OBJ不是classname类型的。


7-11isa类别识别函数示例。

在命令行窗口中输入:

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:列出当前工作区内的变量VAR1VAR2的信息。



7-12whos类别识别函数示例。

在命令行窗口中输入:

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中距离符号变量xX最接近的N个符号变量。


7-13symvar变量确定函数示例。

在命令行窗口中输入:

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位浮点的表示方法。

符号运算中的有理数算术运算所需要的时间和内存开销都是最大的。只要有足够的内存和足够长的计算时间,总能产生精确的结果。

一般符号计算的结果都是字符串,特别是一些符号计算结果从形式上来看是数值,但从变量类型上看,它们仍然是字符串。要从精确解中获得任意精度的解,并改变默认精度,把任意精度符号解变成真正的数值解,就需要用到如下几个函数。

1digits()函数。

digits()函数的调用格式如下。

● digits(d):调用该函数后的近似解的精度变成d位有效数字。d的默认值是32位。

2vpa()函数。

vpa()函数的调用格式如下。

● vpa(A,d):求符号解A的近似解,该近似解的有效位数由参数d来指定。

3double()函数。

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

相关文章
|
2月前
|
C#
C#学习相关系列之常用符号介绍
C#学习相关系列之常用符号介绍
|
8月前
第7章 符号计算——7.5 符号函数的操作
第7章 符号计算——7.5 符号函数的操作
|
4月前
|
编译器 C++ 索引
C learning_13 操作符前篇(条件操作符、 逗号表达式、 下标引用、函数调用和结构成员、 表达式求值)
C learning_13 操作符前篇(条件操作符、 逗号表达式、 下标引用、函数调用和结构成员、 表达式求值)
|
8月前
|
存储
第7章 符号计算——7.2 符号对象和符号表达式(1)
第7章 符号计算——7.2 符号对象和符号表达式(1)
|
8月前
|
资源调度
第7章 符号计算——7.4 符号表达式替换
第7章 符号计算——7.4 符号表达式替换
|
8月前
第7章 符号计算——7.3 符号表达式操作
第7章 符号计算——7.3 符号表达式操作
|
9月前
隐式类型转换 算术转换 操作符的属性
隐式类型转换 算术转换 操作符的属性
34 0
|
10月前
|
机器学习/深度学习 Cloud Native Go
779. 第K个语法符号:简单模拟
这是 力扣上的 779. 第K个语法符号,难度为 中等。
|
11月前
|
C语言 C++
C++ 链接库顺序导致的符号未定义问题
C++ 链接库顺序导致的符号未定义问题
84 0
|
12月前
|
存储 Unix 编译器
表达式求值过程中会发生哪些隐藏的变化?求值顺序又由什么决定?——详解C表达式求值中的隐式类型转换,算术转换问题,以及操作符的属性
表达式求值过程中会发生哪些隐藏的变化?求值顺序又由什么决定?——详解C表达式求值中的隐式类型转换,算术转换问题,以及操作符的属性
115 0