第   3  章 
                               符号与多项式运算 
                                       

     
     
      
      
      
     符号计算是指在运算时,无须事先对变量进行赋值,而是将所有得到的结果以标准的符
号形式表示。符号计算是以符号对象和符号表达式作为运算对象的表示方法,在运算过程中得
到的解析值是一个精确的数学表达式,它不会受到计算误差累积问题的影响,其计算命令较为
简单,相比数值计算的结果减少了占用资源。多项式是在符号表示的基础上建立的表达式,使
用  MATLAB   动态系统建模、仿真与分析时,常使用多项式表示。自动控制系统模型描述中的
传递函数均使用多项式描述,在此基础上对系统再进行仿真分析。 
3.1  MATLAB           中的符号运算 

     符号运算与数值运算的区别是:数值运算中必须先对变量赋值才能参与运算。符号运算
无须事先对变量赋值,运算结果以标准的符号形式表示,即数值运算矩阵变量中不允许有未定
义的变量,而符号运算中可以含有未定义的符号变量。 
     3.1.1  符号变量与符号表达式 

     在数学表达式中,一般习惯于使用排在字母表中前面的字母作为变量的系数,而排在后
面的字母表示变量。例如: 
                                     f(x)=ax2+bx+c 
     表达式中的      a,b,c 通常被认为是常数,用作变量的系数;而将                    x 看作自变量。MATLAB         提
供了   sym()和 syms()两个建立符号对象的函数。 
     1.Sym()函数用法 
     Sym()函数用于建立单个符号对象,语法格式: 
      
     符号对象名=sym(A) 
      
     其中: 
    (1)A   为符号对象。它可以是数值常量、数值矩阵或数值表达式,不加单引号为一个符


                                                               第  3 章   符号与多项式运算                63

号常量;加单引号时,该符号对象为一个符号变量。 
     例如: 
     x=sym(a); y=sym('x'); z=sym('y');    %a     为符号常量,x、y       为符号变量 
      
    (2)当需要定义多个字符变量时,可添加需要变量的行数、列数,以生成多行多列的字
符变量矩阵,方法见【实战练习                3-2】。 
    (3)使用     sym()函数能够将数据的值进行精确的保留,不必担心计算的误差等问题。 
     例如:计算      1/123456×(4/5)时,分别使用下面两种方法,其结果精度不同。 
      
     d1=1/123456*(4/5) 
      d2=1/sym(123456)*(4/5) 
     结果分别为: 
     d1 =   6.4800e-06 
     d2 =   1/154320  
     2.syms函数用法 
     syms 函数用于一次定义多个符号变量,语法格式: 
      
     syms 符号变量名     1 符号变量名     2…符号变量名      n 
      
     其中:变量名不能加单引号,相互之间用空格隔开。 
     例如:要同时定义四个符号变量                a、b、c、d,则可以输入如下命令: 
      
     syms a b c d;   或   syms('a','b','c','d') 
      
     说明: 
    (1)syms()函数可以替换         sym()函数,定义符号变量的类型时可使用:syms x positive;                  限
定  x 为正数,若要取消该限定,可用命令                  syms x clear; 
    (2)syms   建立符号矩阵时,可在符号后添加行值和列值,使用方法见【实战练习                                   3-1】。 
     3.符号及操作 
     例如: 
     定义符号变量并建立符号表达式,命令如下: 
      
      x=sym('x'); y=sym('y'); z=sym('z'); 
      a=[1,3,5]; b=[3,7,9]; c=[11,12,13]; 
      Y=a*x+b*y+c*z 
      
     结果: 
      
      Y = [ x + 3*y + 11*z, 3*x + 7*y + 12*z, 5*x + 9*y + 13*z] 
     4.查找符号变量函数symvar() 
     语法格式: 
      
     symvar(f,n)      %f 为符号表达式,n       为查找的符号变量个数,默认为查找所有符号变量 
      
     例如: 
      
     syms x y z a  
     f=2*x-3*y+z^2+5*a 
     symvar(f)                              %查找所有符号变量 

     64         MATLAB 编程实战——手把手教你掌握                      300 个精彩案例 

             symvar(f,1)                                  %查找一个符号变量 
             symvar(f,3)                                  %查找三个符号变量 
              
             结果: 
              
             [ a, x, y, z] 
             x 
             [ x, y, z] 
              
            【实战练习        3-1】建立符号矩阵 
             建立    3×4 的符号矩阵        A 和  2×3 的符号矩阵        B。 
             编程代码如下: 
              
             A=sym('a',[3 4]) 
             syms B [2,3] 
              
             结果: 
              
             A =[a1_1, a1_2, a1_3, a1_4] 
                [a2_1, a2_2, a2_3, a2_4] 
                [a3_1, a3_2, a3_3, a3_4] 
             B =[B1_1, B1_2, B1_3] 
                [B2_1, B2_2, B2_3] 
             5.符号变量与符号表达式 
             语法格式: 
              
             F='符号表达式' 
              
             例如:F='sin(x)+5x' 
             说明:F为符号变量名,sin(x)+5x为符号表达式,' '为符号标识,符号表达式一定要用单
        引号引起来MATLAB才能识别。引号内容既可以是符号表达式,也可以是符号方程。 
             例如: 
              
             f1='a∗x^2+b∗x+c'                             %二次三项式 
             f2= 'a∗x^2+b∗x+c=0'                          %方程 
             f3='Dy+y^2=1'               %微分方程 
              
             符号表达式或符号方程可以赋给符号变量,以后调用方便,也可以不赋给符号变量而直
        接参与计算。 
             6.符号矩阵的创建 
             语法格式: 
              
              A=sym('[    ]')  
             说明:符号矩阵输入内容同数值矩阵,必须使用                               sym  命令定义,且需用单引号('   ')
        标识,若定义数值矩阵必须是数值,否则不能识别,例如: 
             A=[1,2;3,4]可以,但       A=[a,b;c,d]  则出错。应使用如下命令: 
              
             A = sym('[a,b;c,d]') 
              


                                                                       第  3 章   符号与多项式运算                65

     结果: 
      
     A =[ a, b] 
        [ c, d] 
      
     符号矩阵每一行的两端都有方括号,这是与 MATLAB                        数值矩阵的一个重要区别。若用字
