本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。
本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com
本章将介绍如何使用MATLAB来解决一些基本的数学运算问题,主要包括多项式的相关计算,数据插值,曲线拟合以及数据统计处理等相关的内容。本章的主要内容如下:
- 多项式
- 数据插值
- 曲线拟合
- 数据统计处理
- 离散傅立叶变换
5.1 多项式
在MATLAB中,多项式是以行向量的形式存放的,并且约定多项式以降幂的形式出现,如果多项式中缺少某幂次项,则该幂次项的系数为0。例如,多项式可以表示为:p1=[1 21 20 0],其中常数项为0。
本节将全面介绍与多项式有关的各种计算,包括多项式的四则运算、导函数运算、求值、求根以及分部展开。
5.1.1 多项式的四则运算
多项式的加减运算并无特别,可以使用向量的加减运算实现。多项式的乘除运算比较复杂,为此MATLAB提供了专门的运算函数conv
和deconv
。
函数conv
用于求多项式P1和P2的乘积,它的调用格式如下:
conv(P1,P2)
其中,P1、P2是两个多项式系数向量。
函数deconv
用于对多项式P1和P2作除法运算,它的调用格式如下:
[Q,r]=deconv(P1,P2)
其中,Q返回多项式P1除以P2的商式,r返回P1除以P2的余式。返回的Q和r仍是多项式系数向量。
可以将除法运算deconv看作是乘法运算conv的逆运算,即有P1=conv(P2,Q)+r。
下面通过示例介绍多项式的表示和多项式的四则运算。
【例5.1】多项式的表示及其乘法运算
在命令窗口中输入两个多项式的系数向量p1和p2,如下所示:
>> p1=[1 8 0 0 -10]
>> p2=[2 -1 3]
上面两个系数向量表示的多项式并不直观,为了比较直观的查看多项式MATLAB提供了函数poly2str,该函数的功能是以用户比较习惯的方式显示多项式。
例如使用函数poly2str显示系数向量p1和p2所代表的多项式。在命令窗口中输入以下内容:
>> poly2str(p1,'x') %以比较习惯的方式显示多项式
返回p1代表的多项式的形式如下:
ans =
x^4 + 8 x^3 – 10
同样,在命令窗口中输入以下内容:
>> poly2str(p2,'x') %以比较习惯的方式显示多项式
返回p2代表的多项式的形式如下:
ans =
2 x^2 - 1 x + 3
熟悉多项式的表示方法后,接着使用函数conv求多项式p1和p2的乘积。在命令窗口输入以下内容:
>>y= conv(p1,p2)
函数conv计算的结果如下:
y =
2 15 -5 24 -20 10 -30
使用函数poly2str显示多项式p1和p2相乘后生成的新多项式,如下所示:
>> poly2str(y,'x') %以比较习惯的方式显示多项式
ans =
2 x^6 + 15 x^5 - 5 x^4 + 24 x^3 - 20 x^2 + 10 x - 30
【例5.2】多项式的除法运算
在命令窗口中输入多项式系数向量p3和p4,如下所示:
>> p3=[2 6 8 0 5 9 4];
>> p4=[4 8 0 0 0 3 6];
对多项式p3和p4作除法运算,其中多项式p3除以p4的商式保存在Q中,p3除以p4的余式保存在r中。返回的Q和r仍是多项式系数向量。在命令窗口中输入以下内容:
>> [Q,r]=deconv(p3,p4) %多项式的除法运算
返回结果如下:
Q =
0.5000
r =
0 2.0000 8.0000 0 5.0000 7.5000 1.0000
5.1.2 多项式的导函数
MATLAB提供了polyder函数,用于求多项式的导函数。该函数的格式如下:
p=polyder(P) 求多项式P的导函数多项式
p=polyder(P,Q) 求多项式P与多项式Q乘积的导函数多项式
[p,q]=polyder(P,Q) 求多项式P与多项式Q相除的导函数,导函数的分子存入p,分母存入q
其中,参数P和Q是多项式的系数向量,返回结果p和q也是多项式的系数向量。
【例5.3】求多项式的导函数多项式
在命令窗口中输入多项式系数向量p3和p4,如下所示:
>> p3=[2 6 8 0 5 9 4];
>> p4=[4 8 0 0 0 3 6];
①求多项式p3的导函数多项式。在命令窗口中输入以下内容:
>> p=polyder(p3) %多项式p3的导函数多项式
返回系数向量如下:
p =
12 30 32 0 10 9
②求多项式p3与p4乘积的导函数多项式。在命令窗口中输入以下内容:
>> k=polyder(p3,p4) %多项式p3与p4乘积的导函数多项式
返回系数向量如下:
k =
96 440 800 576 160 574 708 460 192 45 114 66
③求多项式p3与p4相除的导函数多项式。在命令窗口中输入以下内容:
>> [g,h]=polyder(p3,p4) %多项式p3与p4相除的导函数多项式
返回系数向量g和h如下:
g =
-8 -64 -64 -80 -270 -240 92 192 15 60 42
h =
16 64 64 0 0 24 96 96 0 0 9 36 36
5.1.3 多项式的求值
MATLAB提供了两种求多项式值的函数:polyval与polyvalm,它们的输入参数均为多项式系数向量P和自变量x,但是两者是有很大区别的,前者是按数组运算规则对多项式求值,而后者是按矩阵运算规则对多项式求值。具体的调用格式如下所示。
Y=polyval(P,x) 若x为一数值,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵中的每个元素求其多项式的值
Y=polyvalm(P,x) 要求x为方阵或数值,它以方阵为自变量求多项式的值
注意:(1)polyvalm函数用来求矩阵多项式的值,其调用格式与polyval相同,但含义不同。例如,设A为方阵,P代表多项式,那么polyvalm(P,A)的含义是:AAA-5AA+8eye(size(A)),而polyval(P,A)的含义是:A.A.A-5A.A+8*ones(size(A))。
(2)函数polyvalm的参数x必须为方阵或数值,否则计算会提示错误信息,无法计算。
【例5.4】多项式的求值
在命令窗口中输入多项式的系数向量p3和矩阵A,如下所示:
>> p3=[2 6 8 0 5 9 4] %生成多项式系数
>> A=rand(3) %生成随机矩阵
①使用函数polyval按数组运算规则求A中的每个元素对于多项式p3的值。在命令窗口中输入如下内容:
>> Y=polyval(p3,A)
运算结果如下:
Y =
7.2917 15.2885 5.4763
5.8986 7.2672 15.8387
5.9409 11.3612 8.3376
②使用函数polyvalm按矩阵运算规则求以方阵A为自变量的多项式p3的值。在命令窗口中输入如下内容:
>> Y1=polyvalm(p3,A)
运算结果如下:
Y1 =
13.6694 21.1448 16.7431
8.7641 22.5846 21.5403
8.4161 19.5396 22.2629
③如果函数polyval和polyvalm的第二个参数为数值,仍然可以按照数组和矩阵的运算规则计算求多项式在该参数下的结果。在命令窗口中输入如下内容:
>> A=3
分别使用函数polyval和polyvalm计算多项式的值,具体操作及返回结如下:
>> Y=polyval(p3,A)
Y =
3640
>> Y1=polyvalm(p3,A)
Y1 =
3640
④如果函数ployval和ployvalm的第二个参数为一向量,前者按照数组运算规则仍然可以计算求多项式在该参数下的结果,但是后者按矩阵运算规则计算则会提示错误信息。在命令窗口中输入如下内容:
>> p4=[4 8 0 0 0 3 6]
分别使用函数polyval和polyvalm计算多项式的值,具体操作及返回结果如下:
>> Y=polyval(p3,p4) %第二个参数为向量
Y =
16504 754060 4 4 4 3640 150574
>> Y1=polyvalm(p3,p4) %第二个参数必须为方阵或数值
??? Error using ==> polyvalm
Matrix must be square.
5.1.4 多项式求根
n次多项式具有n个根,这些根可能是实根,也可能含有若干对共轭复根。MATLAB提供了roots函数用于求多项式的全部根,该函数的调用格式为:
x=roots(P)
其中,P为多项式的系数向量,返回向量x为多项式的根,即x(1),x(2),…,x(n)分别代表多项式的n个根。
另外,如果已知多项式的全部根,MATLAB还提供了函数poly用来建立该多项式,该函数的调用格式为:
P=poly(x)
其中,x为多项式的根,返回向量P为多项式的系数向量。
对于一个方阵s,可以用函数poly来计算矩阵的特征多项式的系数。特征多项式的根即为特征值,可以用roots函数来计算。
【例5.5】多项式求根操作
>> p5=[1 8 0 0 -10]
在命令窗口中输入以上内容,生成多项式的系数向量。
①用函数roots求系数向量为p5的多项式的根,输入如下内容:
>> x=roots(p5) %使用函数roots求系数向量为p5的多项式的根
返回结果如下:
x =
-8.0194
1.0344
-0.5075 + 0.9736i
-0.5075 - 0.9736i
②可以通过函数poly建立以x为其根的多项式来验证求得根是否正确。具体操作如下,返回的结果显示使用roots求得向量正是多项式的根。
>> P=poly(x) %建立以x为根的多项式
P =
1.0000 8.0000 -0.0000 -0.0000 -10.0000
【例5.6】使用函数poly和roots求方阵的特征多项式及特征值。
>> d=rand(4) %生成4阶的随机阵
①使用函数poly计算方阵的特征多项式,具体操作如下:
>> f=poly(d) %使用函数poly计算方阵的特征多项式
f =
1.0000 -1.1277 -1.2433 -0.1407 0.0255
②使用函数roots计算方阵的特征值,在命令窗口中输入以下内容:
>> roots(f)’ %特征值求取,转置转化为行向量
运算结果如下:
ans =
1.8406 -0.5363 -0.2716 0.0950
使用函数eig计算方阵的特征值,在命令窗口中输入以下内容:
>> eig(d) %计算方阵的特征值
运算结果如下:
ans =
1.8406
0.0950
-0.2716
-0.5363
注意:用上例方法计算特征多项式时,输入量必须为方阵。
5.1.5 部分分式展开
MATLAB提供函数residue
可以实现将分式表达式进行多项式的部分分式展开。
对于,函数的调用格式如下:
[r,p,k]=residue(b,a)
其中,b和a分别是分子和分母多项式系数行向量;返回值r是[r1 r2 …rn]留数行向量,p为[p1 p2 …pn]极点行向量,k为直项行向量。下面通过示例来讲述该函数的使用。
【例5.7】将表达式进行部分分式展开
在命令窗口中输入多项式系数向量p1和p3,如下所示:
>> p1=[1 21 20 0]
>> p3=[100 200]
使用函数residue
将多项式展开,p3和p1分别是分子和分母多项式系数行向量。在命令窗口输入:
>> [r,p,k]=residue(p3,p1)
返回值r是留数行向量,p为极点行向量,k为直项行向量。结果如下:
r =
-4.7368
-5.2632
10.0000
p =
-20
-1
0
k =
[]
由此可得表达式的展开结果为:
5.1.6 多项式的微分和积分
多项式的微分MATLAB提供了函数polyder
来实现,前面介绍多项式的导函数时已经介绍了该函数的具体使用。但是对于多项式的积分运算MATLAB没有提供专门的函数,但可以用[p./length(p):-1:1,k]
的方法来完成积分,其中k为常数。下面通过示例讲解如何进行多项式的积分运算。
【例5.11】多项式的微分
>> A=[1 2 3 4 5 5 3 4] %生成多项式系数
使用函数polyder进行多项式微分计算,在命令窗口输入以下内容:
>> B=polyder(A) %微分计算
返回结果如下:
B =
7 12 15 16 15 10 3 c
作者:德特数据
联系方式:156204968@qq.com