- MATLAB/Simulink权威指南:开发环境、程序设计、系统仿真与案例实战
- 徐国保 张冰 石丽梅 吴凡
- 2359字
- 2021-03-24 02:07:22
4.1 多项式
多项式在代数中占有重要的地位,广泛用于数据插值、数据拟合和信号与系统等应用领域。MATLAB提供了多项式的创建和各种多项式的运算方法,处理起来非常简单方便。
4.1.1 多项式的创建
一个多项式按降幂排列为
在MATLAB中多项式的各项系数用一个行向量表示,使用长度为n+1的行向量按降幂排列,多项式中某次幂的缺项用0表示,则表示为
例如,多项式p1(x)=x3﹣2x2+4x+6,在MATLAB中可以表示为p1=[1,﹣2,4,6];p2(x)=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】 已知多项式为f(x)=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】 已知多项式为f(x)=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】 已知多项式为f(x)=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】 已知两个多项式为f(x)=x4+4x3﹣3x+2,g(x)=x3﹣2x2+x。
(1)求两个多项式相加f(x)+g(x)和两个多项式相减f(x)﹣g(x)的结果。
(2)求两个多项式相乘f(x)×g(x)和两个多项式相除f(x)/g(x)的结果。
程序代码如下:
程序运行结果:
4.1.4 多项式的微积分运算
1.多项式的微分
对于n阶多项式p(x)=anxn+an﹣1xn﹣1+…+a1x1+a0的求导,其导数为n﹣1阶多项式dp(x)=nanxn﹣1+(n﹣1)an﹣1xn﹣2+…+a1。原多项式及其导数多项式的系数分别为p=[an,an﹣1,…,a1,a0],d=[nan,(n﹣1)an﹣1,…,a1]。
在MATLAB中,可以用polyder函数来求多项式的微分运算,polyder函数可以对单个多项式求导,也可以对两个多项式乘积和商求导,其调用格式如下:
【例4-6】 已知两个多项式为f(x)=x4+4x3﹣3x+2,g(x)=x3﹣2x2+x。
(1)求多项式f(x)的导数。
(2)求两个多项式乘积f(x)∗g(x)的导数。
(3)求两个多项式相除g(x)/f(x)的导数。
程序代码如下:
程序运行结果:
2.多项式的积分
对于n阶多项式p(x)=anxn+an﹣1xn﹣1+…+a1x1+a0,其不定积分为n+1阶多项式,其中k为常数项。原多项式和积分多项式分别可以表示为系数向量p=[an,an﹣1,…,a1,a0],I=。
在MATLAB中,提供了polyint函数用于多项式的积分。其调用格式为
显然polyint是polyer的逆函数,即有p=polyder(I)。
【例4-7】 求多项式的积分I=∫(x4+4x3﹣3x+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)求f(s)的部分分式展开式。
(2)将部分分式展开式转换为分式表达式。
程序代码如下:
程序运行结果: