您好,欢迎访问三七文档
1第2章符号计算所谓符号计算是指:解算数学表达式、方程不是在离散化的数值点上进行,而是凭借一系列恒等式,数学定理,通过推理和演绎,力求获得解析结果。这种计算建立在数值完全准确表达和推演严格解析的基础之上,因此所得结果是完全准确的。2.1符号对象和符号表达式2.1.1基本符号对象和运算算符1生成符号对象的基本规则生成符号对象的MATLAB规则:(1)(2)2精准符号数字和符号常数sym(Num)sc=sym(Num)sym('Num')sc=sym('Num')〖说明〗【例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)答:12)S1=sin(sym('0.3'))%%2S2=sin(sym('3e-1'))%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.29552020666133957510532074568503S2=0.29552020666133957510532074568503S1属于什么类别?答:symS1与R1是否相同?答:0S1与R1的误差为6.3494e-413)F1=sym(sin(3/10))%%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基本符号变量〖说明〗表2.1-1sym和syms指令功能异同比较sym指令的功用syms指令的功用能不能例2.1-1,2.1-2,2.2-1能不能例2.1-1,2.1-2,2.1-5,2.2-3,能能例2.1-5,2.2-3,2.5-4,2.5-5,2.6-1;表2.1-3例2.1-6,2.2-2,2.3-4;表2.1-3不能能例2.1-2,2.1-3,2.1-4,2.7-1,2.8-3等;表2.1-3不能能3能不能例2.1-2,2.1-3,2.3-5能能例2.1-6,2.5-4例2.1-6,2.5-4不能能例2.5-54符号计算中的各种算符2.1.2符号计算中的函数指令表2.1-2MATLAB中可调用的符号计算函数指令类别情况描述符号工具包函数三角函数、双曲函数及反函数;除atan2外指数、对数函数(如exp,expm)复数函数(如abs,angle)矩阵分解函数(如eig,svd)方程求解函数solve微积分函数(如diff,int)积分变换和反变换函数(如laplace,ilaplace)绘图函数(如ezplot,ezsurf)特殊函数单位脉冲和阶跃函数(如dirac,heaviside)函数(如beta,gamma)椭圆积分(如ellipke)贝塞尔函数(如besseli,besselj)MuPAD库函数借助evalin和feval指令可调用比mfunlist所列范围更广泛的MuPAD库函数;需要具备MuPAD语言知识。〖说明〗2.1.3符号表达式和符号函数1符号表达式和符号函数(1)(2)2自由符号变量〖说明〗【例2.1-2】1)clearsymsabcxyuv%symsF(X,Y,Z)%4k=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)%%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)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(Eq,1)%5ans=wsymvar(g(z),1)%6ans=w3)R1=solve(Eq)%75R2=solve(g)%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)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)))%0disp(simplify(g(S2)))%TRUE〖说明〗【例2.1-4】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中,函数指令很多。有的函数指令适用于多种数据对象(如数值、符号等),但也有的函数指令只对某种数据对象适用。在数值计算和符号计算混合使用的情况下,由于函数指令与数据对象不适配引起的错误容易发生。为了避免这种错误,MATLAB提供了用于识别数据对象属性的指令:class(var)给出变量var的数据类别(如double,sym等)isa(var,'Obj')若变量var是Obj代表的类别,给出1,表示“真”whos给出所有MATLAB内存变量的属性【例2.1-5】数据对象及其识别指令的使用。1)cleara=1;b=2;c=3;d=4;%Mn=[a,b;c,d]%Mc='[a,b;c,d]'%Ms=sym(Mc)%Mn=1234Mc=6[a,b;c,d]Ms=[a,b][c,d]2)SizeMn=size(Mn)SizeMc=size(Mc)SizeMs=size(Ms)SizeMn=22SizeMc=19SizeMs=223)CMn=class(Mn)CMc=class(Mc)CMs=class(Ms)CMn=doubleCMc=charCMs=sym4)isa(Mn,'double')isa(Mc,'char')isa(Ms,'sym')ans=1ans=1ans=15)whosMnMcMs%NameSizeBytesClassAttributesMc1x918charMn2x232doubleMs2x260sym2.1.5符号运算机理和变量假设1符号运算的工作机理2对符号变量的限定性假设〖说明〗73清除变量和撤销假设〖说明〗【例2.1-6】符号变量的默认数域是复数域。1)clearall%symsx%f=x^3+475*x/100+5/2;%r=solve(f,x)%r=-1/2(79^(1/2)*i)/4+1/41/4-(79^(1/2)*i)/4assumptions(x)%ans=[emptysym]2)assume(x,'real')%r21=solve(f,x)%r21=-1/2symsxclear%assume(imag(x)==0)%r22=solve(f,x)r22=-1/2disp(assumptions(x))%imag(x)==03)sym(x,'clear')%assume(real(x)0)%r3=solve(f,x)ans=xr3=(79^(1/2)*i)/4+1/41/4-(79^(1/2)*i)/4disp(assumptions(x))%0real(x)4)assumeAlso(imag(x)0)%r4=solve(f,x)r4=(79^(1/2)*i)/4+1/4disp(assumptions(x))[0imag(x),0real(x)]82.2符号数字及表达式的操作2.2.1符号数字转换成双精度数字〖说明〗2.2.2符号数字的任意精度表达形式〖说明〗【例2.2-1】1)reset(symengine)%1sa=sym('1/3+sqrt(2)')%sa=2^(1/2)+1/32)digits%3Digits=32formatlonga=1/3+sqrt(2)%sa_Plus_a=vpa(sa+a,20)%6sa_Minus_a=vpa(sa-a,20)%7%a=1.747546895706428sa_Plus_a=3.4950937914128567869sa_Minus_a=-0.0000000000000000226580648263399736693)sa32=vpa(sa)%8digits(48)%9sa5=vpa(sa,5)%10sa48=vpa(sa)%11sa32=1.747546895706428382135022057543sa5=1.7475sa48=1.74754689570642838213502205754303141190300520871〖说明〗2.2.3符号表达式的基本操作〖说明〗9【例2.2-2】简化32381261xxxf。symsxf=(1/x^3+6/x^2+12/x+8)^(1/3)g1=simplify(f)%f=(12/x+6/x^2+1/x^3+8)^(1/3)g1=((2*x+1)^3/x^3)^(1/3)g2=simplify(f,'Steps',10,'IgnoreAnalyticConstraints',true)%g2=1/x+22.2.4表达式中的置换操作1公因子法简化表达〖说明〗【例2.2-3】对符号矩阵dcbaA进行特征向量分解。1)clear%A=sym('[ab;cd]')%[V,D]=eig(A)%A=[a,b][c,d]V=[(a/2+d/2-a^2-2*a*d+d^2+4*b*c)^(1/2)/2)/c-d/c,(a/2+d/2+(a^2-2*a*d+d^2+4*b*c)^(1/2)/2)/c-d/c][1,1]D=[a/2+d/2-(a^2-2*a*d+d^2+4*b*c)^(1/2)/2,0][0,a/2+d/2+(a^2-2*a*d+d^2+4*b*c)^(1/2)/2]2)subexpr([V;D])%4who%sigma=(a^2-2*a*d+d^2+4*b*c)^(1/2)ans=[(a/2+d/2-sigma/2)/c-d
本文标题:ch2_符号计算
链接地址:https://www.777doc.com/doc-2904810 .html