![MATLAB/Simulink权威指南:开发环境、程序设计、系统仿真与案例实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/629/27111629/b_27111629.jpg)
4.1 多项式
多项式在代数中占有重要的地位,广泛用于数据插值、数据拟合和信号与系统等应用领域。MATLAB提供了多项式的创建和各种多项式的运算方法,处理起来非常简单方便。
4.1.1 多项式的创建
一个多项式按降幂排列为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P155_29065.jpg?sign=1738884439-dZgZAVLwNIEyO5DOW0uO6d1w7gXwduo1-0-c06e5c50f70afe41209481c9004eb95e)
在MATLAB中多项式的各项系数用一个行向量表示,使用长度为n+1的行向量按降幂排列,多项式中某次幂的缺项用0表示,则表示为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P155_29067.jpg?sign=1738884439-EAefuJGqaqHQX89RPwgM881xv0PraW0C-0-80945927aa0545fb31e4c997223c0434)
例如,多项式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函数实现,其调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P155_29068.jpg?sign=1738884439-v92BZSsNySW9mctSgds0NAsHevPAlfMH-0-19a08bc6f7cbe6a767685e063ed7e62d)
其中,f=poly2str(p,'x')表示创建一个系数为p,变量为x的字符串型多项式;f=poly2sym(p)表示创建一个系数为p,默认变量为x的符号型多项式。两者在命令窗口的显示形式类似,但数据类型是不一样的,一个是字符串型,另一个是符号型。
【例4-1】 已知多项式系数为p=[1,﹣2,4,6],分别用poly2str(p,'x')和poly2sym(p)创建多项式,比较它们有什么不同。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P156_29069.jpg?sign=1738884439-KwfGiL8Ch8KiFrl8SFijATsEfEKLjOLa-0-31c241c855f80b4c97f37f3e92fa812f)
显然,两种函数创建的多项式f1和f2显示形式类似,但数据类型和大小都不一样,如图4-1所示。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P156_10145.jpg?sign=1738884439-WG65MTFSCRtvy2mAG3tljJcUfAO7Vrng-0-f37c6337d4ef3efa51daefc48ce4c4fb)
图4-1 两种多项式的比较
4.1.2 多项式的值和根
1.多项式的值
在MATLAB里,求多项式的值可以用polyval和polyvalm函数。它们的输入参数都是多项式系数和自变量,两者区别是前者是代数多项式求值,后者是矩阵多项式求值。
1)代数多项式求值
polyval函数可以求代数多项式的值,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P156_29070.jpg?sign=1738884439-Rmhjcb17AzOYUBgfVezk2gDDs8Do3q3f-0-a8afb857083421f82c0b7da8c6be3043)
其中,p为多项式的系数,x为自变量,当x为一个数值,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵的每个元素求多项式的值。
【例4-2】 已知多项式为f(x)=x3﹣2x2+4x+6,分别求x1=2和x=[0,2,4,6,8,10]向量的多项式的值。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P157_29072.jpg?sign=1738884439-wrFl8TluBNAEU8rFal3aSRB5LV84YGcI-0-8448b3c304f84fb5d697c76c8b89b7dc)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P157_29073.jpg?sign=1738884439-Axl655CpyS3KKUn6A7i371TMvfGYuuph-0-bd0ee543e7138e158d588d0b65ec3838)
2)矩阵多项式求值
polyvalm函数以矩阵为自变量求多项式的值,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P157_29074.jpg?sign=1738884439-1geloa8pwXNfHDuJT8hJYfCuw1dMnWWy-0-9a8c374cb71aadc14bd683f9469d4417)
其中,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函数,求的多项式的值。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P157_29080.jpg?sign=1738884439-ta3s8Jam5lNwy4V4gxyoITvYgD6nXg56-0-91920044edffcbbfe6d4e5788264f1b5)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P157_29081.jpg?sign=1738884439-8QCSc6G71Dn25wHULr7gH1EhrLbeMOfj-0-26055bb11be85af946aabd455e380e84)
2.多项式的根
一个n次多项式有n个根,这些根有实根,也有可能包含若干对共轭复根。MATLAB提供了roots函数用于求多项式的全部根,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P158_29082.jpg?sign=1738884439-krD9yDXE7ONOVMr1s08VaT71C2Xr9bVQ-0-74dc6b170c2b477625c3ba4afa95f970)
其中,p为多项式的系数向量,r为多项式的根向量,r(1),r(2),…,r(n)分别表示多项式的n个根。
MATLAB还提供了一个由多项式的根,求多项式的系数的函数poly,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P158_29084.jpg?sign=1738884439-dirBM2eiv513MkMDEoCEZEiTRjAG3xfF-0-f4b620e1b0afdc99920ad1a0a872d81e)
其中,r为多项式的根向量,p为由根r构造的多项式系数向量。
【例4-4】 已知多项式为f(x)=x4+4x3﹣3x+2。
(1)用roots函数求该多项式的根r。
(2)用poly函数求根为r的多项式系数。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P158_29086.jpg?sign=1738884439-kxyaVbLj57pxGZ5GJiX3fMLSYo3hJgHm-0-80ac53e80eaca556c90dd02ce93646a5)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P158_29087.jpg?sign=1738884439-bxmnmDjsoxG9F8ZTgK6Z0IhHiDug4hY3-0-2d17541ea0dd879931e3260b895ed6ec)
显然,roots和poly函数的功能正好相反。
4.1.3 多项式的四则运算
多项式之间可以进行四则运算,其结果仍为多项式。在MATLAB中,用多项式系数向量进行四则运算,得到的结果仍为多项式系数向量。
1.多项式的加减运算
MATLAB没有提供多项式加减运算的函数。事实上多项式的加减运算,是合并同类型,可以用多项式系数向量相加减运算。如果多项式阶次不同,则把低次多项式系数不足的高次项用0补足,使得多项式系数矩阵具有相同维度,以便进行加减运算。
2.多项式乘法运算
在MATLAB中,两个多项式的乘积可以用函数conv实现。其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P159_29088.jpg?sign=1738884439-Dm0iAUiylLRzqRGl4Q81znU17K2IGxop-0-bedda5af0a29f4f33a0fe9c7ea639ae9)
其中,p1和p2是两个多项式的系数向量;p是两个多项式乘积的系数向量。
3.多项式除法运算
MATLAB可以用函数deconv实现两个多项式的除法运算。其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P159_29090.jpg?sign=1738884439-9EApWczqcEWy4aEOvkJvXfA6orbdqm2z-0-64fb11d550b11a924e9ee1ef5b2dbe7d)
其中,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)的结果。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P159_29092.jpg?sign=1738884439-0FCR9EJJbMjh2hIqt14NuRCmc5YObmKM-0-f1440386580f788b60fbf03c4e54a48b)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P159_29093.jpg?sign=1738884439-T45VLwrKJ5zbo3jQmAUgHtv7pPutTU75-0-2a2032cedcd069390aa43c1fb11023c1)
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函数可以对单个多项式求导,也可以对两个多项式乘积和商求导,其调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P160_29095.jpg?sign=1738884439-r1UrnMyxmOgSHvrWdQIyqHsW4YhirAkP-0-879d1bf5da5f265d36ff3b90a1bd181e)
【例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)的导数。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P160_29096.jpg?sign=1738884439-SVy7OiDAtwyRMd1who3RqFulryynkC1c-0-d83dba92f571444fee65bc478f844aaf)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P160_29097.jpg?sign=1738884439-vQfbJOnJmIosuehB8ReBzZQtIljYGWwz-0-c4b685f2ba08b16fcb8197d6fbcf1272)
2.多项式的积分
对于n阶多项式p(x)=anxn+an﹣1xn﹣1+…+a1x1+a0,其不定积分为n+1阶多项式,其中k为常数项。原多项式和积分多项式分别可以表示为系数向量p=[an,an﹣1,…,a1,a0],I=
。
在MATLAB中,提供了polyint函数用于多项式的积分。其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P161_29102.jpg?sign=1738884439-otKkOOTdX8hxT6e56NCEwP6L74FWD3rB-0-1b6e56cca2bb646b1feafdc5ff0c4182)
显然polyint是polyer的逆函数,即有p=polyder(I)。
【例4-7】 求多项式的积分I=∫(x4+4x3﹣3x+2)dx。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P161_29103.jpg?sign=1738884439-wJnbj9S6x60zS6YmmqE82O7FeJNZ445F-0-a42b00aaa60c9b772404c464dcd1c615)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P161_29104.jpg?sign=1738884439-EBDVFyjjazXKpSpFP4kylGqfQx9vmcag-0-d2f954583276ae4826a963ee0b13dd88)
4.1.5 多项式的部分分式展开
由分子多项式B(s)和分母多项式A(s)构成的分式表达式进行多项式的部分分式展开,表达式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P161_29106.jpg?sign=1738884439-YYQ4NHp5xZuljfxr5TbeM4vtqte0ciTo-0-e309d0232dc4e9b9c0f2782b7799ad05)
MATLAB可以用residue函数实现多项式的部分分式展开,residue函数的调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P162_29107.jpg?sign=1738884439-SaCOJx61H0Tp5Zy6gOdNe4wNRoPEnUZ8-0-e2ae4c3a73f16353e089bc99b364450f)
其中,B为分子多项式系数行向量;A为分母多项式系数行向量;[p1;p2;…;pn]为极点列向量;[r1;r2;…;rn]为零点列向量;k为余式多项式行向量。
residue函数还可以将部分分式展开式转换为两个多项式的除的分式,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P162_29109.jpg?sign=1738884439-zH68l2Irt9RevwresPRfj9qgUh8UFlOO-0-521d2caeb7eb980011d92824bf0b32f6)
【例4-8】 已知分式表达式为。
(1)求f(s)的部分分式展开式。
(2)将部分分式展开式转换为分式表达式。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P162_29112.jpg?sign=1738884439-8CaqzL8McyWo2G8xFMWEO1w3MbxGUOCn-0-6dac957aca77b7650df064c6d5aee9cb)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P162_29113.jpg?sign=1738884439-q64QTE2s9sMRXQ8wMya0Pe2SrgCPUA5M-0-5ee330ed37ba6da3175af004f2e89a1c)