4.1 多项式

多项式在代数中占有重要的地位,广泛用于数据插值、数据拟合和信号与系统等应用领域。MATLAB提供了多项式的创建和各种多项式的运算方法,处理起来非常简单方便。

4.1.1 多项式的创建

一个多项式按降幂排列为

在MATLAB中多项式的各项系数用一个行向量表示,使用长度为n+1的行向量按降幂排列,多项式中某次幂的缺项用0表示,则表示为

例如,多项式p1x)=x3﹣2x2+4x+6,在MATLAB中可以表示为p1=[1,﹣2,4,6];p2x)=x3+3x+6可表示为p2=[1,0,3,6]。

在MATLAB中,创建一个多项式,可以用poly2str和poly2sym函数实现,其调用格式如下:

其中,f=poly2str(p,'x')表示创建一个系数为p,变量为x的字符串型多项式;f=poly2sym(p)表示创建一个系数为p,默认变量为x的符号型多项式。两者在命令窗口的显示形式类似,但数据类型是不一样的,一个是字符串型,另一个是符号型。

【例4-1】 已知多项式系数为p=[1,﹣2,4,6],分别用poly2str(p,'x')和poly2sym(p)创建多项式,比较它们有什么不同。

程序代码如下:

显然,两种函数创建的多项式f1和f2显示形式类似,但数据类型和大小都不一样,如图4-1所示。

图4-1 两种多项式的比较

4.1.2 多项式的值和根

1.多项式的值

在MATLAB里,求多项式的值可以用polyval和polyvalm函数。它们的输入参数都是多项式系数和自变量,两者区别是前者是代数多项式求值,后者是矩阵多项式求值。

1)代数多项式求值

polyval函数可以求代数多项式的值,其调用格式为

其中,p为多项式的系数,x为自变量,当x为一个数值,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵的每个元素求多项式的值。

【例4-2】 已知多项式为fx)=x3﹣2x2+4x+6,分别求x1=2和x=[0,2,4,6,8,10]向量的多项式的值。

程序代码如下:

程序运行结果:

2)矩阵多项式求值

polyvalm函数以矩阵为自变量求多项式的值,其调用格式为

其中,p为多项式系数,X为自变量,要求为方阵。

MATLAB用polyvalm和polyval函数求多项式的值是不一样的,因为运算规则不一样。例如,假设A为方阵,p为多项式x2﹣5x+6的系数,则polyvalm(p,A)表示A∗A﹣5∗A+6∗eye(size(A)),而polyval(p,A)表示A∗A﹣5∗A+6∗ones(size(A))。

【例4-3】 已知多项式为fx)=x2﹣3x+2,分别用polyvalm和polyval函数,求的多项式的值。

程序代码如下:

程序运行结果:

2.多项式的根

一个n次多项式有n个根,这些根有实根,也有可能包含若干对共轭复根。MATLAB提供了roots函数用于求多项式的全部根,其调用格式为

其中,p为多项式的系数向量,r为多项式的根向量,r(1),r(2),…,r(n)分别表示多项式的n个根。

MATLAB还提供了一个由多项式的根,求多项式的系数的函数poly,其调用格式为

其中,r为多项式的根向量,p为由根r构造的多项式系数向量。

【例4-4】 已知多项式为fx)=x4+4x3﹣3x+2。

(1)用roots函数求该多项式的根r

(2)用poly函数求根为r的多项式系数。

程序代码如下:

程序运行结果:

显然,roots和poly函数的功能正好相反。

4.1.3 多项式的四则运算

多项式之间可以进行四则运算,其结果仍为多项式。在MATLAB中,用多项式系数向量进行四则运算,得到的结果仍为多项式系数向量。

1.多项式的加减运算

MATLAB没有提供多项式加减运算的函数。事实上多项式的加减运算,是合并同类型,可以用多项式系数向量相加减运算。如果多项式阶次不同,则把低次多项式系数不足的高次项用0补足,使得多项式系数矩阵具有相同维度,以便进行加减运算。

2.多项式乘法运算

在MATLAB中,两个多项式的乘积可以用函数conv实现。其调用格式为

其中,p1和p2是两个多项式的系数向量;p是两个多项式乘积的系数向量。

3.多项式除法运算

MATLAB可以用函数deconv实现两个多项式的除法运算。其调用格式为

其中,q为多项式p1除以p2的商式;r为多项式p1除以p2的余式。q和r都是多项式系数向量。

deconv是conv的逆函数,即满足p1=conv(p2,q)+r。

【例4-5】 已知两个多项式为fx)=x4+4x3﹣3x+2,gx)=x3﹣2x2x

(1)求两个多项式相加fx)+gx)和两个多项式相减fx)﹣gx)的结果。

(2)求两个多项式相乘fx)×gx)和两个多项式相除fx)/gx)的结果。

程序代码如下:

程序运行结果:

4.1.4 多项式的微积分运算

1.多项式的微分

对于n阶多项式px)=anxnan﹣1xn﹣1+…+a1x1a0的求导,其导数为n﹣1阶多项式dpx)=nanxn﹣1+(n﹣1)an﹣1xn﹣2+…+a1。原多项式及其导数多项式的系数分别为p=[anan﹣1,…,a1a0],d=[nan,(n﹣1)an﹣1,…,a1]。

在MATLAB中,可以用polyder函数来求多项式的微分运算,polyder函数可以对单个多项式求导,也可以对两个多项式乘积和商求导,其调用格式如下:

【例4-6】 已知两个多项式为fx)=x4+4x3﹣3x+2,gx)=x3﹣2x2x

(1)求多项式fx)的导数。

(2)求两个多项式乘积fx)∗gx)的导数。

(3)求两个多项式相除gx)/fx)的导数。

程序代码如下:

程序运行结果:

2.多项式的积分

对于n阶多项式px)=anxnan﹣1xn﹣1+…+a1x1a0,其不定积分为n+1阶多项式,其中k为常数项。原多项式和积分多项式分别可以表示为系数向量p=[anan﹣1,…,a1a0],I=

在MATLAB中,提供了polyint函数用于多项式的积分。其调用格式为

显然polyint是polyer的逆函数,即有p=polyder(I)。

【例4-7】 求多项式的积分I=∫(x44x33x+2)dx

程序代码如下:

程序运行结果:

4.1.5 多项式的部分分式展开

由分子多项式B(s)和分母多项式A(s)构成的分式表达式进行多项式的部分分式展开,表达式如下:

MATLAB可以用residue函数实现多项式的部分分式展开,residue函数的调用格式如下:

其中,B为分子多项式系数行向量;A为分母多项式系数行向量;[p1;p2;…;pn]为极点列向量;[r1;r2;…;rn]为零点列向量;k为余式多项式行向量。

residue函数还可以将部分分式展开式转换为两个多项式的除的分式,其调用格式为

【例4-8】 已知分式表达式为

(1)求fs)的部分分式展开式。

(2)将部分分式展开式转换为分式表达式。

程序代码如下:

程序运行结果: