第3章MATLAB的符号运算符号计算是对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。MATLAB具有符号数学工具箱(SymbolicMathToolbox),将符号运算结合到MATLAB的数值运算环境。符号数学工具箱是建立在Maple软件基础上的。3.1符号表达式的建立3.1.1创建符号常量符号常量是不含变量的符号表达式,用sym命令来创建符号常量。语法:sym(‘常量’)%创建符号常量例如:a=sym('sin(2)')a=sin(2)3.1.2创建符号变量和表达式1.使用sym命令创建符号变量和表达式语法:sym(‘表达式’)%创建符号表达式符号变量名=sym(‘表达式’)%符号表达式赋给符号变量2.使用syms命令创建符号变量和符号表达式——syms用于创建多个符号变量语法:syms(‘arg1’,‘arg2’,…,参数)%把字符变量定义为符号变量symsarg1arg2…,参数%把字符变量定义为符号变量的简洁形式【例】使用syms命令创建符号变量和符号表达式。symsabcx%创建多个符号变量f2=a*x^2+b*x+c%创建符号表达式f2=a*x^2+b*x+csyms('a','b','c','x')f3=a*x^2+b*x+c;%创建符号表达式3.1.3符号矩阵用sym和syms命令也可以创建符号矩阵。例如,A=sym('[a,b;c,d]')A=[a,b][c,d]symsabcdA=[ab;cd]A=[a,b][c,d]3.2符号表达式的代数运算符号运算与数值运算的区别主要有以下几点:•符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的。•符号运算可以得出完全的封闭解或任意精度的数值解。•符号运算的时间较长,而数值型运算速度快。3.2.1符号表达式的代数运算1.符号运算中的运算符(1)基本运算符运算符“+”,“-”,“*”,“\”,“/”,“^”分别实现符号矩阵的加、减、乘、左除、右除、求幂运算。运算符“.*”,“./”,“.\”,“.^”分别实现符号数组的乘、除、求幂,即数组间元素与元素的运算。运算符“′”,“.′”分别实现符号矩阵的共轭转置、非共轭转置。(2)关系运算符在符号对象的比较中,没有“大于”、“大于等于”、“小于”、“小于等于”的概念,而只有是否“等于”的概念。运算符“==”、“~=”分别对运算符两边的符号对象进行“相等”、“不等”的比较。当为“真”时,比较结果用1表示;当为“假”时,比较结果则用0表示。2.函数运算(1)三角函数和双曲函数三角函数包括sin、cos、tan;双曲函数包括sinh、cosh、tanh;三角反函数除了atan2函数仅能用于数值计算外,其余的asin、acos、atan函数在符号运算中与数值计算的使用方法相同。(2)指数和对数函数指数函数sqrt、exp的使用方法与数值计算的完全相同;对数函数在符号计算中只有自然对数log(表示ln),而没有数值计算中的log2和log10。(3)复数函数复数的共轭conj、求实部real、求虚部imag和求模abs函数与数值计算中的使用方法相同。但注意,在符号计算中,MATLAB没有提供求相角的命令。(4)矩阵代数命令MATLAB提供的常用矩阵代数命令有diag,triu,tril,inv,det,rank,poly,eig、expm等,它们的用法几乎与数值计算中的情况完全一样。【例】求矩阵的行列式值、非共轭转置和特征值。symsa11a12a21a22A=[a11a12;a21a22]%创建符号矩阵A=[a11,a12][a21,a22]det(A)%计算行列式ans=a11*a22-a12*a21A.'%计算非共轭转置ans=[a11,a21][a12,a22]eig(A)%计算特征值【例】符号表达式f=2x2+3x+4与g=5x+6的代数运算。f=sym('2*x^2+3*x+4')f=2*x^2+3*x+4g=sym('5*x+6')g=5*x+6f+g%符号表达式相加ans=2*x^2+8*x+10f*g%符号表达式相乘ans=(2*x^2+3*x+4)*(5*x+6)•1.自由变量的确定原则–小写字母i和j不能作为自由变量。–符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。–大写字母比所有的小写字母都靠后。•2.findsym函数–如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。–语法:findsym(f,n)%确定自由符号变量说明:f可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出f中所有的符号变量。3.2.2符号表达式的操作和转换1、符号表达式中自由变量的确定2、符号表达式的化简(1)pretty函数将给出排版形式的输出结果。(2)collect函数将表达式中相同次幂的项合并,也可以再输入一个参数指定以哪个变量的幂次合并。(3)expand函数将表达式展开成多项式形式。(4)horner函数将表达式转换为嵌套格式。(5)factor函数将表达式转换为嵌套格式。(6)simplify函数利用函数规则对表达式进行化简。(7)simple函数调用MATLAB的其他函数对表达式进行综合化简,并显示化简过程。3、符号表达式的替换•MATLAB中,可以通过符号替换使表达式的形式简化。符号工具箱中提供了两个函数用于表达式的替换:1.subexpr•该函数自动将表达式中重复出现的比较长的子表达式或字符串用变量替换,该函数的调用格式为:–subexpr(s,s1),指定用符号变量s1来代替符号表达式s(可以是矩阵)中重复出现的字符串。替换后的结果由ans返回,被替换的字符串由s1返回;–[Y,s1]=subexpr(X,‘s1’),该命令与上面的命令不同之处在于第二个参数为字符串,该命令用来替换表达式中重复出现的字符串。•2.subs•函数subs可以用指定符号替换表达式中的某一特定符号。–subs(s)–subs(s,new)–subs(s,old,new)4、求反函数和复合函数语法:finverse(f,v)%对指定自变量v的函数f(v)求反函数compose(f,g)%计算复合函数f(g(x))5、符号表达式与多项式的转换构成多项式的符号表达式f(x)可以与多项式系数构成的行向量进行相互转换,MATLAB提供了函数sym2poly和poly2sym实现相互转换。【例1】将符号表达式2x+3x2+1转换为行向量。f=sym('2*x+3*x^2+1')f=2*x+3*x^2+1sym2poly(f)%转换为按降幂排列的行向量ans=321【例2】将行向量转换为符号表达式。g=poly2sym([132])%默认x为符号变量的符号表达式g=x^2+3*x+23.3符号极限、微积分和级数求和3.3.1符号极限假定符号表达式的极限存在,SymbolicMathToolbox提供了直接求表达式极限的函数limit,函数limit的基本用法如表所示。limit函数的用法表表达式函数格式说明f(x)lim0xlimit(f)对x求趋近于0的极限f(x)limaxlimit(f,x,a)对x求趋近于a的极限,当左右极限不相等时极限不存在。f(x)limaxlimit(f,x,a,‘left’)对x求左趋近于a的极限f(x)limaxlimit(f,x,a,‘right’)对x求右趋近于a的极限3.3.2符号微分函数diff是用来求符号表达式的微分。语法:diff(f)%求f对自由变量的一阶微分diff(f,t)%求f对符号变量t的一阶微分diff(f,n)%求f对自由变量的n阶微分diff(f,t,n)%求f对符号变量t的n阶微分3.3.3符号积分积分有定积分和不定积分,运用函数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]为积分区间;与符号微分相比,符号积分复杂得多。因为函数的积分有时可能不存在,即使存在,也可能限于很多条件,MATLAB无法顺利得出。当MATLAB不能找到积分时,它将给出警告提示并返回该函数的原表达式。3.3.4符号级数1.symsum函数语法:symsum(s,x,a,b)%计算表达式s的级数和.说明:x为自变量,x省略则默认为对自由变量求和;s为符号表达式;[a,b]为参数x的取值范围。2.taylor函数语法:taylor(F,x,n)%求泰勒级数展开说明:x为自变量,F为符号表达式;对F进行泰勒级数展开至n项,参数n省略则默认展开前5项。【例】求级数1+x+x2+…+xk+…的和。symsxks1=symsum(1/k^2,1,10)%计算级数的前10项和s1=1968329/1270080s2=symsum(1/k^2,1,inf)%计算级数和s2=1/6*pi^2s3=symsum(x^k,'k',0,inf)%计算对k为自变量的级数和s3=-1/(x-1)222k131211【例】求ex的泰勒展开式symsxs1=taylor(exp(x),8)%展开前8项s1=1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/720*x^6+1/5040*x^7s2=taylor(exp(x))%默认展开前5项s2=1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^53.4符号方程的求解3.4.1代数方程语法:solve(‘eq’,’v’)%求方程关于指定变量的解solve(‘eq1’,’eq2’,’v1’,’v2’,…)%求方程组关于指定变量的解说明:eq可以是含等号的符号表达式的方程,也可以是不含等号的符号表达式,但所指的仍是令eq=0的方程;当参数v省略时,默认为方程中的自由变量;其输出结果为结构数组类型。3.4.2符号常微分方程语法:dsolve(‘eq’,’con’,’v’)%求解微分方程dsolve(‘eq1,eq2…’,’con1,con2…’,’v1,v2…’)%求解微分方程组说明:’eq’为微分方程;’con’是微分初始条件,可省;’v’为指定自由变量,省略时则默认为x或t为自由变量;输出结果为结构数组类型。•当y是因变量时,微分方程’eq’的表述规定为:y的一阶导数表示为Dyy的n阶导数表示为Dny•微分初始条件'con'应写成'y(a)=b,Dy(c)=d'的格式。dydxnndydx3.5符号积分变换3.5.1傅里叶(Fourier)变换及其反变换1.fourier变换语法:F=fourier(f,t,w)%求时域函数f(t)的fourier变换F说明:返回结果F是符号变量w的函数,当参数w省略,默认返回结果为w的函数;f为t的函数,当参数t省略,默认自由变量为x。2.fourier反变换语法:f=ifourier(F)%求频域函数F的fourier反变换f(t)f=ifourier(F,w,t)【例】计算f(t)=的fourier变换F以及F的fourier反变换。symstwF=fourier(1/t,t,w)%fourier变换F=i*pi*(Heaviside(-w)-Heaviside(w))f=ifourier(F,t)%fourier反变换f=1/tf=ifourier(F)%fourier反变换默认x为自变量f=1/x程序分析:其中Heaviside(t)是单位阶跃函数,函数名为数学家Heaviside的名字。3.5.2拉普拉斯(Laplace)变换及其反变换1.Lapl