符号运算的基本概念符号运算功能符号函数及运算符号矩阵及运算符号微积分符号微分方程求解符号代数方程求解MatLab的符号运算工具箱(symbolicToolbox),可以提供150多个函数,基本上可以实现常用的各种符号计算功能;同时具有与Maple的接口,以实现更多的功能。(Matlab的符号运算功能是从Maple引入的。)符号运算的基本概念字符串和字符串函数一、字符串的约定以单引号设定输入或赋值;例:s=’matrixlaboratory’注:每个字符都是矩阵s的一个元素,包括空格。字符串和字符矩阵基本等价。试比较:A1=[‘a’‘b’;’c’‘d’]A2=[‘ab’;‘cd’]字符串函数字符数组的生成函数char例:s3=char(‘s’,y’,’m’,’b’,’l’,’i’,’c’);s3'ans=symbolicdouble(s3)字符串转数值代码。比较:s2=char(‘symbolic’)s1=[‘symbolic’]cellstr字符数组转为字符串。数值数组和字符串之间的转换函数表函数名可实现功能函数名可实现功能Num2str数字转字符串Str2num字符串转数字Int2str整数转字符串Springf将格式数据写为字符串Mat2str矩阵转字符串sscanf在格式控制下读字符串试比较:a=[1:5];b=num2str(a);a*2;b*2字符串操作函数函数名可实现功能函数名可实现功能Strcat链结串strrep以其他串代替此串Strvcat垂直链结串strtok寻找串中记号Strcmp比较串upper转换为大写Strncmp比较串的前N个字符lower转换串为小写Findstr在其它串中找此串blank生成空串Strjust验证字符数组deblank移去串内空格strmath查找可能匹配的字符串执行字符串功能的函数eval例:n=4;t='1/(i+j-1)';a=zeros(n);fori=1:nforj=1:na(i,j)=eval(t);endenda=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.16670.25000.20000.16670.1429符号表达式的生成符号表达式包括符号函数(不包括等号)和符号方程(必须带有等号)。符号函数符号方程符号微分方程F=’log(x)’Equation=’a*x^2+b*x+c=0’Diffeq=’Dy-y=x’F=sym(‘sin(x)’)SymsxF=sin(x)+cos(x)符号和数值之间的转换digits(D)设置返回有效个数为D的近似解精度。R=vpa(S)返回符号表达式在其前的digits设置下的精度的数值解。vpa(S,D)返回符号表达式的digits(D)精度的数值解。例:求方程的精确解和各种精度的近似解。解:s=solve('3*x^2-exp(x)=0')s=[-2*lambertw(-1/6*3^(1/2))][-2*lambertw(-1,-1/6*3^(1/2))][-2*lambertw(1/6*3^(1/2))]vpa(s)ans=[.91000757248870906068][3.7330790286328142006][-.45896226753694851460]vpa(s,6)ans=[.910008][3.73308][-.458962]W=LAMBERTW(X)isthesolutiontow*exp(w)=x符号函数的运算复合函数的运算compose复合函数运算函数;compose(f,g)返回当和时的复合函数,这里是syms定义的符号变量,为syms定义的符号变量;compose(f,g,z)返回自变量为复合函数;Compose(f,g,x,z)返回复合函数且使得为的独立变量。即若,则compose(f,g,x,z)返回,而compose(f,g,t,z)返回;Compose(f,g,x,y,z)返回复合函数并使得为的独立变量,为的独立变量。即若,,则compose(f,g,x,y,z)返回,而compose(f,g,x,u,z)返回;例:复合函数的运算。symsxyztu;f=1/(1+x^2);g=sin(y);h=x^t;p=exp(-y/u);compose(f,g)ans=1/(1+sin(y)^2)compose(f,g,t)ans=1/(1+sin(t)^2)compose(h,g,x,z)ans=sin(z)^tcompose(h,g,t,z)ans=x^sin(z)compose(h,p,x,y,z)ans=exp(-z/u)^tcompose(h,p,t,u,z)ans=x^exp(-y/z)反函数的运算finverse反函数运算函数g=finverse(f)符号函数的反函数。仅一个变量时可用。g=finverse(f,v)符号函数的反函数,为自变量。有多个变量时建议使用。例:f=x^2+yf=x^2+yfinverse(f,y)ans=-x^2+yfinverse(f)Warning:finverse(x^2+y)isnotunique.ans=(-y+x)^(1/2)finverse(f,x)Warning:finverse(x^2+y)isnotunique.\\MATLAB\toolbox\symbolic\@sym\finverse.matline43ans=(-y+x)^(1/2)此处的Warning提示反函数是不唯一。符号矩阵的创立使用sym函数:例如:a=sym('[1/s+x,sin(x)cos(x)^2/(b+x);9,exp(x^2+y^2),log(tanh(y))]')a=[1/s+x,sin(x),cos(x)^2/(b+x)][9,exp(x^2+y^2),log(tanh(y))]用创建子阵的方法创建符号矩阵ms=['[1/s,sin(x)]';'[1,exp(x)]']ms=[1/s,sin(x)][1,exp(x)]b=[a;'[exp)-i),3,x^3+y^9]']b=[1/s+x,sin(x),cos(x)^2/(b+x)][9,exp(x^2+y^2),log(tanh(y))][exp)-i),3,x^3+y^9]本方法不用sym命令,但必须保持同列各元素字符具有相同的长度。将数值矩阵转化为符号矩阵在Matlab中,数值矩阵不能直接参与符号运算,必须先转化为符号矩阵。例:a=[2/3,sqrt(2),0.222;1.4,1/0.23,log(3)]a=0.66671.41420.22201.40004.34781.0986b=sym(a)b=[2/3,sqrt(2),111/500][7/5,100/23,4947709893870347*2^(-52)]符号矩阵的索引和修改可以对矩阵的某个元素进行表示或修改,例如b(2,3)ans=4947709893870347*2^(-52)b(2,3)=’log(9)’b=[2/3,sqrt(2),111/500][7/5,100/23,log(9)]符号矩阵的运算符号矩阵的运算基本与数值矩阵的运算相同。符号微积分一、符号极限limitlimit(F,x,a)limit(F,a)limit(F)limit(F,x,a,’right’)单侧极限limit(F,x,a,’left’)例:symsxath;limit(sin(x)/x)ans=1limit((1+2*t/x)^(3*x),x,inf)ans=exp(6*t)limit(1/x,x,0,'right')ans=inflimit(1/x,x,0,'left')ans=-inf二、符号积分int(S)int(S,v)int(S,a,b)int(S,v,a,b)三、符号微分diff(S)diff(S,’v’)diff(S,n)Gradient(梯度函数)符号代数方程的求解线性方程组的解析解法a=sym('[10-10;-110-2;0-210]')a=[10,-1,0][-1,10,-2][0,-2,10]b=('[9;7;6]');linsolve(a,b)ans=[473/475][91/95][376/475]vpa(ans)ans=[.99578947368421052631578947368421][.95789473684210526315789473684211][.79157894736842105263157894736842]例:用fsolve函数求解:x1-0.7sinx1-0.2cosx2=0x2-0.7cosx1+0.2sinx2=0解:先编制函数文件fc.m如下:%fc.mfunctiony=fc(x)y(1)=x(1)-0.7*sin(x(1))-0.2*cos(x(2));y(2)=x(2)-0.7*cos(x(1))+0.2*sin(x(2));y=[y(1)y(2)];在Matlab窗口中输入:x0=[0.50.5];fsolve('fc',x0)ans=0.52650.5079符号微分方程求解dsolveExamples:dsolve('Dx=-a*x')returnsans=exp(-a*t)*C1x=dsolve('Dx=-a*x','x(0)=1','s')returnsx=exp(-a*s)y=dsolve('(Dy)^2+y^2=1','y(0)=0')returnsy=[sin(t)][-sin(t)]S=dsolve('Df=f+g','Dg=-f+g','f(0)=1','g(0)=2')returnsastructureSwithfieldsS.f=exp(t)*cos(t)+2*exp(t)*sin(t)S.g=-exp(t)*sin(t)+2*exp(t)*cos(t)dsolve('Df=f+sin(t)','f(pi/2)=0')dsolve('D2y=-a^2*y','y(0)=1,Dy(pi/a)=0')S=dsolve('Dx=y','Dy=-x','x(0)=0','y(0)=1')S=dsolve('Du=v,Dv=w,Dw=-u','u(0)=0,v(0)=0,w(0)=1')w=dsolve('D3w=-w','w(0)=1,Dw(0)=0,D2w(0)=0')