第三讲MATLAB的符号计算所谓符号计算是指在运算时,无须事先对变量赋值,而将所得到结果以标准的符号形式来表示。MathWorks公司以Maple的内核作为符号计算引擎(Engine),依赖Maple已有的函数库,开发了实现符号计算的两个工具箱:基本符号工具箱和扩展符号工具箱。一、字符串一个字符串由多个字符组成,用单引号(’’)来界定。字符串是按行向量进行存储的。1.字符串占用的字节每一个字符会占用两个字节。str2='Ilike''MATLAB'''%重复单引号来输入含有单引号的字符串2.字符串函数length():用来计算字符串的长度。double():用来查看字符串的ASCII码储存内容。char():用来将ASCII码转换成字符串形式。class()或ischar():用来判断某一个变量是否为字符串。class函数返回char则表示为字符串,而ischar返回值若为1则表示为字符串。strcmp(x,y):比较字符串x和y的内容是否相同。返回值若为1则相同,为0则不相同。findstr(x,x1):寻找在某个长字符串x中的子字符串x1,返回其起始位置。deblank(x):删除字符串尾部的空格。3.使用一个变量来储存多个字符串(1)多个字符串组成一个新的行向量将多个字符串变量直接用“,”连接。(2)使用二维字符数组每个字符串放在一行构成二维字符数组。(3)使用str2mat、strvcat和char函数构成字符串矩阵总是按最长的设置,不足的末尾用空格补齐。例如:str6=str2mat(str1,str2,str3)4.执行字符串使用eval命令直接“执行”某一字符串。5.显示字符串直接使用disp命令显示字符串。disp('请输入2*2的矩阵a')二、符号表达式的建立(一)定义符号常量(二)定义符号变量和符号表达式(三)符号矩阵二、符号表达式的建立(一)定义符号常量符号常量是不含变量的符号表达式,用sym命令来创建符号常量。格式:sym(‘常量’)%创建符号常量【例1】:a=sym('sin(2)')a=sin(2)(绝对准确的符号数值表示)格式:sym(常量,参数)%把常量按某种格式转换为符号常量参数设置参数作用d返回最接近的十进制数值(默认位数为32位)f返回该符号值最接近的浮点表示r返回该符号值最接近的有理数型,可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一e返回最接近的带有机器浮点误差的有理值二、符号表达式的建立【例2】:a=sym(sin(2))a=8190223105242182*2^(-53)a=sym(sin(2),'d')a=.90929742682568170941692642372800二、符号表达式的建立(二)定义符号变量和符号表达式参与符号运算的对象可以是符号变量、符号表达式或符号矩阵。符号变量要先定义,后引用。可以用sym函数、syms函数将运算量定义为符号型数据。引用符号运算函数时,用户可以指定函数执行过程中的变量参数;若用户没有指定变量参数,则使用findsym函数默认的变量作为函数的变量参数。二、符号表达式的建立1、sym函数格式:sym(‘变量’,‘参数’)%把变量定义为符号对象说明:参数用来设置限定符号变量的数学特性,可以选择为‘positive’、‘real’和‘unreal’,‘positive’表示为“正、实”符号变量,‘real’表示为“实”符号变量,‘unreal’表示为“非实”符号变量。如果不限定则参数可省略。格式:sym(‘表达式’)%创建符号表达式(二)定义符号变量和符号表达式二、符号表达式的建立【例3】作符号计算:a,b,x,y均为符号运算量。在符号运算前,应先将a,b,x,y定义为符号运算量。15byaxbyax(二)定义符号变量和符号表达式二、符号表达式的建立a=sym('a');%定义‘a’为符号运算量,输出变量名为ab=sym('b');x=sym('x');y=sym('y');[x,y]=solve(a*x-b*y-1,a*x+b*y-5,x,y)%以a,b为符号常数,x,y为符号变量即可得到方程组的解:x=3/ay=2/b(二)定义符号变量和符号表达式15byaxbyax二、符号表达式的建立【例4】已知一复数表达式z=x+i*y,试求其共轭复数,并求该表达式与其共轭复数乘积的多项式。为了使乘积表达式x^2+y^2非负,这里,把变量x和y定义为实数。x=sym('x','real');y=sym('y','real');(二)定义符号变量和符号表达式二、符号表达式的建立z=x+i*y;%定义复数表达式conj(z)%求共轭复数ans=x-i*yexpand(z*conj(z))%求表达式与其共轭复数乘积的多项式ans=x^2+y^2注:x=sym(‘x’,‘unreal’)可去掉’x’的属性,将’x’创建为纯格式的符号变量,输出结果一样。(二)定义符号变量和符号表达式二、符号表达式的建立2、syms函数syms函数的功能与sym函数类似。syms函数可以在一个语句中同时定义多个符号变量,其一般格式为:symsarg1arg2…argN用于将arg1,arg2,…,argN等符号创建为符号型数据。(二)定义符号变量和符号表达式二、符号表达式的建立【例5】使用syms命令创建符号变量和符号表达式。f1=sym('a*x^2+b*x+c')f1=a*x^2+b*x+csymsabcx%创建多个符号变量f2=a*x^2+b*x+c%创建符号表达式f2=a*x^2+b*x+csyms('a','b','c','x')f3=a*x^2+b*x+c;%创建符号表达式(二)定义符号变量和符号表达式二、符号表达式的建立(三)符号矩阵用sym和syms命令也可以创建符号矩阵。【例6】比较符号矩阵与字符串矩阵的不同。A=sym('[a,b;c,d]')%创建符号矩阵A=[a,b][c,d]%大小:2*2symobjectB='[a,b;c,d]'%创建字符串矩阵B=[a,b;c,d]%大小:1*9chararrayC=[a,b;c,d]???Undefinedfunctionorvariable'a'.二、符号表达式的建立(三)符号矩阵C=sym(B)%转换为符号矩阵C=[a,b][c,d]whosNameSizeBytesClassA2x2312symobjectB1x918chararrayC2x2312symobjectGrandtotalis25elementsusing642bytes二、符号表达式的建立三、符号表达式的代数运算(一)符号表达式的代数运算(二)符号数值任意精度控制和运算(三)符号对象与数值对象的转换符号运算与数值运算的主要区别:传统的数值型运算因为要受到计算机所保留的有效位数的限制,它的内部表示法总是采用计算机硬件提供的8位浮点表示法,因此每一次运算都会有一定的截断误差,重复的多次数值运算就可能会造成很大的累积误差。符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的。符号运算可以得出完全的封闭解或任意精度的数值解。符号运算的时间较长,而数值型运算速度快。三、符号表达式的代数运算(一)符号表达式的代数运算1.符号运算中的运算符(1)基本运算符运算符“+”,“-”,“*”,“\”,“/”,“^”分别实现符号矩阵的加、减、乘、左除、右除、求幂运算。运算符“.*”,“./”,“.\”,“.^”分别实现符号数组的乘、除、求幂,即数组间元素与元素的运算。运算符“′”,“.′”分别实现符号矩阵的共轭转置、非共轭转置。三、符号表达式的代数运算(2)关系运算符在符号对象的比较中,没有“大于”、“大于等于”、“小于”、“小于等于”的概念,而只有是否“等于”的概念。运算符“==”、“~=”分别对运算符两边的符号对象进行“相等”、“不等”的比较。当为“真”时,比较结果用1表示;当为“假”时,比较结果则用0表示。(一)符号表达式的代数运算三、符号表达式的代数运算2.函数运算(1)三角函数和双曲函数三角反函数除了atan2函数仅能用于数值计算外,其余的函数在符号运算中与数值计算的使用方法相同。(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等,它们的用法几乎与数值计算中的情况完全一样。(一)符号表达式的代数运算三、符号表达式的代数运算【例7】求矩阵的行列式值、非共轭转置和特征值。symsa11a12a21a22A=[a11a12;a21a22]%创建符号矩阵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)](一)符号表达式的代数运算三、符号表达式的代数运算1.SymbolicMathToolbox中的算术运算方式数值型:MATLAB的浮点运算。有理数型:Maple的精确符号运算。VPA型:Maple的任意精度运算。(二)符号数值任意精度控制和运算三、符号表达式的代数运算2.任意精度控制任意精度的VPA型运算可以使用digits和vpa命令来实现。格式:digits(n)%设定默认的精度说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。(二)符号数值任意精度控制和运算三、符号表达式的代数运算2.任意精度控制格式:S=vpa(s,n)%将s表示为n位有效位数的符号对象说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。三、符号表达式的代数运算(二)符号数值任意精度控制和运算【例8】对表达式进行任意精度控制的比较。a=sym('2*sqrt(5)+pi')a=2*sqrt(5)+pidigits%显示默认的有效位数digits=32vpa(a)%用默认的位数计算并显示ans=7.6137286085893726312809907207421三、符号表达式的代数运算(二)符号数值任意精度控制和运算vpa(a,20)%按指定的精度计算并显示ans=7.6137286085893726313digits(15)%改变默认的有效位数vpa(a)%按digits指定的精度计算并显示ans=7.61372860858937三、符号表达式的代数运算(二)符号数值任意精度控制和运算【例8续】用三种运算方式表达式比较2/3的结果。a1=2/3%数值型a1=0.6667a2=