符串直接创建矩阵,需保证同一列中各元素字符串有相同的维度。可以用                                     syms 先定义    a,b,c,d
为符号变量再建立符号矩阵,方法是: 
      
     syms a b c d 
     A=[a,b;c,d] 
      
     也可以使用: 
      
     A =['[a, b]'; '[c, d]']  
     3.1.2  符号基本运算 

     因为符号运算不需进行数值运算,不会出现误差,因此符号运算是非常准确的。符号运
算可以得出完全封闭解或任意精度的数值解,但符号运算的时间比数值运算速度慢。 
     1.符号算术运算 
     符号运算包括算术运算、关系运算、逻辑运算和因式分解运算等,算术运算与四则运算
的数值运算一样,用+、-、*、/、^运算符实现,其运算结果依然是一个符号表达式;关系运
算仅列出相应的关系表达式;逻辑运算结果还是逻辑值。 
    【实战练习      3-2】符号算术运算 
     定义符号表达式,进行算术与关系运算。 
     编程代码如下: 
      
     syms x y; 
     g1=x^2+2*x+1;                              %定义符号表达式 
     g2=3*x^2+7*x+10;  
     G1=g1+g2 
     G2=g1-g2 
     G3=g1.*g2 
     G4=g1/g2 
     G5=g1>=g2 
      
     结果: 
      
     G1 = 4*x^2 + 9*x + 11 
     G2 = - 2*x^2 - 5*x - 9 
     G3 = (x^2 + 2*x + 1)*(3*x^2 + 7*x + 10) 
     G4 = (x^2 + 2*x + 1)/(3*x^2 + 7*x + 10) 
     G5 = 3*x^2 + 7*x + 10 <= x^2 + 2*x + 1  
     2.符号关系运算与逻辑运算 
    (1)符号关系运算。 
     符号关系运算与数值关系运算一样,包括                    6 种运算符:<、<=、>、>=、==、~=。 


     66       MATLAB 编程实战——手把手教你掌握                 300 个精彩案例 

            也可以使用对应的         6 个函数来实现:lt()、le()、gt()、ge()、eq()、ne()。 
            例如: 
             
            symsab c 
            a> b<c 
             
            结果: 
             
            ans =(b < a) < c 
             
            若参与运算的是符号,其结果是一个符号关系表达式;若参与运算的是符号矩阵,其结
       果是由符号关系表达式组成的矩阵。 
            在进行符号对象运算前,可用               assume()函数对符号对象设置值域,语法格式: 
             
            assume(条件) 或 assume(表达式,集合)   %设置表达式属于集合中,使用方法见 
                       %【实战练习                                          3-4】 
             
           (2)符号逻辑运算。 
            常用的符号逻辑运算有           3 种:&(与)、|(或)、~(非)。 
            4 个逻辑运算函数分别为:and(a,b)、or(a,b)、not(a)和            xor(a,b)。 
            说明:符号逻辑运算的结果还是逻辑符号表达式,使用方法见【实战练习                                    3-3】。 
           【实战练习      3-3】符号的关系运算与逻辑运算 
            已知符号     x,先使用     assume()函数进行判断,如果           a 是一个正数,用        assume(a>0)进行判
       断,则结果是       a;如果    a 是一个负数,用        assume(a<0)进行判断,则结果是-a。 
            编程代码如下: 
             
            syms x; 
            assume(x<0); 
            y1=abs(x)==x  
            assume(x,'positive') 
            y2=abs(x)==x  
            y3=x>0&x<10  
            y4=or(x<0,x>10) 
             
            结果: 
             
            y1 =-x == x 
            y2 =x == x 
            y3 =0 < x & x < 10 
            y4 =x < 0 | 10 < x 
             
            说明:因为      x<0,所以    abs(x)的值  y1 为-x;x   为整数,所以       abs(x)的值  y2 为  x。 
            3.符号替换函数subs() 
            使用符号定义了一个符号函数后,subs()函数可将符号函数中的一些符号替换成其他符号
       或者其他数值类型。 
            语法格式: 
             
            subs(S, old, new)  
             

                                                                               第  3 章   符号与多项式运算                   67

     其中:符号表达式            S 可利用 new 中的符号或数值替换 old 中的符号。 
     例如: 
     f=x^2+y^2 
     f1=subs(f,y,3) 
      
     结果: 
     f1=x^2+9 
      
    【实战练习        3-4】符号表达式的替换 
     根据符号表达式           f(x,y)和 f,分别对下面两个多项式进行符号、数值和多数值替换操作。 
                                        ax22+ by
                               fxy(, )=           ,  f =++ax2 by   c  
                                           c2
     编程代码如下: 
      
     syms a b c x y m        %定义符号运算变量 
     fxy=(a*x^2+b*y^2)/c^2                                       %生成符号函数 
     fxy1=subs(fxy,[a,b,c],[1,2,3])                              %数值替换符号 
     f = a * x^2 + b * y + c;                                    %原表达式 
     f1 = subs(f, [x y], [sin(x) log(y)])                        %符号替换符号 
     f2 = subs(f, [a b], [2 3])                                  %数值替换符号 
     f3 = subs(f, a, 1: 4)                                       %多数值替换符号 
      
     结果: 
      
     fxy =   (a*x^2 + b*y^2)/c^2 
     fxy1 =  x^2/9 + (2*y^2)/9 
     f1 =      a*sin(x)^2 + c + b*log(y) 
     f2 =      2*x^2 + c + 3*y 
     f3 =      [x^2 + c + b*y, 2*x^2 + c + b*y, 3*x^2 + c + b*y, 4*x^2 + c + b*y] 
