1第2章符号计算符号计算:解算数学表达式、方程不是在离散化的数值点上进行,而是凭借一系列恒等式,数学定理,通过推理和演绎,获得解析结果。符号计算建立在数值完全准确表达和推演严格解析的基础之上,所得结果完全准确。特点:一.相对于MATLAB的数值计算“引擎”和“函数库”而言,符号计算的“引擎”和“函数库”是独立的。二.在相当一些场合,符号计算解算问题的命令和过程,显得比数值计算更自然、更简明。三.大多数理工科的本科学生在学过高等数学和其他专业基础课以后,比较习惯符号计算的解题理念和模式。2.1符号对象和符号表达式MATLAB依靠基本符号对象(包括数字、参数、变量)、运算符及一些预定义函数来构造和衍生符号表达式和符号方程。2.1.1基本符号对象和运算算符1.生成符号对象的基本规则任何基本符号对象(数字、参数、变量、表达式、函数)都必须借助专门的符号命令sym、syms、symfun定义。任何包含符号对象的表达式或方程,将继承符号对象的属性。22.精准符号数字和符号常数符号(类)数字的定义:sym(Num)采用精准数值类数创建精准的符号数字(推荐格式!)sc=sym(Num)采用精准数值类数创建精准的符号常数sc(推荐格式!)说明:若输入量Num是精准的浮点数(如0.321、10/3等),能生成精准的符号数字;若输入量Num是诸如sin(0.3)的数值表达式,那么就只能生成由数字表达式获得的16位精度的近似符号数字。sym('Num')采用有理分数字符串创建精准的符号数字sc=sym('Num')采用有理分数字符串创建精准的符号常数sc说明:Num必须处于(英文状态下的)单引号内,构成字符串(关于字符串参见附录A);只有当字符串数字'Num'采用诸如321/1000、10/3等整数构成的有理分数形式表达时,sym('Num')才能生成精准的符号数字;若字符串数字用诸如0.321、3.21e-1等“普通小数或科学记述数”表达,那么只能产生“近似符号数字”。在默认情况下,该近似符号数字为32位精度。【例2.1-1】(1)创建完全精准的符号数字或数字表达式clearallR1=sin(sym(0.3))%输入量为普通小数R2=sin(sym(3e-1))%输入量为科学记述数R3=sin(sym(3/10))%输入量为有理分数R4=sin(sym('3/10'))%输入量为“整数构成的有理分数”字符串数字disp(['R1属于什么类别?答:',class(R1)])disp(['R1与R4是否相等?(是为1,否为0)答:',int2str(logical(R1==R4))])R1=sin(3/10)R2=sin(3/10)R3=sin(3/10)R4=sin(3/10)R1属于什么类别?答:symR1与R4是否相等?(是为1,否为0)答:1(2)产生具有32位精度的“近似”符号数字(杜绝使用!)S1=sin(sym('0.3'))%sym的输入量是字符串小数,生成32位精度下的%近似符号数,进而在sin作用下给出近似符号数。S2=sin(sym('3e-1'))%syms的输入量是字符串科学记述数。eRS=vpa(abs(R1-S1),64);disp(['S1属于什么类别?答:',class(S1)])disp(['S1与R1是否相同?答:',int2str(logical(R1==S1))])disp('S1与R1的误差为')disp(double(eRS))S1=0.295520206661339575105320745685033S2=0.29552020666133957510532074568503S1属于什么类别?答:symS1与R1是否相同?答:0S1与R1的误差为6.3494e-41(3)产生具有16位精度的“近似”符号数字(杜绝使用!)F1=sym(sin(3/10))%sym的输入量为双精度表达式sin(3/10),%就只能创建出仅16位精度的近似符号数。F2=sym(sin(0.3))%同上eFS=vpa(abs(F1-S1),32);disp(['F1属于什么类别?答:',class(F1)])disp(['S1与F1是否相同?答:',int2str(logical(F1==S1))])disp('F1与S1的误差为')disp(double(eFS))F1=5323618770401843/18014398509481984F2=5323618770401843/18014398509481984F1属于什么类别?答:symS1与F1是否相同?答:0F1与S1的误差为2.8922e-173.基本符号变量经典教科书里,表达式e-axsinbx中的a,b称为参数,x为变量。在MATLAB的符号计算中,a、b、x统称为基本符号变量,其中,x总被默认为“待解(自由)符号变量”,其他被作为“符号参数”处理。定义基本符号变量的命令格式:para=sym('para')定义单个复数域符号变量parapara=sym('para','Flag')定义单个Flag指定域符号变量parasymspara定义单个复数域符号变量para的另一种方式symsparaFlag定义单个Flag指定域符号变量para的另一种方式symspara1para2paraN定义多个复数域符号变量para1para2paraNsymspara1para2paraNFlag定义多个Flag指定域符号变量para1para2paraN符号参数名不要用处于“字母表中小写字母x及其两侧的英文字母”开头。Flag表示数域的限定性假设,可具体取以下词条:positive正实数域;real实数域。默认值是复数域符号变量sym命令只能对单变量作用,syms不能用于对数值、常数相关的定义。44.符号计算中的各种算符与数值计算中的算符在形状、名称和使用方法上相同。2.1.2符号计算中的函数命令表2.1-2MATLAB中可调用的符号计算函数指令类别情况描述与数值计算对应关系符号工具包函数三角函数、双曲函数及反函数;除atan2外相同指数、对数函数(如exp,expm)相同复数函数(如abs,angle)相同矩阵分解函数(如eig,svd)相同方程求解函数solve不相同微积分函数(如diff,int)不完全相同积分变换和反变换函数(如laplace,ilaplace)只有离散Fourier变换绘图函数(如ezplot,ezsurf)数值绘图命令更丰富特殊函数单位脉冲和阶跃函数(如dirac,heaviside)不完全对应函数(如beta,gamma)椭圆积分(如ellipke)贝塞尔函数(如besseli,besselj)MuPAD库函数借助evalin和feval指令可调用比mfunlist所列范围更广泛的MuPAD库函数;需要具备MuPAD语言知识。无对应函数〖说明〗2.1.3符号表达式和符号函数1.符号表达式和符号函数(1)为表达某种数学算式、实现某种计算目的,采用基本符号对象(数字、常数、变量)、运算符、MATLAB函数命令等基本要素编写而成的M码。(2)为表达变量间抽象(或具体)约束关系而编写的M码。在符号函数中,构成函数关系的变量名必须明确指定。即,在定义符号函数时,不仅要指定函数名,而且要指定变量名。比如symsf(x,y)就定义了一个以x、y为变量的抽象符号函数f。2自由符号变量解题通常是围绕自由符号变量进行。确定自由符号变量的规则:在专门指定变量名的符号运算中,解题一定围绕指定变量名进行。x是首选自由符号变量,其后的次序规则是:与x的ASCII码值之差的绝对值小的字母优先;差绝对值相同时,ASCII码值大的字母优先。自动识别符号变量时,字母的优先次序为x,y,w,z,v等,大写后排。自动识别表达式中自由、独立的符号变量的命令:symvar(expression)列出表达式中的所有基本符号变量symvar(expression,n)列出表达式中n个认定的自由变量5【例2.1-2】1)各种符号对象的创建clearsymsabcxyuv%定义基本符号对象symsF(X,Y,Z)%定义“抽象”符号函数k=sym(3)%定义符号常数G=sym('p*sqrt(q)+r*sin(t)')%创建符号表达式EXPR=a*G*u+(b*x^2+k)*v%创建“衍生”符号表达式f(x,y)=a*x^2+b*y^2-c%创建“具体”符号函数disp(F)%显示抽象符号函数k=3G=p*q^(1/2)+r*sin(t)EXPR=v*(b*x^2+3)+a*u*(p*q^(1/2)+r*sin(t))f(x,y)=a*x^2+b*y^2-cF(X,Y,Z)symbolicfunctioninputs:X,Y,Z2)symvar对EXPR符号表达式的作用symvar(EXPR)%%ans=[a,b,p,q,r,t,u,v,x]symvar(EXPR,20)%ans=[x,v,u,t,r,q,p,b,a]symvar(EXPR,1)%ans=x3)symvar对符号函数的作用disp(symvar(f))%[a,b,c,x,y]disp(symvar(f,2))%[x,y]【例2.1-3】用符号法求方程2uwzwv的解。1)产生符号表达式和符号函数clearsymsuvwz%Eq=u*w^2+z*w-v%表达式g(z)=u*w^2+z*w==v%函数Eq=u*w^2+z*w-vg(z)=u*w^2+z*w==v2)symvar认定的自由变量symvar(Eq,1)%5ans=6wsymvar(g(z),1)%6ans=w3)solve对默认自由变量解方程R1=solve(Eq)%关于w解方程u*w^2+z*w-v=07R2=solve(g)%关于w解g(z)所表达的方程8R1=-(z+(z^2+4*u*v)^(1/2))/(2*u)-(z-(z^2+4*u*v)^(1/2))/(2*u)R2=-(z+(z^2+4*u*v)^(1/2))/(2*u)-(z-(z^2+4*u*v)^(1/2))/(2*u)4)对变量z求解S1=solve(Eq,z)%9S2=solve(g(z),z)%10S1=(-u*w^2+v)/wS2=(-u*w^2+v)/w5)检验求解结果的正确性disp(simplify(subs(Eq,z,S1)))%S1代替z,观察Eq是否为00disp(simplify(g(S2)))%S2代替z,观察g(S2)方程式是否成立TRUE〖说明〗不要把g(z)理解为以z为自由变量的符号函数。【例2.1-4】symvar确定自由变量是对整个矩阵进行的。symsabtuvxyA=[a+b*x,sin(t)+u;x*exp(-t),log(y)+v]%symvar(A,1)%A=[a+b*x,u+sin(t)][x*exp(-t),v+log(y)]ans=x2.1.4符号对象的识别为了函数命令与数据对象的适配,MATLAB提供了用于识别数据对象属性的命令:class(var)给出变量var的数据类别(如double,sym等)isa(var,'Obj')若变量var是Obj代表的类型,给出1,表示“真”whos给出所有MATLAB内存变量的属性7【例2.1-5】数据对象及其识别命令的使用。(1)cleara=1;b=2;c=3;d=4;%产生4个数值变量Mn=[a,b;c,d]%利用已赋值变量构成数值矩阵Mc='[a,b;c,d]'%字符串中的a,b,c,d与前面输入的数值变量无关Ms=sym(Mc)%Ms是一个符号矩阵,它与前面各变量无关Mn=1234Mc=[a,b;c,d]Ms=[a,b][c,d](2)SizeMn=size(Mn)SizeMc=size(Mc)SizeMs=size(Ms)SizeMn=22SizeMc=19SizeMs=22(3)CMn=class(Mn)CMc=class(Mc)CMs=