MATLAB的符号计算.ppt
第三讲 MATLAB的符号计算,所谓符号计算是指在运算时,无须事先对变量赋值,而将所得到结果以标准的符号形式来表示。MathWorks公司以Maple的内核作为符号计算引擎(Engine),依赖Maple已有的函数库,开发了实现符号计算的两个工具箱:基本符号工具箱和扩展符号工具箱。,一、字符串,一个字符串由多个字符组成,用单引号()来界定。字符串是按行向量进行存储的。1.字符串占用的字节每一个字符会占用两个字节。str2=I like 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(常量,参数)%把常量按某种格式转换为符号常量,参数设置,二、符号表达式的建立,【例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定义为符号运算量。,(二)定义符号变量和符号表达式,二、符号表达式的建立,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,(二)定义符号变量和符号表达式,二、符号表达式的建立,【例4】已知一复数表达式 z=x+i*y,试求其共轭复数,并求该表达式与其共轭复数乘积的多项式。为了使乘积表达式x2+y2非负,这里,把变量x和y定义为实数。x=sym(x,real);y=sym(y,real);,(二)定义符号变量和符号表达式,二、符号表达式的建立,z=x+i*y;%定义复数表达式conj(z)%求共轭复数ans=x-i*yexpand(z*conj(z)%求表达式与其共轭复数乘积的多项式ans=x2+y2注:x=sym(x,unreal)可去掉x的属性,将x创建为纯格式的符号变量,输出结果一样。,(二)定义符号变量和符号表达式,二、符号表达式的建立,2、syms函数syms函数的功能与sym函数类似。syms函数可以在一个语句中同时定义多个符号变量,其一般格式为:syms arg1 arg2 argN 用于将arg1,arg2,argN等符号创建为符号型数据。,(二)定义符号变量和符号表达式,二、符号表达式的建立,【例5】使用syms命令创建符号变量和符号表达式。f1=sym(a*x2+b*x+c)f1=a*x2+b*x+c syms a b c x%创建多个符号变量 f2=a*x2+b*x+c%创建符号表达式 f2=a*x2+b*x+c syms(a,b,c,x)f3=a*x2+b*x+c;%创建符号表达式,(二)定义符号变量和符号表达式,二、符号表达式的建立,(三)符号矩阵用sym和syms命令也可以创建符号矩阵。【例6】比较符号矩阵与字符串矩阵的不同。A=sym(a,b;c,d)%创建符号矩阵 A=a,b c,d%大小:2*2 sym object B=a,b;c,d%创建字符串矩阵 B=a,b;c,d%大小:1*9 char array C=a,b;c,d?Undefined function or variable a.,二、符号表达式的建立,(三)符号矩阵C=sym(B)%转换为符号矩阵 C=a,b c,d whos Name Size Bytes Class A 2x2 312 sym object B 1x9 18 char array C 2x2 312 sym objectGrand total is 25 elements using 642 bytes,二、符号表达式的建立,三、符号表达式的代数运算,(一)符号表达式的代数运算(二)符号数值任意精度控制和运算(三)符号对象与数值对象的转换,符号运算与数值运算的主要区别:传统的数值型运算因为要受到计算机所保留的有效位数的限制,它的内部表示法总是采用计算机硬件提供的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】求矩阵的行列式值、非共轭转置和特征值。syms a11 a12 a21 a22 A=a11 a12;a21 a22%创建符号矩阵 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*(a112-2*a11*a22+a222+4*a12*a21)(1/2)1/2*a11+1/2*a22-1/2*(a112-2*a11*a22+a222+4*a12*a21)(1/2),(一)符号表达式的代数运算,三、符号表达式的代数运算,1.Symbolic Math Toolbox中的算术运算方式数值型: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)+pi digits%显示默认的有效位数 digits=32 vpa(a)%用默认的位数计算并显示 ans=7.6137286085893726312809907207421,三、符号表达式的代数运算,(二)符号数值任意精度控制和运算,vpa(a,20)%按指定的精度计算并显示 ans=7.6137286085893726313 digits(15)%改变默认的有效位数 vpa(a)%按digits指定的精度计算并显示 ans=7.61372860858937,三、符号表达式的代数运算,(二)符号数值任意精度控制和运算,【例8续】用三种运算方式表达式比较2/3的结果。a1=2/3%数值型 a1=0.6667 a2=sym(2/3)%有理数型 a2=2/3 a3=vpa(2/3,32)%VPA型 a3=.66666666666666666666666666666667,三、符号表达式的代数运算,(二)符号数值任意精度控制和运算,程序分析三种运算方式中数值型运算的速度最快。有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。数值型变量a1结果显示的有效位数并不是存储的有效位数,显示的有效位数由“format”命令控制。,三、符号表达式的代数运算,(二)符号数值任意精度控制和运算,1.将数值对象转换为符号对象sym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。2.将符号对象转换为数值对象格式:N=double(S)%将符号变量S转换为数值变量NN=numeric(S)%将符号变量S转换为数值变量N,(三)符号对象与数值对象的转换,三、符号表达式的代数运算,【例9】将符号变量与数值变量进行转换。a1=sym(2*sqrt(5)+pi)a1=2*sqrt(5)+pi b1=double(a1)%转换为数值变量 b1=7.6137 a2=vpa(sym(2*sqrt(5)+pi),32)a2=7.6137286085893726312809907207421,三、符号表达式的代数运算,(三)符号对象与数值对象的转换,【例9】续:b2=numeric(a2)%转换为数值变量 b2=7.6137 b3=eval(a1)%由符号变量得出数值结果b3=7.6137,三、符号表达式的代数运算,(三)符号对象与数值对象的转换,四、符号表达式的操作和转换,(一)符号表达式中自由变量的确定(二)符号表达式的化简(三)符号表达式的替换(四)求反函数和复合函数(五)符号表达式的转换,1.自由变量的确定原则MATLAB将基于以下原则选择一个自由变量:小写字母i和j不能作为自由变量。符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。大写字母比所有的小写字母都靠后。,四、符号表达式的操作和转换,(一)符号表达式中自由变量的确定,2.findsym函数如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。格式:findsym(EXPR,n)%确定自由符号变量说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。,(一)符号表达式中自由变量的确定,四、符号表达式的操作和转换,【例10】得出符号表达式中的符号变量。f=sym(a*x2+b*x+c)f=a*x2+b*x+c findsym(f)%得出所有的符号变量 ans=a,b,c,x,(一)符号表达式中自由变量的确定,四、符号表达式的操作和转换,g=sym(sin(z)+cos(v)g=sin(z)+cos(v)findsym(g,1)%得出第一个符号变量 ans=z 说明:符号变量z和v距离x相同,以在x后面的z为自由符号变量。,(一)符号表达式中自由变量的确定,四、符号表达式的操作和转换,同一个多项式的符号表达式可以表示成三种形式:多项式形式:f(x)=x3-6x2+11x-6 因式形式:f(x)=(x-1)(x-2)(x-3)嵌套形式:f(x)=x(x(x-6)+11)-6,(二)符号表达式的化简(Simplificate),四、符号表达式的操作和转换,【例11】三种形式的符号表达式的表示。f=sym(x3-6*x2+11*x-6)%多项式形式 f=x3-6*x2+11*x-6 g=sym(x-1)*(x-2)*(x-3)%因式形式 g=(x-1)*(x-2)*(x-3)h=sym(x*(x*(x-6)+11)-6)%嵌套形式 h=x*(x*(x-6)+11)-6,(二)符号表达式的化简(Simplificate),四、符号表达式的操作和转换,pretty:给出排版形式的输出结果 collect:将表达式写成多项式形式horner:将多项式形式写成嵌套形式factor:将表达式写成因式形式,3 2 x-6 x+11 x-6,x3-6*x2+11*x-6,x*(x*(x-6)+11)-6,(x-1)*(x-2)*(x-3),(二)符号表达式的化简(Simplificate),四、符号表达式的操作和转换,expand:将符号表达式展开成多项式形式simplify:对表达式进行化简例如:k=sym(cos(x)2-sin(x)2)k=cos(x)2-sin(x)2 simplify(k)ans=2*cos(x)2-1simple:寻求表达式的多种简化形式,使之包含最少数目的字符,(二)符号表达式的化简(Simplificate),四、符号表达式的操作和转换,subs函数:对符号表达式中符号变量的替换。格式:subs(s)%用给定值替换符号表达式s中的所有变量subs(s,new)%用new替换符号表达式s中的自由变量subs(s,old,new)%用new替换符号表达式s中的old变量,(三)符号表达式的替换(Substitutions),四、符号表达式的操作和转换,【例12】用subs函数对符号表达式进行替换。f=sym(x+y)2+3*(x+y)+5)%创建符号表达式 f=(x+y)2+3*(x+y)+5 x=5;f1=subs(f)%用工作空间的给定值替换x f1=(5+y)2+20+3*y,(x+y)2+3(x+y)+5,(三)符号表达式的替换(Substitutions),四、符号表达式的操作和转换,f2=subs(f,x+y,s)%用s替换x+y f2=(s)2+3*(s)+5 f3=subs(f,x+y,5)%用常数5替换x+y f3=45 f4=subs(f,x,z)%用z替换x f4=(z)+y)2+3*(z)+y)+5 注:可以用来计算多项式的值,以及化简。,(x+y)2+3(x+y)+5,(三)符号表达式的替换(Substitutions),四、符号表达式的操作和转换,1.求反函数g=finverse(f,v)%对指定自变量v的函数f(v)求反函数说明:当v省略,则对默认的自由符号变量求反函数。2.求复合函数运用函数compose可以求符号函数f(x)和g(y)的复合函数。compose(f,g,z)%求f(x)和g(y)的复合函数f(g(z),(四)求反函数和复合函数,四、符号表达式的操作和转换,【例13】求tex的反函数。f=sym(t*ex)%原函数 f=t*ex g=finverse(f)%对默认自由变量求反函数 g=log(x/t)/log(e)g=finverse(f,t)%对t求反函数 g=t/(ex)注:如果先定义t为符号变量,则参数t的单引号可去掉。,(四)求反函数和复合函数,四、符号表达式的操作和转换,【例14】计算tex与ay2+by+c的复合函数。f=sym(t*ex);%创建符号表达式 g=sym(a*y2+b*y+c);%创建符号表达式 h1=compose(f,g)%计算f(g(x)h1=t*e(a*y2+b*y+c)h2=compose(g,f)%计算g(f(x)h2=a*t2*(ex)2+b*t*ex+c h3=compose(f,g,z)%计算f(g(z)h3=t*e(a*z2+b*z+c),(四)求反函数和复合函数,四、符号表达式的操作和转换,1.符号表达式与多项式的转换构成多项式的符号表达式f(x)可以与多项式系数构成的行向量进行相互转换,MATLAB提供了函数sym2poly和poly2sym实现相互转换。2.提取分子和分母如果符号表达式是一个有理分式(两个多项式之比),可以利用numden函数来提取分子或分母,还可以进行通分。格式:n,d=numden(f),(五)符号表达式的转换,四、符号表达式的操作和转换,【例15】将符号表达式2x+3x2+1转换为行向量。f=sym(2*x+3*x2+1)f=2*x+3*x2+1 sym2poly(f)%转换为按降幂排列的行向量 ans=3 2 1,(五)符号表达式的转换,四、符号表达式的操作和转换,f1=sym(a*x2+b*x+c)f1=a*x2+b*x+c sym2poly(f1)?Error using=sym/sym2polyInput has more than one symbolic variable.注:只能对含有一个变量的符号表达式进行转换。,(五)符号表达式的转换,四、符号表达式的操作和转换,g=poly2sym(1 3 2)%默认x为符号变量的符号表达式 g=x2+3*x+2 g=poly2sym(1 3 2,y)%y为符号变量的符号表达式 g=y2+3*y+2,(五)符号表达式的转换,四、符号表达式的操作和转换,【例16】用numden函数来提取符号表达式 和 的分子、分母。f1=sym(1/(s2+3*s+2)f1=1/(s2+3*s+2)f2=sym(1/s2+3*s+2)f2=1/s2+3*s+2,(五)符号表达式的转换,四、符号表达式的操作和转换,n1,d1=numden(f1)n1=1d1=s2+3*s+2 n2,d2=numden(f2)n2=1+3*s3+2*s2d2=s2,(五)符号表达式的转换,四、符号表达式的操作和转换,五、符号极限、微积分和级数,(一)符号极限(二)符号微分(三)符号积分(四)符号级数,limit(f)函数的用法,五、符号极限、微积分和级数,(一)符号极限,【例17】分别求1/x在0处从两边趋近、从左边趋近和从右边趋近的三个极限值。f=sym(1/x)f=1/x limit(f)%对x求趋近于0的极限 ans=NaN limit(f,x,0)%对x求趋近于0的极限ans=NaN,五、符号极限、微积分和级数,(一)符号极限,limit(f,x,0,left)%左趋近于0 ans=-inf limit(f,x,0,right)%右趋近于0 ans=inf 注:当左右极限不相等,表达式的极限不存在,为NaN。,五、符号极限、微积分和级数,(一)符号极限,求导和微分都可以由函数diff实现:diff(f):求f对自由变量的一阶微分;diff(f,n):求f对自由变量的n阶微分;diff(f,t):求f对符号变量t的一阶微分;diff(f,t,n)或diff(f,n,t):求f对符号变量t的n阶微分。,五、符号极限、微积分和级数,(二)符号微分,【例18】分别求函数 的一阶和二阶导数。syms x;f=sym(x-1)3/(x+1);B=diff(f)B=3*(x-1)2/(x+1)-(x-1)3/(x+1)2 C=diff(f,2)C=6*(x-1)/(x+1)-6*(x-1)2/(x+1)2+2*(x-1)3/(x+1)3,五、符号极限、微积分和级数,(二)符号微分,【例19】已知,求 的微分。,f=sym(a*x2+b*x+c)diff(f)diff(f,a)diff(f,x,2)diff(f,3),五、符号极限、微积分和级数,(二)符号微分,f=sym(a*x2+b*x+c)f=a*x2+b*x+c diff(f)ans=2*a*x+b diff(f,a)ans=x2,diff(f,x,2)ans=2*a diff(f,3)ans=0,注:微分函数diff也可以用于符号矩阵,其结果是对矩阵的每一个元素进行微分运算。,【例20】对符号矩阵 求微分。syms t xg=2*x t2;t*sin(x)exp(x)%创建符号矩阵 g=2*x,t2 t*sin(x),exp(x),五、符号极限、微积分和级数,(二)符号微分,diff(g)%对默认自由变量x求一阶微分 ans=2,0 t*cos(x),exp(x)diff(g,t)%对符号变量t求一阶微分 ans=0,2*t sin(x),0 diff(g,2)%对默认自由变量x求二阶微分 ans=0,0-t*sin(x),exp(x),五、符号极限、微积分和级数,(二)符号微分,积分有定积分和不定积分,运用函数int可以求得符号表达式的积分。格式:int(f,t)%求符号变量t的不定积分int(f,t,a,b)%求符号变量t的积分int(f,t,m,n)%求符号变量t的积分注:t为符号变量,当t省略则为默认自由变量;a和b为数值,a,b为积分区间;m和n为符号对象,m,n为积分区间。,(三)符号积分,五、符号极限、微积分和级数,【例21】求积分 和。,f=sym(cos(x);int(f)%求不定积分 ans=sin(x)int(f,0,pi/3)%求定积分 ans=1/2*3(1/2),int(f,a,b)%求定积分 ans=sin(b)-sin(a)int(int(f)%求多重积分 ans=-cos(x),五、符号极限、微积分和级数,(三)符号积分,【例22】求符号矩阵 的积分。g=2*x t2;t*sin(x)exp(x)%创建符号矩阵 g=2*x,t2 t*sin(x),exp(x)int(g,a,b)%对x求定积分 ans=b2-a2,t2*(b-a)-t*cos(b)+t*cos(a),exp(b)-exp(a),五、符号极限、微积分和级数,(三)符号积分,1.symsum函数格式:symsum(s,x,a,b)%计算表达式s的级数和注:x为自变量,x省略则默认为对自由变量求和;s为符号表达式;a,b为参数x的取值范围。,(四)符号级数,五、符号极限、微积分和级数,【例23】求级数 和1+x+x2+xk+的和。syms x k s1=symsum(1/k2,1,10)%计算级数的前10项和 s1=1968329/1270080 s2=symsum(1/k2,1,inf)%计算级数和 s2=1/6*pi2 s3=symsum(xk,k,0,inf)%计算对k为自变量的级数和 s3=-1/(x-1),(四)符号级数,五、符号极限、微积分和级数,2.taylor函数格式:taylor(F,x,n)%求泰勒级数展开注:x为自变量,F为符号表达式;对F进行泰勒级数展开至n项,参数n省略则默认展开前5项。,(四)符号级数,五、符号极限、微积分和级数,【例24】求ex的泰勒展开式。syms x s1=taylor(exp(x),8)%展开前8项 s1=1+x+1/2*x2+1/6*x3+1/24*x4+1/120*x5+1/720*x6+1/5040*x7 s2=taylor(exp(x)%默认展开前5项 s2=1+x+1/2*x2+1/6*x3+1/24*x4+1/120*x5,(四)符号级数,五、符号极限、微积分和级数,六、符号方程的求解,(一)代数方程(二)符号方程,MATLAB可以用solve命令给出方程的数值解。格式:solve(eq,v)%求方程关于指定变量的解solve(eq1,eq2,v1,v2,)%求方程组关于指定变量的解 注:eq可以是含等号的符号表达式的方程,也可以是不含等号的符号表达式,但所指的仍是令eq=0的方程;当参数v省略时,默认为方程中的自由变量;其输出结果为结构数组类型。,六、符号方程的求解,(一)代数方程,【例25】求方程ax2+bx+c=0和sinx=0的解。f1=sym(a*x2+b*x+c)%无等号 f1=a*x2+b*x+c solve(f1)%求方程的解x ans=1/2/a*(-b+(b2-4*a*c)(1/2)1/2/a*(-b-(b2-4*a*c)(1/2)f2=sym(sin(x)f2=sin(x)solve(f2,x)ans=0,六、符号方程的求解,(一)代数方程,【例26】求三元非线性方程组 的解。eq1=sym(x2+2*x+1);eq2=sym(x+3*z=4);eq3=sym(y*z=-1);x,y,z=solve(eq1,eq2,eq3)%解方程组并赋值给x,y,z x=-1y=-3/5z=5/3,六、符号方程的求解,(一)代数方程,dsolve命令可以用于对符号常微分方程进行求解。格式:dsolve(eq,con,v)%求解微分方程dsolve(eq1,eq2,con1,con2,v1,v2)%求解微分方程组注:eq为微分方程;con是微分初始条件,可省略;v为指定自由变量,省略时则默认为x或t为自由变量;输出结果为结构数组类型。,六、符号方程的求解,(二)符号方程,当y是因变量时,微分方程 eq的表述规定为:y的一阶导数表示为Dy;y的n阶导数表示为Dny。微分初始条件con应写成y(a)=b,Dy(c)=d的格式;当初始条件少于微分方程数时,在所得解中将出现任意常数符C1,C2,解中任意常数符的数目等于所缺少的初始条件数。,(二)符号方程,六、符号方程的求解,【例27】求微分方程,的解。y=dsolve(x*D2y-3*Dy=x2,x)%求微分方程的通解 y=-1/3*x3+C1+C2*x4 y=dsolve(x*D2y-3*Dy=x2,y(1)=0,y(5)=0,x)%求微分方程的特解 y=-1/3*x3+125/468+31/468*x4,y(1)=0,y(5)=0,(二)符号方程,六、符号方程的求解,【例28】求微分方程组 的解。x,y=dsolve(Dx=y,Dy=-x)x=cos(t)*C1+sin(t)*C2y=-sin(t)*C1+cos(t)*C2注:默认的自由变量是t,C1、C2为任意常数。,(二)符号方程,六、符号方程的求解,练习:对于函数,求其水平渐近线、极值点和拐点。,创建函数:,syms x num=3*x2+6*x-1;denom=x2+x-3;f=num/denomf=(3*x2+6*x-1)/(x2+x-3)ezplot(f),limit(f,inf)ans=3,求函数图形的水平渐近线,需要求x趋于无穷时f的极限;直线y=3是函数的水平渐近线,roots=solve(denom)roots=-1/2+1/2*13(1/2)-1/2-1/2*13(1/2),limit(f,-inf)ans=3,图形的垂直渐近线分别为:,ezplot(f)%画符号表达式的图像 hold on%后续图形曲线叠加到前面的图形窗口中显示%绘水平渐近线 plot(-2*pi 2*pi,3,3,g)%绘垂直渐近线 plot(double(roots(1)*1 1,-5,10,r)plot(double(roots(2)*1 1,-5,10,r)title(水平渐近线和垂直渐近线)hold off%后续图形曲线产生一个新的图形窗口,f1=diff(f)f1=(6*x+6)/(x2+x-3)-(3*x2+6*x-1)/(x2+x-3)2*(2*x+1)f1=simplify(f1)f1=-(3*x2+16*x+17)/(x2+x-3)2,crit_pts=solve(f1)crit_pts=-8/3+1/3*13(1/2)-8/3-1/3*13(1/2),ezplot(f)hold onplot(double(crit_pts),double(subs(f,crit_pts),ro)title(函数的极大值和极小值)text(-5.5,3.2,局部极小值)text(-2.5,2,局部极大值)hold off,ezplot(f)hold onplot(double(crit_pts),double(subs(f,crit_pts),ro)title(函数的极大值和极小值)text(-5.5,3.2,局部极小值)text(-2.5,2,局部极大值)hold off,f2=diff(f1)f2=-(6*x+16)/(x2+x-3)2+2*(3*x2+16*x+17)/(x2+x-3)3*(2*x+1)inflec_pt=solve(f2);double(inflec_pt)ans=-5.2635-1.3682-0.8511i-1.3682+0.8511i inflec_pt=inflec_pt(1);,ezplot(f,-9,6)hold onplot(double(inflec_pt),double(subs(f,inflec_pt),r*)title(函数的拐点)text(-7,2,拐点)hold off,