第3章 MATLAB符号计算
符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(Symbolic Math Toolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。
3.1 符号表达式的建立
Symbolic Math Toolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。
3.1.1 创建符号常量
符号常量是不含变量的符号表达式,用sym命令来创建符号常量。
语法:
sym(‘常量’) %创建符号常量
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
>> a=sym('sin(2)')
a =
sin(2)
sym命令也可以把数值转换成某种格式的符号常量。
语法:
sym(常量,参数) %把常量按某种格式转换为符号常量
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
表3.1 参数设置
参数 | 作用 |
d | 返回最接近的十进制数值(默认位数为32位) |
f | 返回该符号值最接近的浮点表示 |
r | 返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一 |
e | 返回最接近的带有机器浮点误差的有理值 |
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
a=sym('sin(2)')
a =
sin(2)
例如,把常量转换为符号常量,按系统默认格式转换:
a=sym(sin(2))
a =
8190223105242182*2^(-53)
【例3.1】创建数值常量和符号常量。
a1=2*sqrt(5)+pi %创建数值常量
a1 =
7.6137
a2=sym('2*sqrt(5)+pi') %创建符号表达式
a2 =
2*sqrt(5)+pi
a3=sym(2*sqrt(5)+pi) %按最接近的有理数型表示符号常量
a3 =
8572296331135796*2^(-50)
a4=sym(2*sqrt(5)+pi,'d') %按最接近的十进制浮点数表示符号常量
a4 =
7.6137286085893727261009189533070
a31=a3-a1 %数值常量和符号常量的计算
a31 =
0
a5='2*sqrt(5)+pi' %字符串常量
a5 =
2*sqrt(5)+pi
可以通过查看工作空间来查看各变量的数据类型和存储空间,工作空间如图3.1所示。
3.1.2 创建符号变量和表达式
创建符号变量和符号表达式可以使用sym和syms命令。
1. 使用sym命令创建符号变量和表达式
语法:
sym(‘变量’,参数) %把变量定义为符号对象
说明:参数用来设置限定符号变量的数学特性,可以选择为’positive’、’real’和’unreal’, ’positive’ 表示为“正、实”符号变量,’real’表示为“实”符号变量,’unreal’ 表示为“非实”符号变量。如果不限定则参数可省略。
【例3.2】创建符号变量,用参数设置其特性。
syms x y real %创建实数符号变量
z=x+i*y; %创建z为复数符号变量
real(z) %复数z的实部是实数x
ans =
x
sym('x','unreal'); %清除符号变量的实数特性
real(z) %复数z的实部
ans =
tool工具箱1/2*x+1/2*conj(x)
程序分析:设置x、y为实数型变量,可以确定z的实部和虚部。
语法:
sym(‘表达式’) %创建符号表达式
【例3.2续】创建符号表达式。
f1=sym('a*x^2+b*x+c')
f1 =
a*x^2+b*x+c
2.使用syms命令创建符号变量和符号表达式
语法:
syms(‘arg1’, ‘arg2’, …,参数) %把字符变量定义为符号变量
syms arg1 arg2 …,参数 %把字符变量定义为符号变量的简洁形式
说明:syms用来创建多个符号变量,这两种方式创建的符号对象是相同的。参数设置和前面的sym命令相同,省略时符号表达式直接由各符号变量组成。
【例3.2续】使用syms命令创建符号变量和符号表达式。
syms a b c x %创建多个符号变量
f2=a*x^2+b*x+c %创建符号表达式
f2 =
a*x^2+b*x+c
syms('a','b','c','x')
f3=a*x^2+b*x+c; %创建符号表达式
程序分析:既创建了符号变量a、b、c、x,又创建了符号表达式,f2、f3和f1符号表达式相同。
3.1.3 符号矩阵
用sym和syms命令也可以创建符号矩阵。
A=sym('[a,b;c,d]')
A =
[ a, b]
[ c, d]
例如,使用syms命令创建相同的符号矩阵:
syms a b c d
A=[a b;c d]
A =
[ a, b]
[ c, d]
【例3.3】比较符号矩阵与字符串矩阵的不同。
A=sym('[a,b;c,d]') %创建符号矩阵
A =
[ a, b]
[ c, d]
B='[a,b;c,d]' %创建字符串矩阵
B =
[a,b;c,d]
C=[a,b;c,d] %创建数值矩阵
??? Undefined function or variable 'a'.
程序分析:由于数值变量a、b、c、d未事先赋值,MATLAB给出错误信息。
C=sym(B) %转换为符号矩阵
C =
[ a, b]
[ c, d]
whos
Name Size Bytes Class
A 2x2 312 sym object
B 1x9 18 char array
C 2x2 312 sym object
Grand total is 25 elements using 642 bytes
程序分析:查看符号矩阵A,可以看到为2×2的符号矩阵,占用较多的字节。
3.2符号表达式的代数运算
符号运算与数值运算的区别主要有以下几点:
▪ 传统的数值型运算因为要受到计算机所保留的有效位数的限制,它的内部表示法总是采用计算机硬件提供的8位浮点表示法,因此每一次运算都会有一定的截断误差,重复的多次
数值运算就可能会造成很大的累积误差。符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的。
▪ 符号运算可以得出完全的封闭解或任意精度的数值解。
▪ 符号运算的时间较长,而数值型运算速度快。
3.2.1符号表达式的代数运算
符号表达式的运算符和基本函数都与数值计算中的几乎完全相同。
1. 符号运算中的运算符
(1) 基本运算符
▪ 运算符“+”,“-”,“*”,“\”,“/”,“^”分别实现符号矩阵的加、减、乘、左除、右除、求幂运算。
▪ 运算符“.*”,“./”,“.\”,“.^”分别实现符号数组的乘、除、求幂,即数组间元素与元素的运算。
▪ 运算符“′”,“.′”分别实现符号矩阵的共轭转置、非共轭转置。
(2) 关系运算符
▪ 在符号对象的比较中,没有“大于”、“大于等于”、“小于”、“小于等于”的概念,而只有是否“等于”的概念。
▪ 运算符“= =”、“~=”分别对运算符两边的符号对象进行“相等”、“不等”的比较。当为“真”时,比较结果用1表示;当为“假”时,比较结果则用0表示。
2. 函数运算
(1) 三角函数和双曲函数
三角函数包括sin、cos、tan;双曲函数包括sinh、cosh、tanh;三角反函数除了atan2函数仅能用于数值计算外,其余的asin、acos、atan函数在符号运算中与数值计算的使用方法相同。
(2) 指数和对数函数
指数函数sqrt、exp、expm的使用方法与数值计算的完全相同;对数函数在符号计算中只有自然对数log(表示ln),而没有数值计算中的log2和log10。
(3) 复数函数
复数的共轭conj、求实部real、求虚部imag和求模abs函数与数值计算中的使用方法相同。但注意,在符号计算中,MATLAB没有提供求相角的命令。
(4) 矩阵代数命令
MATLAB提供的常用矩阵代数命令有diag,triu,tril,inv,det,rank, poly,expm,eig等,它们的用法几乎与数值计算中的情况完全一样。
【例3.4】求矩阵的行列式值、非共轭转置和特征值。
syms a11 a12 a21 a22
A=[a11 a12;a21 a22] %创建符号矩阵
A =
[ a11, a12]
[ a21, a22]
det(A) %计算行列式
ans =
a11*a22-a12*a21
A.' %计算非共轭转置
ans =
[ a11, a21]
[ a12, a22]
eig(A) %计算特征值
ans =
[ 1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
[ 1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
【例3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。
f=sym('2*x^2+3*x+4')
f =
2*x^2+3*x+4
g=sym('5*x+6')
g =
5*x+6
f+g %符号表达式相加
ans =
2*x^2+8*x+10
f*g %符号表达式相乘
ans =
(2*x^2+3*x+4)*(5*x+6)
3.2.2 符号数值任意精度控制和运算
1. Symbolic Math Toolbox中的算术运算方式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论