3.2  多项式表示 

     MATLAB      语言把多项式表达成一个行向量,该向量中的元素是按多项式降幂排列的。
例如: 
                                              n     n-1
                                     P(x)=anx +an-1x   +…+a0 
     多项式输入时,缺少项的向量系数的相应位置用零补足,在                                      MATLAB    中建立方法为: 

                                        P=[an+an-1+…+a0] 
     3.2.1     直接建立多项式 

     由于    MATLAB    自动将向量元素按降幂顺序分配给各系数,所有输入按照由高项系数到低
项系数依次输入并直接建立多项式,若中间有缺项需要添加零,例如:对于多项式 
                                    P(x)=x5+3x4+11x3+25x+36 
                                    P=[1 3 11 0 25 36] 

     68       MATLAB 编程实战——手把手教你掌握                 300 个精彩案例 

            3.2.2  使用函数建立多项式 

            1.使用sym2poly()函数建立多项式系数 
            sym2poly()函数将符号多项式转换为多项式系数,由高次项系数到低次项系数依次输出。 
            例如: 
             
            syms x; 
            sym2poly(7*x^3 +3*x^2- 5*x -18) 
             
            结果为: 
            7  3  -5  -18 
            2.使用poly2sym()函数建立符号多项式 
            poly2sym()函数把多项式系数转换为符号多项式。 
            例如: 
             
            sym x; 
            poly2sym([3 5 4],x);  
             
            结果: 
             
            ans  =3*x^2+5*x+4 
             
           【实战练习      3-5】符号与多项式的转换 
            使用  sym2poly()与  poly2sym()函数完成符号与多项式的转换。 

                                    π    23
           (1)生成表达式:         ax=+++sin  e x ln100i x 1 并计算; 
                                    6
           (2)生成     3 次项的符号表达式         c; 
           (3)给定系数【1,-1,-3】生成符号表达式                    d。 
            编程代码如下: 
             
            syms x c1 c2 c3 c4 
            a=sym2poly(sin(pi/6)*x + exp(1)*x^2+log(100)*x^3+1) 
            b = [c1 c2,c3,c4] 
            c = poly2sym(b) 
             d = poly2sym([-1,1,-30]) 
            结果: 
             
            a =    4.6052    2.7183    0.5000    1.0000 
            b =   [c1, c2, c3, c4] 
            c =   c1*x^3 + c2*x^2 + c3*x + c4 
            d =  - x^2 + x - 30 
       3.3  多项式运算 

            多项式是一个式子,可以包含数字、变量和运算符号,是代数学中的基础概念。多项式
       运算除多项式加、减、乘、除运算外,还包括多项式提取、分解、展开、合并同类项等操作。 

                                                                               第  3 章   符号与多项式运算                   69

     3.3.1  多项式加、减运算 

     多项式加、减运算就是其相同幂次系数向量的加、减运算,幂次相同的多项式直接对向
