80第六章符号计算6.1符号对象的创建6.1.1符号对象的生成符号计算工具箱定义了一种新的MATLAB数据类型,叫做符号对象。在MATLAB内部,符号对象的数据存储格式是符号字符串。sym函数用于创建符号对象,包括符号常量、符号变量和符号表达式。【调用格式】f=sym(arg)把数值、字符串或者表达式arg转换为符号对象ff=sym(argn,flagn)把数值或者数值表达式argn转换为flagn格式的符号对象f=sym('argv',flagv)把字符串'argv'按照flagv的格式转换为符号对象symsargv1argv2...定义argv1、argv2等为符号对象symsarg1arg2...flagv定义arg1、arg2等为flagv格式的符号对象【说明】1.对于数值或者数值表达式argn,flagn可以取以下值:'d'最接近的十进制浮点精度表示'e'带估计误差的有理表示'f'十六进制浮点数表示'r'最接近的有理表示,MATLAB的缺省表示方法2.对于字符串变量名argv,flagv可以取以下“限定”项:'positive'“正实数”符号变量'real'“实数”符号变量'unreal'“非实数”符号变量3.syms是sym函数的简化书写方式,各符号对象之间只能用空格分开。6.1.2符号常量用sym函数可以定义符号常量对象,包括符号标量对象和符号常量数组对象,定义符号常量对象的同时也可以指定数值常量的表示方法。例6.1.1符号常量的定义a=[1/3,sqrt(5),pi+sqrt(2)];%定义数值数组s1=sym([1/3,sqrt(5),pi+sqrt(2)],'d');%用十进制方式表示符号常量s2=sym([1/3,sqrt(5),pi+sqrt(2)]);%用最接近的有理方式表示符号常量s3=sym('[1/3,sqrt(5),pi+sqrt(2)]');%绝对准确的符号数值表示,输入为字符串6.1.3符号变量与符号表达式1.定义符号变量和符号表达式例6.1.2符号变量和符号表达式的定义81x=sym('x','real');%定义实数符号变量xsymyreal;%定义实数符号变量yz=x+i*y;%定义符号表达式对象zconj(z)%符号变量求共轭复转置f=z*conj(z);%符号表达式对象f=simple(f)%符号表达式对象化简f=x^2+y^2例6.1.3符号变量与符号矩阵symsabc;%定义符号变量a,b,cA=[a,b,c;b,c,a;c,a,b];%定义符号矩阵Asum(A(:,1));%求矩阵A第一列的元素的和sum(A(1,:))==sum(A(:,2))%符号对象的关系运算det(A);%矩阵求行列式symsalphabeta;%定义符号变量alpha和betaA(1,3)=beta;%矩阵元素赋值A=subs(A,a,alpha)%符号表达式的替换操作,矩阵A中的a用alpha代替2.符号表达式中自变量的确定在数学表达式或者数学函数中,一般都含有自变量。为了便于进行数学运算,通常要显示的指定表达式中的自变量,如果不指定自变量,MATLAB会根据上下文关系,识别表达式中默认的自变量(独立自由的符号变量)。识别表达式中自变量的基本原则是:按照字母表中靠近小写字母x的顺序识别,最靠近字母x的变量被第一个识别为自变量。MATLAB还提供了自变量识别函数findsym。【调用格式】findsym(exp)识别表达式exp中所有的自由符号变量findsym(exp,n)识别表达式exp中最靠近x的n个独立自由变量【说明】1.表达式可以是符号矩阵,此时变量识别是对整个矩阵进行的。2.函数识别的是“独立的”“自由的”符号变量,符号常量或者非独立的符号变量无法被识别。3.识别次序是按照靠近x的远近进行的,区分大小写,总认为大写字母距离x的距离大于所有小写字母。例6.1.4符号表达式中自变量的识别symsabxXY;%定义符号变量k=sym(2.5);z=sym('c*sqrt(alpha)+y*sin(beta)');%定义符号表达式对象(变量)zexp=a*z*X+k*Y+b^x%定义符号表达式变量expexp=a*(c*alpha^(1/2)+y*sin(beta))*X+5/2*Y+b^x???k=sym(2.5);%定义符号常量k,无法被识别findsym(exp)%自动识别所有自由独立变量,k为常量,z为非独立findsym(exp,3)%识别exp中前3个靠近x的独立自由变量6.1.4符号数学函数在MATLAB中,可以定义表示数学函数的符号对象,既能建立具有详细运算关系的函数,又能建立抽象数学函数。定义符号数学函数有2种方法:1.用符号表达式822.用函数M文件(在函数M文件中用符号变量作为输入变量)例6.1.5用符号表达式定义符号数学函数symsxyz%定义函数自变量r=sqrt(x^2+y^2+z^2);%定义函数rt=atan(y/x);%定义函数tf=sin(x*y)/(x*y);%定义函数f例6.1.6用函数M文件来定义符号数学函数,下列代码定义了函数sin()sinc()xxx。functionz=sinc(x)%SINC符号函数%sin(x)/x数学计算公式%接受符号变量作为输入变量ifisequal(x,sym(0))%如果自变量值为符号0,则函数值为1z=1;elsez=sin(x)/x;end例6.1.7建立抽象的符号数学函数f=sym('f(x)')%建立抽象函数f(x)symsxh;df=(subs(f,x,x+h)-f)/h%建立抽象函数df,表示f(x)的导数表达式df=(f(x+h)-f(x))/hg=subs(df,'f','sin')%建立sin(x)的导数函数的定义g=((sin)(x+h)-(sin)(x))/hlimit(g,h,0)%根据导数定义,求sin(x)的导数ans=cos(x)6.1.5符号数值计算的精度数值计算受计算机字长的限制,每次数值计算都会产生截断误差。在MATLAB中,数值计算的精度大约为16位数字。对于符号计算来说,只要能获得解析结果,其计算结果是绝对准确的,不包含任何误差。但是当将符号数值对象转换成数值数据时,就会产生误差,涉及到转换精度问题。MATLAB的符号计算工具箱提供3种算术运算:1.数值运算(16位数字精度)2.符号运算(绝对准确)3.任意精度运算(用户指定运算精度)有关符号运算精度的函数及其调用方法如下:【调用格式】n=digits获取当前采用的数值计算精度digits(n)设置数值计算精度的有效位为n,除非再次设定,否则始终有效xs=vpa(x)在当前精度下,给出变量x的数值符号结果xsxs=vpa(x,n)在n位精度下,给出变量x的数值符号结果xs【说明】831.相对精度位数n表示有效数字位数。2.x可以是符号常量,也可以是数值对象。3.返回值xs是符号结果,一定是符号对象。例6.1.8符号数值计算精度z=1.0e-16x=1.0e+2digits(14)%设置数值运算精度为14位y=vpa(x*z+1)%在14位精度下计算y6.1.6符号对象与其他数据类型之间的转换数值、字符和符号是MATLAB中3种不同的数据类型。MATLAB提供了不同数据类型之间的转换指令。表6.1.1介绍了MATLAB中实现符号对象到数值、字符串之间的转换指令。表6.1.1符号对象和其他数据类型之间的转换指令表函数名称功能函数名称功能char将符号对象转换为字符串uint32将符号对象转换为32位无符号整数double将符号对象转换为双精度数值uint64将符号对象转换为64位无符号整数int8将符号对象转换为8位整数single将符号对象转换为单精度数值int16将符号对象转换为16位整数sym2poly将符号多项式转换为数值系数向量int32将符号对象转换为32位整数poly2sym多项式系数向量转换为符号多项式int64将符号对象转换为64位整数vpa转换为符号运算结果uint8将符号对象转换为8位无符号整数sym转为为符号对象uint16将符号对象转换为16位无符号整数pretty转换为易读的显示方式例6.1.9多项式和符号对象之间的转换symx;f=x^4-3*x^2+3-5*x%定义符号多项式对象p1=sym2poly(f)%将符号多项式对象转换为数值系数向量p1=10-3-53p1s=poly2str(p1,'y');%将多项式数值系数向量转换为多项式字符串格式f2=poly2sym(p1);%将多项式数值系数向量转换为多项式符号对象pretty(f2,'s');%将多项式符号对象显示为易读格式6.2符号对象的代数运算6.2.1符号对象的运算1.符号对象的基本代数运算符号对象的基本代数运算和普通数值变量一样,可以使用算术运算符、关系运算符(仅能使用==和~=),其运算符的定义和数值运算相同。例6.2.1符号矩阵的基本代数运算symst;G=[cos(t),sin(t);-sin(t),cos(t)];A=G*G;%符号矩阵的乘法84A=simple(A);%化简为最简表达式I=G.'*G;%符号数组乘法I=simple(I);%化简为最简表达式I=[1,0][0,1]F=[cos(t),-sin(t);sin(t),cos(t)];(F+G)/2;%符号矩阵加法和符号矩阵与标量的除法2.符号对象的函数运算数值计算使用的函数基本上也可以用于符号计算,包括三角函数(atan2除外)、指数函数、对数函数(log2、log10除外)、复数函数(angle除外)、线性代数函数和矩阵函数。例6.2.2符号矩阵的函数运算H=hilb(3);%生成3×3的希尔伯特数值矩阵H=sym(H);%将数值矩阵转为符号常数矩阵inv(H);%符号矩阵求逆det(H)%符号矩阵求行列式的值ans=1/2160symssH(1,1)=s;%将符号元素赋值为符号变量s,使矩阵变为非奇异矩阵Z=det(H)%带有符号变量的符号矩阵求行列式的值Z=1/240*s-1/270sol=solve(Z)%求行列式的根sol=8/9H=subs(H,s,sol);%将矩阵行列式的根代入符号矩阵,使矩阵变为奇异矩阵det(H);%奇异矩阵的行列式值inv(H);%奇异矩阵求逆eig(H);%符号矩阵的特征值6.2.2符号表达式分解、展开与化简MATLAB提供了符号表达式的因式分解、展开和化简函数。【调用格式】collect(expr,v)合并符号表达式expr中符号对象v的同类项系数expand(expr)对表达式expr进行多项式、三角函数、指数对数等函数展开factor(expr)对符号表达式expr做因式分解horner(expr)把多项式expr分解为嵌套形式[n,d]=numden(expr)提取表达式最小分母公因子d和相应的分子多项式nsimplify(expr)用多种恒定变换对表达式expr进行综合化简simple(expr)把expr化简为最简表达式【说明】上述表达式expr可以是符号矩阵,此时函数对符号矩阵的每个元素进行相应操作。例6.2.3符号表达式的展开和分解f=sym('(x^3-6*x^2+10*x-5)+(x-1)');%定义原始的符号表达式fc=collect(f);%符号表达式合并同类项85ff=factor(f);%符号表达式因式分解fh=horner(f);%符号表达式的嵌套分解fe=expand(fh);%符号表达式的展开factor(1025);%正整数的质数分解,1025=5×5×41例6.2.4写出矩阵21114211232