第6章 数据分析
知识要点
数据分析和处理是各种应用中非常重要的问题。针对数据分析和处理,MATLAB提供了大量的函数,方便用户使用。本章将介绍MATLAB强大的数据分析和处理功能,首先介绍多项式函数,这些函数用于多项式求值、多项式乘法、多项式除法等;接着介绍插值函数,MATLAB提供数个不同的插值算法;最后介绍limit函数对数组和函数极限的求解过程。
学习要求
6.1 多项式及其函数
多项式作为线性方程组的表现形式,在运算及应用中具有非常重要的意义,本节将重点介绍多项式的各种运算法则、运算函数及操作指令,并特别对有理多项式进行说明。
6.1.1 多项式的表达式和创建
MATLAB中使用一维向量来表示多项式,将多项式的系数按照降幂次序存放在向量中。多项式P(x)的具体表示方法如下:
P(x)=a0xn +a1xn-1+an-1x+an的系数构成的向量为:[ a0a1… an-1an ]。
例如,多项式2x4+3x3+5x2+1就可以用向量[2 3 5 0 1]来表示。应当注意的是,多项式中缺少的幂次的系数应当为“0”。在MATLAB中,多项式由一个行向量表示,它的系数是按降序排列的。
例6-1:输入多项式3x4-10x3+15x+1000。
在命令行窗口中输入:
p = [3 -10 0 15 1000]
输出结果:
p = 3 -10 0 15 1000
注意:必须包括具有0系数的项,如在上例中,多项式并没有二次项,因此二次项的系数为0,否则MATLAB是无法知道哪一项为0的。
例6-2:将向量表示的多项式用字符串输出的通用函数示例。
创建M文件并命名为ex6_02.m,利用M文件编辑器在M文件中输入:
function s = pprintf(p) if nargin > 1 error ('Too much input arguments ') % 确认输入变量 end while p(1) == 0 % 将高次的零去掉 p(1) = []; end l = length(p); % 计算p的长度 if l == 0 s = '0'; elseif l == 1 s = num2str(p(1)); elseif l == 2 s = strcat(num2str(p(1)), 'x+', num2str(p(2))); elseif l > 2 for i = 1 : l if i == 1 if p(i) == 1 s = strcat('x^{', num2str(l - i), '}'); else s = strcat(num2str(p(i)), 'x^{', num2str(l - i), '}'); end elseif i == l s = strcat(s, '+', num2str(p(i))'); elseif i == l - 1 s = strcat(s, '+', num2str(p(i)), 'x'); else if p(i) == 0 else s = strcat(s, '+', num2str(p(i)), 'x^{', num2str(l - i), '}'); end end end end
现在,为了试验函数pprintf,在命令行窗口中输入:
p = [1 0 3 5 7 9]; figure; title(pprintf(p))
在图形界面上输出结果:
6.1.2 多项式求根
1.多项式的根
找出多项式的根,即使多项式为0的值,可能是许多学科共同的问题。MATLAB能求解这个问题,并提供了特定函数roots求解一个多项式的根。
例6-3:求解多项式3x4-10x3+15x+1000的根。
在命令行窗口中输入:
p = [3 -10 0 15 1000]; r = roots(p)
输出结果:
r = 4.0283 + 2.8554i 4.0283 - 2.8554i -2.3616 + 2.8452i -2.3616 - 2.8452i
2.由根创建多项式
在MATLAB中,无论是一个多项式还是它的根,都是以向量形式存储的。按照惯例,多项式是行向量,根是列向量。因此,当我们给出一个多项式的根时,MATLAB也可以构造出相应的多项式,这个过程需要使用函数poly。
例6-4:由根创建多项式。
在命令行窗口中输入:
r = [4.0283 + 2.8554i;4.0283 - 2.8554i;-2.3616 + 2.8452i;-2.3616 - 2.8452i]; p = poly(r)
输出结果:
p = 1.0000 -3.3334 -0.0001 5.0016 333.3381
因为MATLAB无隙地处理复数,当用根重组多项式时,如果一些根有虚部,由于截断误差,则poly的结果有一些小的虚部。消除虚假的虚部,只要使用函数real抽取实部即可。
6.1.3 多项式的四则运算
1.多项式的加法
对于多项式的加法,MATLAB并未提供一个特别的函数。如果两个多项式向量大小相同,那么多项式相加时就与标准的数组加法相同。
例6-5:多项式加法运算示例一。
在命令行窗口中输入:
a = [1 3 5 7 9]; b = [1 2 4 6 8]; c = a + b
输出结果:
c = 2 5 9 13 17
结果是c(x)=2x4+5x3+9x2+13x+17。
注意:当两个多项式阶次不同时,低阶的多项式用首零填补,使其与高阶多项式有同样的阶次。要求首零而不是尾零,是因为相关的系数像x幂次一样,必须整齐。
例6-6:多项式加法运算示例二。
在命令行窗口中输入:
a = [1 3 5 7 9]; b = [0 2 4 6 8]; c = a + b
输出结果:
c = 1 5 9 13 17
结果是c(x)=x4+5x3+9x2+13x+17。
有的时候,两个相加的多项式的项数并不明确,这时可用一个文件编辑器创建一个通用的多项式相加函数M文件来执行一般的多项式加法。
例6-7:通用的多项式加法函数示例。
创建M文件并命名为ex6_07.m,利用M文件编辑器在M文件中输入:
function p = ppadd(a, b) if nargin < 2 error('Not enough input arguments') % 确认输入变量 end a = a(:).'; % 将输入转化为行向量 b = b(:).'; na = length(a); % 求相加的两个多项式的项数 nb = length(b); % 当相加的两个多项式项数不等时,高次补零 p = [zeros(1, nb - na) a] + [zeros(1, na - nb) b];
现在,为了试验函数ppadd,在命令行窗口中输入:
a = [1 3 5 7 9]; b = [0 2 4 6 8]; c = ppadd(a, b)
输出结果:
c = 1 5 9 13 17
结果是c(x)= x4+5x3+9x2+13x+17。
2.多项式的乘法
在MATLAB中,函数conv支持多项式乘法(运算法则为执行两个数组的卷积)。
例6-8:多项式乘法运算示例。
在命令行窗口中输入:
a = [1 3 5 7 9]; b = [1 2 4 6 8]; c = conv(a, b)
输出结果:
c = 1 5 15 35 69 100 118 110 72
结果是c(x)=x8+5x7+15x6+35x5+69x4+100x3+118x2+110x+72。
3.多项式的除法
在一些特殊情况下,一个多项式需要除以另一个多项式。在MATLAB中,这是由函数deconv完成的。
例6-9:多项式除法运算示例。
在命令行窗口中输入:
输出结果:
a = 1 3 5 7 9 r = 0 0 0 0 0 0 0 0 0
a是多项式c除以多项式b的商,余式为r。本例中r为零多项式,因为多项式b和多项式a的乘积恰好是c。
6.1.4 多项式的导数、积分与估值
1.多项式的导数
MATLAB为多项式求导提供了函数polyder。
例6-10:多项式求导运算示例。
在命令行窗口中输入:
d = [1 5 15 35 69 100 118 110 72]; e = polyder(d)
输出结果:
e = 8 35 90 175 276 300 236 110
2.多项式的积分
MATLAB为多项式的积分提供了函数polyint,其具体的调用格式如下。
● polyint(P,k):返回多项式P的积分,积分常数项为k。
● polyint(P):返回多项式P的积分,积分常数项默认值为0。
例6-11:多项式积分运算示例。
在命令行窗口中输入:
d = [1 5 15 35 69 100 118 110 72]; f = polyint(d)
输出结果:
f = 列 1 至 8 0.1111 0.6250 2.1429 5.8333 13.8000 25.0000 39.3333 55.0000 列 9 至 10 72.0000 0
3.多项式的估值
根据多项式系数的行向量,可对多项式进行加、减、乘、除和求导运算,也能对它们进行估值。在MATLAB中,这由函数polyval来完成。
例6-12:多项式的估值运算示例。
在命令行窗口中输入:
x = -1 : 0.01 : 1; % 生成自变量 g = [1 3 5 7 9]; % 函数对应的多项式 h = polyval(g, x); % 进行估值运算 % 将估值运算结果对自变量作图 plot(x, h); xlabel('x'); title('x^4 + 3x^3 + 5x^2 + 7x + 9');
输出结果如图6-1所示。
图6-1 多项式估值运行结果
6.1.5 多项式运算函数及操作指令
多项式的运算函数及常用的操作指令如表6-1和表6-2所示。
表6-1 多项式运算函数
表6-2 多项式操作指令
6.1.6 有理多项式
在许多应用中,例如在傅里叶(Fourier)、拉普拉斯(Laplace)和Z变换中,出现了两个多项式之比。在MATLAB中,有理多项式由它们的分子多项式和分母多项式表示。对有理多项式进行运算的两个函数是residue和polyder。函数residue执行部分分式展开的运算。
例6-13:有理多项式的展开。
在命令行窗口中输入:
num = [5 3 -2 7]; % 分子多项式 den = [-4 0 8 3]; % 分母多项式 [r, p, k] = residue(num, den)
输出结果:
r = -1.4167 -0.6653 1.3320 p = 1.5737 -1.1644 -0.4093 k = -1.2500
本例结果可表示成:
residue函数也可执行逆运算。
例6-14:有理多项式展开的逆运算。
在命令行窗口中输入:
num = [5 3 -2 7]; % 分子多项式 den = [-4 0 8 3]; % 分母多项式 [r, p, k] = residue(num, den); [n, d] = residue(r, p, k)
输出结果:
n = -1.2500 -0.7500 0.5000 -1.7500 d = 1.0000 -0.0000 -2.0000 -0.7500
本例结果可表示成:
函数polyder可用来对多项式求导。除此之外,如果输入两个多项式,则polyder函数对两个多项式构成的有理多项式求导。
例6-15:有理多项式的求导。
在命令行窗口中输入:
num = [5 3 -2 7]; % 分子多项式 den = [-4 0 8 3]; % 分母多项式 [b, a] = polyder(num, den)
输出结果:
b = 12 64 153 18 -62 a = 16 0 -64 -24 64 48 9