量系数进行加、减运算,若两个多项式幂次不同,在低次多项式中不足的高次多项式用零补足,
再进行加、减运算。 
    【实战练习        3-6】多项式加、减运算的应用 
     已知    p1=3x3+5x2+7,p2=2x2+5x+3,请计算:P1=p1+p2                和   P2=p1-p2   并转换为符号表达
式。 
     编程代码如下: 
      
     p1=[3 5 0 7]; p2=[0 2 5 3]; 
     P1=p1+p2 ; 
     P2= p1-p2; 
     p3=poly2sym(P1) 
     p4=poly2sym(P2) 
      
     结果: 
      
     p3 =  3*x^3 + 7*x^2 + 5*x + 10 
     p4 = 3*x^3 + 3*x^2 - 5*x + 4  
      
     加、减运算直接加入加、减运算符即可完成。 
     3.3.2  多项式乘、除运算 

     多项式乘、除运算是一个复杂的过程,使用                           MATLAB    提供的函数就异常简单,语法格式: 
      
     k=conv(p,q)                         %多项式相乘 
     [q,r]=deconv(a,b)               %多项式相除,q            为多项式的商,r          为多项式的余数 
      
    【实战练习        3-7】多项式的乘、除运算的应用 
     已知    a=6x4+2x3+3x2+12,b=3x2+2x+5,求         c=a*b,d=a/b。 
     编程代码如下: 
      
     a=[6 2 3 0 12 ]; b=[3 2 5];    
     c=conv(a,b); 
     [d,r]=deconv(a,b); 
     C=poly2sym(c) 
     d=poly2sym(d) 
     r=poly2sym(r) 
      
     结果: 
     C=18*x^6+18*x^5+43*x^4+16*x^3+51*x^2+24*x+60 
     d=2*x^2-(2*x)/3-17/9 
     r=(64*x)/9+193/9 
      
     说明:多项式相乘就是两个代表多项式的行向量的卷积,两个以上多项式相乘,conv                                                    命
令使用嵌套。 

     70         MATLAB 编程实战——手把手教你掌握                      300 个精彩案例 

             例如:计算表达式            a×b×c    时,命令为        conv(conv(a,b),c)。 
             3.3.3  多项式分解、展开与提取 

             1.多项式分解与展开 
             语法格式: 
              
             F=factor(f)      %对          f 多项式进行因式分解,也可用于正整数的分解 
             F=expand(f)              %对多项式      f 展开 
             F=collect(f)             %对于多项式       f 中相同变量且幂次相同项合并系数,即合并同类项 
             F=collect(f,v)           %按变量 v 进行合并同类项 
             2.提取多项式的分子和分母 
             如果符号表达式是一个有理分式或可以展开为有理分式,可利用                                         numden()函数提 
             取符号表达式中的分子或者分母,语法格式: 
              
             [n,d]=numden(s)       %n                   表示分子,d       表示分母 
              
            【实战练习        3-8】多项式分解与展开的应用 
             对  f 多项式及常数         y 进行分解并展开显示。 
             编程代码如下: 
              
             syms x;  
             f=x^9-1; f=factor(f) 
             y = 2025;  
             y1=factor(y) 
             y2 = factor(sym(y)) 
             y3=poly2sym(y2) 
              
             结果: 
              
             f=[x-1,x^2+x+1,x^6+x^3+1] 
             y1=3     3     3     3     5     5 
             y2=[3,3,3,3,5,5] 
             y3=3*x^5+3*x^4+3*x^3+3*x^2+5*x+5 
              
            【实战练习        3-9】提取多项式的分子和分母 
             已知多项式        g1、g2,提取       g1 和  g2 多项式的分子和分母。 
             编程代码如下: 
              
             syms x y; 
             g1=x^2+2*x+1;  g2=3*x^2+7*x+10;  G=g1/g2; 
             [n,d]=numden(G) 
              
             结果: 
             n = x^2 + 2*x + 1  
             d = 3*x^2 + 7*x + 10 
              
            【实战练习        3-10】提取与展开三角函数多项式 
             展开三角函数多项式,并对展开的多项式提取其系数及变量。 

                                                                            第  3 章   符号与多项式运算                   71

 编程代码如下: 
  
 syms x y z;  
 f = sin(2*x)+cos(2*y) ;   
 f1 = expand(f) 
 f0 = (z+1)^8; f2 = expand(f0) 
 [p,x1]=coeffs(f2,'z') 
  
 结果: 
 f1 = 2*cos(x)*sin(x) + 2*cos(y)^2 - 1 
 f2 = z^8 + 8*z^7 + 28*z^6 + 56*z^5 + 70*z^4 + 56*z^3 + 28*z^2 + 8*z + 1 
 p =  [ 1, 8, 28, 56, 70, 56, 28, 8, 1] 
 x1= [ z^8, z^7, z^6, z^5, z^4, z^3, z^2, z, 1] 
  
