MATLAB学习笔记------第三章
多项式
多项式的表示与运算
多项式的表示:向量形式来表示系数
matlab
% 多项式乘法 conv函数
u = [1 0 1]; % 多项式系数向量
v = [2 7];
w = conv(u,v);
% 多项式除法 deconv函数
[q,r] = deconv(u,v); % q:商,r:余数
% 多项式求根(方程的解)roots
p = [3 -2 -4];
r = roots(p);
% 根据方程的根得到指定多项式 poly
p = poly(r);
% 将系数向量表示为多项式的手写形式 poly2sym
p1 = poly2sym(p);
% 计算P(x)在x点处的数值 polyval
p = [3 2 1];
x = [5 7 9];
y = polyval(p,x);
% 多项式微分求导 polyder
p = [3 0 -2 0 1 5];
q = polyder(p);
% 多项式积分 polyint
p = [3 0 -4 10 -25];
q = polyint(p); % 多项式积分
a = -1; b = 3; % 定积分的上下限
I = diff(polyval(q,[a b])); % 代入求解
% 多项式曲线拟合 polyfit
x = linspace(0,4*pi,10);
y = sin(x);
p = polyfit(x,y,7); % 将7次多项式与点拟合
x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off
多项式的四则运算
matlab
% 四则运算
f = [3,-5,2,-7,5,6];
g = [0,0,0,3,5,-3];
poly2sym(f+g);
poly2sym(f-g);
poly2sym(conv(f,g));
poly2sym(deconv(f,[3,5,-3]));
matlab
% 求根
f = [3,0,4,-5,-7.2,5];
r = roots(f); % 求根
g = poly(r); % 根据根求系数
gx = poly2sym(g); % 手写体
v = [5,7.8,9.6,12.3]; % 要求的点
polyval(f,v); % 求多项式在点处的值
matlab
% 求导
% 方法一:求导公式
f1 = [3,5,0,-8,1,-5];
f2 = [10,5,0,0,6,0,0,7,-1,0,-100];
f10 = polyder(f1);
f20 = polyder(f2);
f11 = conv(f10,f2);
f12 = conv(f20,f1);
f111 = f11-f12;
f22 = conv(f2,f2);
simplify(poly2sym(f111)/poly2sym(f22))
% 方法二:利用polyder函数
P = [3,5,0,-8,1,-5];
Q = [10,5,0,0,6,0,0,7,-1,0,-100];
[p,q] = polyder(P,Q);
divp = simplify(poly2sym(p)/poly2sym(q))
pretty(divp)
数据拟合
例子
matlab
x = 0:0.2:10;
y = 0.25*x+20*sin(x);
plot(x,y,'k.','MarkerSize',15) % 用点表示原始数据
grid on; hold on;
[p3,s3,mu3] = polyfit(x,y,3); % 三阶多项式拟合
y3 = polyval(p3,x,s3,mu3);
[p5,s5,mu5] = polyfit(x,y,5); % 五阶多项式拟合
y5 = polyval(p5,x,s5,mu5);
[p8,s8,mu8] = polyfit(x,y,8); % 八阶多项式拟合
y8 = polyval(p8,x,s8,mu8);
plot(x,y3,'c-',x,y5,'r-',x,y8,'b-')
xlabel('X'),ylabel('Y');
hold off
legend('原始数据','3阶拟合','5阶拟合','8阶拟合','Location','best')
多项式平均与置信区间估计
matlab
x = 0:0.2:10;
y = 0.25*x + 20*sin(x);
[P,S,MU] = polyfit(x,y,6);
[Y,DELTA] = polyconf(P,x,S,0.05,MU); % 预测值与置信区间
% fill 函数:在二维区间内填充颜色,三个参数,第一个是横轴x,第二个是纵轴y,第三个是颜色
fill([x,fliplr(x)],[Y-DELTA,fliplr(Y+DELTA)],[0.9706 0.9216 0.9804])
hold on
plot(x,y,'k.','MarkerSize',10);
plot(x,Y,'r-','LineWidth',2);
plot(x,Y-DELTA,'c--');
plot(x,Y+DELTA,'c--');
grid on
数据插值
matlab
% 最近邻点插值nearest:查询点处的插入值是距样本点最近的值,是一段一段的,不连续
% 线性插值linear:查询点处的插入值基于各维中邻近网格点处数值的线性插值。这是默认插值方法
% 三次样本插值spline:查询点处的插入值基于各维中邻近网格点处数值的三次插值,连续
% 多数情况下使用spline三次插值,因为比较光滑
x = 0:4*pi;
y = sin(x); % 已知数据点
xi = 0:0.1:4*pi; % 带插入点
methods = {'nearest','linear','spline','cubic'}; % 插值方法
strtitle = {'method = nearest','method = linear','method = spline','method = cubic'}; % 子图标题
for i = 1:4
yi = interp1(x,y,xi,methods{i}); % 一阶插值
subplot(2,2,i); % 绘制子图
plot(x,y,'ro','MarkerFaceColor','r') % 已知数据点离散绘图
hold on; grid on
plot(xi,yi,'b--','LineWidth',1.5) % 插值点曲线绘图
title(strtitle{i}); % 子图标题
hold off
end
matlab
figure
t = 0:2:24;
et = [12,9,9,10,18,24,28,27,25,20,18,15,13];
ti = 13;
eti = interp1(t,et,ti,'spline')
hold on;grid on
plot(t,et,'r.','MarkerSize',20)
plot(ti,eti,'b.','MarkerSize',20)
legend('已知数据点','13时的数据点','Location','best')
legend('boxoff')
hold off
matlab
figure
x = linspace(0,8.534,13);
y = [0,0.914,5.060,7.772,8.717,9.083,9.144,9.083,8.992,8.687,7.376,2.073,0];
x0 = 0:0.0001:8.534; % 插值点
y1 = interp1(x,y,x0,"linear"); % 线性插值
y2 = interp1(x,y,x0,'spline'); % 三次样条插值
plot(x,y,'b.','MarkerSize',15);
hold on;grid on
plot(x0,y1,'r--',x0,y2,'g-','LineWidth',1.5);
hold off
legend('已知点','线性','三次样条','Location','b')
S1 = trapz(y1)*0.001; % 线性插值数值积分(梯形积分)
S2 = trapz(y2)*0.001; % 三次样条插值数值积分