【实战练习        3-11】合并同类项的应用 
 已知    g1、g2   的符号表达式,先计算它们的积和商,再合并同类项。 
 编程代码如下: 
  
 g1=sym('x^2+2*x+1'); g2=sym('x+1'); 
 G1=g1*g2 
 G2=g1/g2 
 R1=collect(G1)          %按符号合并同类项 
 R2=collect(G2) 
  
 结果: 
  
 G1 =     (x + 1)*(x^2 + 2*x + 1) 
 G2 =    (x^2 + 2*x + 1)/(x + 1) 
 R1 =    x^3 + 3*x^2 + 3*x + 1 
 R2 =    x + 1 
  
 说明:针对符号乘、除运算可以使用                        collect( )函数合并结果。 
 3.3.4  多项式化简 

 多项式化简语法格式: 
  
 simplify(S);         %对表达式                                   S 进行化简 
  
【实战练习        3-12】化简并计算简单多项式 
 化简下列表达式: 
                                abc444
                     w1 =++ 
                          ()()abac−−()()   bcba −−()()    cacb −−
                     wxx22sincos= ()  () 
 编程代码如下: 
  
 syms a b c x; 
 w1= a^4/((a-b)*(a-c))+b^4/((b-c)*(b-a))+c^4/((c-a)*(c-b));  
 w2=2*sin(x)*cos(x); 
 w11=simplify(w1) 
 w22=simplify(w2) 

 72         MATLAB 编程实战——手把手教你掌握                      300 个精彩案例 

             结果: 
              
             w11=a^2 + a*b + a*c + b^2 + b*c + c^2 
             w22=sin(2*x) 
              
            【实战练习        3-13】化简并计算复杂多项式 
             化简下列多项式: 

                                             fx1( )= e cab*log +
                                                     3 1612
                                             fx2( )=+++              8  
                                                       xx32x
                                             f 3(xxx )=+ sin22 ( ) cos ( )

             编程代码如下: 
              
             syms a b c x;  
             f1= exp(c*log(sqrt(a+b))); f2=(1/x^3+6/x^2+12/x+8)^(1/3); 
             f3 = sin(x)^2 + cos(x)^2 ; 
             y1 = simplify(f1);y2 = simplify(f2) ;y3= simplify(f3) 
              
             结果: 
              
             y1 =  (a + b)^(c/2) 
             y2 = ((2*x + 1)^3/x^3)^(1/3) 
             y3 = 1 
             3.3.5  表达式之间的转换 

             符号表达式与数值表达式之间的转换函数包括: 
            (1)利用函数         sym()可以将数值表达式转换成符号表达式。 
            (2)使用      eval()函数可以将符号表达式转换成数值表达式并计算。 
             例如:将符号表达式转换成数值表达式并计算。 
              
             s='sin(pi/4)+(1+sqrt(5))/2 ' 
             b=eval(s) 
              
             结果: 
              
             s =   sin(pi/4)+(1+sqrt(5))/2  
             b =   2.3251 
              
            【实战练习        3-14】多项式替换的应用 
             设  w1=((a+b)(a-b))2,在     w1 表达式中,使用           3 替换字符      a,使用    1、2   分别替换字符         a、b。 
             编程代码如下: 
              
             syms a b; 
             w1 = ((a+b)*(a-b))^2 
             w2 = subs(w1,a,3) 
             w3 = subs(w1,[a,b],[1,2]) 
              
             结果: 

                                                                                第  3 章   符号与多项式运算                   73

     w1 = (a + b)^2*(a - b)^2 
     w2 = (b - 3)^2*(b + 3)^2 
     w3 = 9 
     3.3.6  复合函数与反函数 

     若  f=f(x),自变量又是         x 的函数     g=g(y),求    f 对 y 的过程称为复合函数。 
     若  y=f(x),自变量又是          x 的函数    g=g(y),对于      g(f(x))都有唯一确定的          x,则计算       g(f(x))=x
称为反函数。 
     语法格式: 
      
     compose(f,g)                       %返回   f=f(x),g=g(y),复合函数           f(g(y))的运算。 
     g=finverse(f)                      %f 为符号函数表达式,g            为反函数,x       为单变量 
      
    【实战练习        3-15】复合函数及反函数的应用 
     已知:f=cos(x/t);y=sin(y/g);求         f(y)及反函数。 
     编程代码如下: 
      
     syms x y g t; 
     f=cos(x/t);  y=sin(y/g); 
     x1=compose(f,y) 
     f=log(x); 
     x2=finverse(f) 
      
     结果: 
      
     x1 =   cos(sin(y/u)/t) 
     x2 =   exp(x) 
     3.3.7  分数多项式通分 

     分数多项式通分的语法格式: 
      
     [N,D]=numden(f)        %f                       为分数多项式 
      
     说明:对分数多项式              f 通分,N     为通分后的分子,D            为通分后的分母。 
    【实战练习        3-16】分数多项式通分计算的应用 
                    xy+−35
     已知:     fx()=+              ,完成通分计算。 
                    y + 2   x2 +1
     编程代码如下: 
      
     syms x y;  
     f = (x+3)/(y+2)+(y-5)/(x^2+1); 
     [N,D]=numden(f) 
      
     结果: 
      
     N = x^3 + 3*x^2 + x + y^2 - 3*y - 7 
     D = (x^2 + 1)*(y + 2) 


     74       MATLAB 编程实战——手把手教你掌握                 300 个精彩案例 

       3.4  多项式求解(多项式方程求解) 

            多项式与多项式方程的区别是:令多项式为零就是多项式方程,因此求多项式的解也是
       求多项式方程的解。MATLAB              中多项式方程求解主要使用              roots()函数,其返回值包含了多项
       式参数的所有实数和虚数解;使用                 solve()函数主要用于求解多项式方程符号解;使用                    polyval()
       函数用于求多项式数值解。本节包括高次方程数值解、符号方程求解、微分方程求解及数据
       拟合。 
            3.4.1  多项式的特征值(多项式的解) 

            求多项式的解的语法格式: 
             
            r=roots(p)    
             
            使用命令     roots 可以求出多项式等于零的根,即该命令可以用于求高次方程的解。根用列
       向量表示。 
            3.4.2  特征多项式系数 

            求多项式系数的语法格式: 
             
            p=poly (r) 
             
            若已知多项式等于零的解,可使用                 poly 命令求出相应多项式系数。 
            说明: 
           (1)特征多项式一定是           n+1 维的。 
           (2)特征多项式第一个元素一定是                 1。 
           (3)若要生成实系数多项式,则根中的复数必定对应共轭,生成的多项式向量包含很小
       的虚部时可用 real 命令将其过滤掉。 
           【实战练习      3-17】求多项式的解及多项式系数 
            求方程   x4-12x 3+25x-16=0 的解,并根据解构造多项式系数。 
            编程代码如下: 
             
            p=[1 -12 0 25 -16]; 
            r=roots(p) 
            r1=real(r) 
            p=poly(r) 
             
            结果: 
             
            r = 11.8311 + 0.0000i 
                -1.6035 + 0.0000i 
                0.8862 + 0.2408i 
                0.8862 - 0.2408i 
            r1= 11.8311 
                -1.6035 

                                                                               第  3 章   符号与多项式运算                   75

         0.8862 
         0.8862 
     p = 1.0000  -12.0000    0.0000   25.0000  -16.0000 
     3.4.3  方程与方程组的符号解 

     求方程与方程组的符号解的语法格式: 
      
     solve(eq1, [x, y])    %使用                     solve()函数时,需要先定义变量为符号变量。 
      
     其中:eq1      是方程或方程组,[x,y]参数是未知数的符号变量。solve()函数返回的是一个结
构体数组,每个元素对应一个符号解。 
    【实战练习        3-18】求方程及方程组的数值解 
     已知:一元三次方程              x3+x2+x+1=0  和二元方程组 
                                            xy+=1
                                                       
                                            24xy−=
     分别求数值解。 
     编程代码如下: 
    (1)求一元方程解: 
      
     syms x                                               syms x 
     f=x^3+x^2+x+1==0;                       或            f1=x^3+x^2+x+1; 
     x=solve(f,x)                                         x=solve(f1)
      
     也可以使用句柄求解: 
      
     f = @(x) x.^3 + x.^2 + x +1; 
     x1 = solve(f,x) 
      
     结果: 
     x =  -1 
          -1i 
          1i 
      
    (2)求二元方程解: 
                                                          syms x y 
     syms x y 
                                                          [x,y]=solve(x+y-1,2*x-y-4) 
     [x,y]=solve(x+y==1,2*x-y==4,x,y)     或 
      
     结果: 
      
     x =     5/3 
     y =    -2/3 
      
    【实战练习        3-19】求微分方程的符号解 
     已知范德瓦尔斯气体的三个临界参量: 
                        aPP                    ∂∂2
                        PVbRT+−=()          ,,       =00         = 
                             VV22∂V                             ∂
                                               T           T

     求  PVccc,, T的值。 

     76         MATLAB 编程实战——手把手教你掌握                      300 个精彩案例 

             编程代码如下: 
              
             clc;clear all; 
             syms a b R T V 
             P = R*T/(V-b) - a/V^2 
             D1 = diff(P,V) 
             D2 = diff(D1,V) 
             S  = solve(D1,D2,V,T) 
             Pc = subs(P,[V,T],[S.V,S.T]) 
             Vc = S.V 
             Tc = S.T 
              
             结果: 
              
             Pc =  a/(27*b^2) 
             Vc =   3*b 
             Tc =   (8*a)/(27*R*b) 
              
            【实战练习        3-20】求方程组的符号解 
                    ax−= by 1
             已知                ,求方程组的符号解。
                  {ax+= by   5                          

             a,b,x,y 均为符号运算量。在符号运算前,应先将                          a,b,x,y 定义为符号运算量。 
             编程代码如下: 
              
             syms a b x y; 
             [x,y]=solve(a*x-b*y-1,a*x+b*y-5,x,y)                   %以  a,b  为符号常数,x,y        为符号变量 
              
             结果: 
              
             x =3/a 
             y =2/b 
              
            【实战练习        3-21】求复数乘积多项式的解 
             已知一个复数表达式为:z=x+i*y,试求其共轭复数,并求该表达式与其共轭复数乘积的
        多项式。 
             为了使乘积表达式            x2+y2 非负,这里把变量            x 和  y 定义为实数。 
             编程代码如下: 
              
             x=sym('x','real');      %x                           为实数 
             y=sym('y','real');      %y                           为实数 
             z=x+i*y;         %定义复数表达式 
             z1=conj(z)         %求共轭复数 
             z2=expand(z*conj(z))      %求表达式与其共轭复数乘积的多项式 
             [a,b]=solve(z2) 
              
             结果: 
              
             z1 =x - y*1i 
             z2 =x^2 + y^2 
             a= 0 
             b= 0 

                                                                       第  3 章   符号与多项式运算                77

     说明:若要去掉        x 的属性,可以使用下面的语句: 
      
     x = sym('x', 'unreal')     %表示将                    x 创建为纯格式的符号变量 
     3.4.4  多项式数值解 

     在 MATLAB   中,多项式在某个参数下的求值用                  polyval()函数,其功能是求多项式在给定
参数下的值。 
     语法格式: 
      
     polyval(p,n)        %返回多项式                            p 在 n 点的值 
      
     利用多项式求值函数可以求得多项式在某一点的值。 
     例如:求方程       y=-0.0602x2+1.7020x+0.3096 在 x 等于  0,0.2,…,5     时的函数值。 
      
     p = [-0.0602,1.702, 0.3096]; 
     xi = linspace(0,1,6); 
     z = polyval(p,xi) 
      
     结果: 
      
     z =   0.3096   0.6476   0.9808   1.3091   1.6327   1.9514 
      
     说明:p    代表的多项式在        xi 的每一个元素处的值,x           可以是一个向量或矩阵。 
    【实战练习      3-22】求多项式指定的数值解 
     求多项式     p=3x4+8x3+18x2+16x+15 在 x=[1,2,3,4,5]的解。 
     编程代码如下: 
      
     p1=[3,8,18,16,15]; 
     x=[ 1,2,3,4,5] 
     p=polyval(p1,x) 
      
     结果:P=    60         231         684        1647       34203 
     3.4.5  多项式拟合 

     多项式拟合是一种数学技术,实际应用中可以用来拟合多种类型的数据,例如统计数据、
科学数据和经济数据等。多项式拟合的基本原理是使用一组多项式函数来拟合一组数据,以便
更好地理解数据变化趋势。 
     语法格式: 
      
     y=polyfit(x,y,n)        %拟合唯一确定                     n 阶多项式的系数 
      
     其中:n    表示多项式最高阶数,x、y              为将要拟合的数据,它是用数组的方式输入,输出
                         n     n-1
参数   y 为拟合多项式       y=anx +an-1x +…+a1x+a0,共     n+1 个系数。n=1     为拟合直线;polyfit      只
适合形如     y = a[k]*x^k + a[k-1]*x^(k-1) +…  + a[1]*x + a[0]的完全一元多项式数据拟合。 
    【实战练习      3-23】温度值的直线拟合 
     使用多项式拟合函数拟合深圳               2023 年 3 月 18 日一天从     12 点到   19 点温度为直线。 


     78         MATLAB 编程实战——手把手教你掌握                      300 个精彩案例 

             时间:12     点—19    点每隔     1 个小时采集一
        次温度如下。 
             温度:25℃,24℃,24℃,25℃,24℃,
        23℃,23℃,22℃。 
             编程代码如下:
                               
             clc; 
             x=12:19; 
             y=[25,24,24,25,24,23,23,22]; 
             a=polyfit(x,y,1) 
             y1=polyval(a,x); 
             plot(x,y,'bp',x,y1,'r-'); 
                       温度直线拟合
              title("               ");                                                                   
             多项式拟合直线如图              3.1 所示。                           图  3.1  多项式拟合直线 
            【实战练习        3-24】求多项式的          2 阶和   4 阶拟合 
             对  2 阶多项式      x2+x-30  分别进行      2 阶和    4 阶拟合。 

              编程代码如下: 
             x=-5:0.5:5; 
             R=sqrt(2*x.^2); 
             y=x.^2-x-30; 
             a=polyfit(x,y,2);                                      %2 阶拟合 
             b=polyfit(x,y,4);                                      %4 阶拟合 
             y1=polyval(a,x); 
             y2=polyval(b,x); 
             subplot(1,2,1);plot(x,y,'bp',x,y1,'r-'); 
             title("多项式       x^2-x-30   的 2 阶拟合"); 
             subplot(1,2,2);plot(x,y,'bp',x,y2,'r-'); 
              title("多项式      x^2-x-30   的 4 阶拟合"); 
             2 阶和   4 阶多项式拟合曲线如图               3.2 所示。 


                                                                                                
                                      图  3.2  2 阶和   4 阶多项式拟合结果曲线 

                                                                                第  3 章   符号与多项式运算                   79

    【实战练习        3-25】求多项式的曲线拟合 
     设数组     y=[-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2],在横坐标        0~1 对  y 进
行  2 阶多项式拟合,并画图表示拟合结果。 
     编程代码如下: 
      
      y=[-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; 
      x=0:0.1:1; 
      y1=polyfit(x,y,2);    %进行                         2 阶拟合 
      z=polyval(y1,x);     %计算                          y1 为系数向量对        x 点的函数值 
      plot(x,y,'r*',x,z,'b-') ;                   %“*”为原数据点,曲线为拟合结果 
      
     结果: 
     2 阶多项式拟合曲线如图               3.3 所示。 
     plot()函数使用方法见          6.1 节。 


                                                                           
                                  图 3.3  2 阶多项式拟合结果曲线 

3.5  多项式求导 

     多项式求导是在数学中常见的一种操作,它可以计算出多项式的导函数。计算多项式的
导函数时,需要对每一项分别进行求导,并                          根据求导规则将各项相加即可得到导函数。由于多
项式是连续函数,它是平滑的,其导数必定也是多项式。 
     3.5.1  多项式直接求导数 

     多项式直接求导数的语法格式: 
      
     k=polyder(p):                           %返回多项式       p 的 1 阶导数系数 
     k=polyder(p,q):                         %返回多项式       p 与 q 乘积的    1 阶导数系数 
     [k,d]=polyder(p,q):                     %返回   p/q 的导数,k       是分子,d      是分母 

     80         MATLAB 编程实战——手把手教你掌握                      300 个精彩案例 

            【实战练习        3-26】多项式求导的应用 
             已知    p1=3x3+5x2+7,p2=2x2+5x+3,求         p1 导数、p1     与  p2 乘积和     p1 与  p2 商的导数。 
             编程代码如下: 
              
             clc; 
             p1=[3 5 0 7]; p2=[0 2 5 3]; 
             pp1=polyder(p1) 
             pp2=polyder(p1,p2)        %等价                           pp2=polyder(conv(p1,p2)) 
             disp("多项式      p1  的导数"); 
             poly2sym(pp1) 
             disp("多项式 p1       与  p2 乘积的导数"); 
             poly2sym(pp2) 
              
             结果: 
              
             pp1 =    9    10     0 
             pp2 =   30   100   102    58    35 
             多项式     p1 的导数 
             ans=  9*x^2 + 10*x 
             多项式 p1     与  p2 乘积的导数 
             ans=  30*x^4 + 100*x^3 + 102*x^2 + 58*x + 35 
             3.5.2  插值、拟合多项式并求导 

             当已知函数在一些离散点上的函数值时,该函数可用插值或拟合多项式来近似,然后对
        多项式进行微分求得导数,函数求导主要是研究函数值随自变量变化而变化的趋势。 
             语法格式: 
             polyfit(x-xn,y ,length(x)-1);    %xn                       表示   x 某一点的值 
              
            【实战练习        3-27】插值、拟合多项式并求导数 
             通过实验测试,得到某数据集合为: 
             X: 0~5 
             Y: 0.3200 0.5720 0.7012 0.8132 0.9013 0.9616 
             要求:计算        x= 5 处的各阶导数。 
             编程代码如下: 
              
             clc;clear; 
             x=0:5; 
             y=[0.3200      0.5720 0.7012 0.8132 0.9013 0.9616];                   %原数据点 
             xn=3;             %指定坐标点 
             L=length(x);           %得到数据长度 
             dd=polyfit(x-xn,y,L-1);                 %进行多项式拟合,(x-xn,y)为坐标,(L-1)为长度 
             fact=[1]; 
             for k=1:L-1; 
                 fact=[factorial(k),fact];       %进行微分求导数 
             end 

                                                                           第  3 章   符号与多项式运算                   81

diffder=dd.*fact    %计算拟合点 
plot(x,y,"b*",x,diffder);               %“*”号为原数据点,曲线为拟合多项式导数 
 
结果为: 
 
diffder =    0.1151    0.0028   -0.0341   -0.0241    0.1048    0.8132 
 
原数据点与拟合多项式求导结果如图                        3.4 所示。 


                                                                        
                         图  3.4  原数据点与拟合多项式求导结果