Matlab 专题五

一、数据统计分析

1、 求最大元素与最小元素

(1) 当x为向量时

 y = max(x):求向量x的最大值

[y,k] = max(x):求向量x的最大值及在向量中的位置k。

(2)当A为矩阵时

max(A):返回一个行向量,该行向量由每列元素的最大值组成。

[Y,U] = max(A):返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大元素的行号。

max(A,[],dim):dim取1或者2。dim取1时,该函数的功能和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值(该列元素由每行最大元素组成)。

%求最大值和最大值的位置
x = [-43,72,9,16,23,47];
y = max(x);
y;
[y,k] = max(x);
y
k



%求矩阵的最大元素和最小元素
A = [13,-56,78;...
    25,63,-235;...
    78,25,563;...
    1,0,-1];
x = max(A);     %求每列元素最大值
x
y = max(A);     %求每行元素最大值
y
z = max(max(A));    %求所有元素最大值
z

%只调用一次max()函数
max(A(:)) %将A矩阵堆叠
B = A(:) %可以将A矩阵变成一个列向量



%min()用法与max()相同

2、求平均值与中值

平均值:指算数平均值,即每项数据之和除以项数

中值:指在数据序列中其值的大小恰好处在中间的元素。如果数据个数为奇数,则取值为大小位于中间的元素;如果数据个数为偶数,则取中间两个元素的平均值。

mean():求算数平均值

median():求中值

3、求和与求积

 sum():求和函数

prod():求积函数

4、累加和与累乘积

cumsum():累加和函数

cumprod():累乘积函数

5、求标准差与相关系数

std(X):计算向量X的标准差

std(A):计算矩阵A的各列的标准差

std(A,flag,dim):flag取0或1,当flag = 0时,按S1所列公式计算样本标准差;当flag=1时,按S2所列公式计算总体标准差。默认情况下,flag = 0,dim = 1。

%生成满足正态分布的50000×4随机矩阵,用不同的形式求各列之间的标准差
clear;
clc;
x = randn(50000,4);
y1=std(x,0,1)   %第二个参数flag取零表示按第一种方式计算样本标准差,dim取值为1,表示按列计算
y2 = std(x,1,1)   %第二个参数flag取1表示按第二种方式计算总体标准差,dim取值为1,表示按列计算
disp(y1);
disp(y2);

x1 = x';
y3 = std(x1,0,2);   %第一种方式,dim = 2,按行计算
y4 = std(x1,1,2);   %第二种方式,dim = 2,按行计算
disp('y3'' = ');
disp(y3');
disp('y4'' = ');
disp(y4');

相关系数,能够反映两组数据序列之间相互关系。

corrcoef():相关系数函数。调用格式如下:

corrcoef(A):返回由矩阵A所形成的一个相关系数矩阵,其中,第i行第j列的元素表示原矩阵A中第i列和第j列的相关系数。

corrcoef(X,Y):在这里,X、Y时向量,它们与corrcoef([X,Y])的作用一样,用于求X、Y向量之间的相关系数。

6、排序

sort():排序函数

sort(X):对向量X按升序排列。

[Y,I] = sort(A,dim,mode):

其中,dim指明对A的列还是行进行排序、mode指明按升序还是降序排序,若取“ascend”,则按升序;若取“descend”,则按降序,默认为升序。输出参数中,Y是排序后的矩阵,而I记录Y中的元素在A中位置。

clear
clc
%对矩阵A进行各种排序
A = [1,-8,5;4,12,6;13,7,-13];
disp('原A = ');
disp(A);
% sort(A);
% disp('A = ');
disp(A);
[X,I] = sort(A,2,'descend');
disp('X = ');
disp(X);
disp('I = ');
disp(I);

二、多项式计算

1、多项式的表示

 在MATLAB中,n次多项式用一个长度为n+1的行向量来表示。

(1)多项式系数向量的顺序是从高到低的。

(2)多项式系数向量包含0次项系数,所以其长度为多项式最高次加1。

(3)如果有的项没有,系数向量相应位置应用0补足。

2、多项式的四则运算

(1)多项式的加减运算

多项式的加减运算非常简单,即相应向量相加减。

(2)多项式乘法

conv(P1,P2):多项式相乘函数。

在这里,P1、P2是两个多项式系数向量。

(3)多项式除法

[Q,r] = deconv(P1,P2):多项式相除函数。

其中,Q返回多项式P1除以P2的商式,r返回P1除以P2的余式。这里,Q和r仍是多项式系数向量。

deconv式conv的逆函数,因此有

                P1 = conv(Q,P2)+r

clear
clc
%多项式四则运算
f = [3,-5,0,-7,5,6];
g = [3,5,-3];
g1 = [0,0,0,g];
%加法运算
disp('f+g = ');
s1 = f+g1;
disp(s1);
%减法运算
s2 = f-g1;
disp('f-g = ');
disp(s2);
%乘法运算
s3 = conv(f,g);
disp('f×g = ');
disp(s3);
%除法运算
[s4,r] = deconv(f,g);
disp('f/g = ');
disp(s4);
disp('r = ');
disp(r);

%验证计算
conv(g,s4)+r

3、多项式的求导

polyder():多项式求导函数。

(1)p = polyder(P):求多项式P的导函数

(2)p = polyder(P,Q):求P·Q的导函数

(3)[p,q] = polyder(P,Q):求P/Q的导函数,导函数的分子存入p,分母存入q。


%多项式求导
a = [3,1,0,-6];
b = [1,2];
b1 = [0,0,1,2];
p1 = polyder(a,b);
[p2,p3] = polyder(a,b);
disp('ab = ');
disp(p1);
disp('p2 = ');
disp(p2);
disp('p3 = ');
disp(p3);

4、多项式的求值

polyval(p,x):代数多项式求值。

其中,p为多项式系数向量;x可以是标量、向量或矩阵。若x为标量,则求多项式在该点的值;若x为向量或者矩阵,则对向量或矩阵中的每个元素求多项式的值。

polyvalm(p,x):矩阵多项式求值

其调用格式与 polyol相同,但含义不同。 polyram函数要求x内方阵,以方阵为自变量求多项式的值。

%多项式求值
f = [1,8,0,0,-10];
x = [-1,1.2;2,-1.8];
y1 = polyval(f,x);
disp('y1 = ');
disp(y1);
y2 = polyvalm(f,x);
disp('y2 = ');
disp(y2);

5、多项式的求根

root(p):多项式求根函数。

其中,p为多项式的系数向量。


clear
clc
%求以下方程在 [0,2] 范围内最大值
% p(x) = -38.89x*x+126.11x-3.42

%先画图观察一下
x = [0:0.01:2];
p = -38.89*x.*x+126.11*x-3.42;
plot(x,p);

%利用极值点导数为零的特点求出极值点。
p0 = [-38.89,126.11,-3.42];
p1 = polyder(p0);
x0 = roots(p1);
p2 = polyval(p0,x0);
disp('p2 = ');
disp(p2);
disp('x0 = ');
disp(x0);
%将极值点标识出来
hold on;
plot(x0,p2,'rp');
hold on;
plot([x0,x0],[-20,p2],'r--');

三、数据插值

数据插值可以根据有限个点的取值状况合理估算出附近其他点的取值,从而节约大量的实验和测试资源,节省大量的人力、物力和财力。

1、引例-零件加工问题

 

 求x每改变0.1时y的值

interp1():一维插值函数。

调用格式:

        Y1 = interp1(X,Y,X1method)

根据X、Y的值,计算函数在X1处的值。其中,X、Y是两个等长的已知向量,分别表示采样点和采样值。X1是一个向量或标量,表示要插值的点。

method用于指定插值方法,常用的取值有以下四种:

(1)linear:线性插值,默认方法。将与插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。

(2)nearest:最近点插值。选择最近样本点的值作为插值数据。

(3)pchip:分段3次埃尔米特插值。采用分段三次多项式,除满足插值条件,还需满足在若干节点处相邻段插值函数的一阶导数相等,使得曲线光滑的同时,还具有保形性。

(4)spline:三次样条插值。每个分段内构造一个三次多项式,使其插值函数除满足插值条件外,还要有在各节点处具有连续的一阶和二阶导数。

多项式次数并非越高越高。次数越高,越容易产生震荡而偏离原函数,这种现象称为龙格现象。

2、数据插值的计算机制


clear
clc
%求x每改变一个0.1的值,插值函数使用

%先画散点图图看看
x = [0,3,5,7,9,11,12,13,14,15];
y = [0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];
plot(x,y,'r*');
hold on;
%使用插值函数补充未知的点
x1 = 0:0.1:15;
y1 = interp1(x,y,x1,'spline');
plot(x1,y1,'k');
hold on;
y2 = interp1(x,y,x1,'pchip');
plot(x1,y2,'r');
hold on;
y3 = interp1(x,y,x1,'nearest');
plot(x1,y3,'b');
hold on;
y4 = interp1(x,y,x1,'linear');
plot(x1,y4,'g');

legend('原函数','spline','pchip','nearest','linear');

 3、数据插值的实现方法

interp2():二维插值函数。

        Z1 = interp2(X,Y,Z,X1,Y1,method)

其中,X、Y是两个向量,表示两个参数的采样点,Z是采样点对应的函数值。X1、Y1是两个标量或者向量,表示要插值的点。

4、应用案例-粮储仓的通风控制问题

clear
clc
%粮仓通风控制问题
x = 20:10:90;
y = (0:5:20)';
z = [8.9,10.32,11.3,12.5,13.9,15.3,17.8,21.3;8.7,10.8,11,12.1,13.2,14.8,16.55,20.8;8.3,9.65,10.88,12,13.2,14.6,16.4,20.5;8.1,9.4,10.7,11.9,13.1,14.5,16.2,20.3;8.1,9.2,10.8,12,13.2,14.8,16.9,20.9];
xi = 20:90;
yi = (0:20)';
zi = interp2(x,y,z,xi,yi,'spline');
surf(xi,yi,zi);

 

四、数据插值应用举例

1、机动车刹车距离问题

clear
clc
v = 20:10:150;
vs = v*(1000/3600);     %将单位由原来的公里每小时,变为米每秒。
d1 = 10*vs;
d2 = [3.15,7.08,12.59,19.68,28.34,38.57,50.4,63.75,78.71,...
    95.22,113.29,132.93,154.12,176.87];
d3 = 10;
d = d1+d2+d3;           %停车视距
vi = 20:150;            %插值采样点
di = interp1(v,d,vi,'spline');

%如何根据停车视距120找到对应的速度?
x = abs(di-120);
[y,i] = sort(x);
b = vi(i(1));
plot(vi,di,vi(i(1)),di(i(1)),'rp');
disp('驾驶速度不能超过 ');
disp(b);

%设计一条最高时速125km/h的高速公路,则设计人员应该保证驾驶者在
%公路上任一点的可视距离为多少米?

j = find(vi == 125);
disp('任意一点的可视距离为');
di(j)
plot(vi,di,125,480.14,'rp');

2、沙盘制作问题

%沙盘绘制任务
%根据已有数据绘制的地形图比较粗糙
x=0:200:1800;
y=x';
z=[2000,2000,2001,1992,1954,1938,1972,1995,1999,1999;2000,2002,2006,1908,1533,1381,1728,1959,1998,2000;
   2000,2005,2043,1921,977,897,1310,1930,2003,2000;1997,1978,2009,2463,2374,1445,1931,2209,2050,2003;
   1992,1892,1566,1971,2768,2111,2653,2610,2121,2007;1991,1875,1511,1556,2221,1986,2660,2601,2119,2007;
   1996,1950,1797,2057,2849,2798,2608,2303,2052,2003;1999,1999,2079,2685,3390,3384,2781,2165,2016,2000;
   2000,2002,2043,2271,2668,2668,2277,2049,2003,2000;2000,2000,2004,2027,2067,2067,2027,2004,2000,2000];
surf(x,y,z);
%数据插值之后数据就会变得丰满
x1 = 0:50:1800;
y1 = x1';
z1 = interp2(x,y,z,x1,y1,'spline');
subplot(1,2,1);
surf(x1,y1,z1);
%绘制等高线图
subplot(1,2,2);
contour(x1,y1,z1,12);

五、曲线拟合

1、引例——人口预测问题

本节代码如下:

%人口预测问题
x=[1790:10:2010];
y=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,...
    50.2,63.0,76.0,92.0,105.7,122.8,131.7,...
    150.7,179.3,203.2,226.5,248.7,281.4,308.7];
plot(x,y,'*');

p=polyfit(x,y,3); %生成三次多项式函数,将系数向量保存在p中。
polyval(p,2020) %计算polyval()函数,在2020处的函数值
plot(x,y,'*',x,polyval(p,x));

polyval(p,2016)

%因人口的增长规律与时间段有关,故将人口数据分为二战前后,分别进行拟合。
%以下是二战后的数据,人口拟合曲线
x = 1950:10:2010;
y = [150.7,179.3,203.2,226.5,248.7,281.4,308.7];
p1 = polyfit(x,y,3);    %因为向量p1的前几个元素都为0,故应降低次数为2次。
disp('p1 = ');
disp(p);
p2 = polyfit(x,y,2);
plot(x,y,'*',x,polyval(p2,x));

p3 = polyval(p2,2016);
disp('2016预估人口为:');
disp(p3);




clear
clc
%建立x与y的线性函数经验公式,一次多项式
x = [0.6,1.0,1.4,1.8,2.2,2.6,3.0,3.4,3.8,4];
y = [0.08,0.22,0.31,0.4,0.48,0.56,0.67,0.75,0.8,1.0];
p = polyfit(x,y,1);
plot(x,y,'*',x,polyval(p,x));

2、曲线拟合的原理

与数据插值类似,曲线拟合也是去找一个函数,去逼近原来数据所表现出来的函数关系。构造的函数去逼近位置函数,使得误差在某种意义下达到最小。

一般采用多项式函数作为逼近函数,多项式函数有如下几个优点:将复杂问题简单化、表达能力强、计算方便、函数形态好。

误差最小化,用到最小二乘法。

3、曲线拟合的实现方法

polyfit():多项式拟合函数

函数功能:求得最小二乘拟合多项式系数。

调用格式:

        (1) P=polyfit(X,Y,m)        P为多项式系数,m为多项式最高次次数。X、Y是样本数据。

        (2) [P,S] = polyfit(X,Y,m)        P为多项式系数,S为误差数据。

        (3) [P,S,mu] = polyfit(X,Y,m)

根据样本数据X和Y,产生一个m次多项式P及其在采样点误差数据S,mu是一个二元向量,mu(1)是mean(X)——X向量的平均值,而mu(2)是std(X)——X向量的标准差。

(1)曲线的拟合,要对问题的背景进行详细的分析。

(2)采样点并非越多越好,适当的时候,可以减少采样点,分段进行拟合。逼近函数的最高次数也不是越高越好,要根据根据实际情况调整。

(3)曲线拟合的三个功能:估算数据、预测趋势、总结规律。

4、实际应用

六、曲线拟合应用举例

1、股票预测问题

clear
clc
%股票的预测问题
x = [2,3,4,5,8,9,10,11,12,15,16,17,18,19,22,23,24,25,26,29,30];
y = [7.74,7.84,7.82,7.78,7.91,...
   7.97,7.9,7.76,7.9,8.04,8.06,8.11,8.08,...
   8.13,8.03,8.01,8.06,8.0,8.3,8.41,8.28];
% plot(x,y,'*');
g = polyfit(x,y,3)
plot(x,y,'*',x,polyval(g,x));
x1 = [31,32,33];    %用拟合曲线预测往后的三个交易日股票价格走势
xi = [x,x1];    
plot(x,y,'*',xi,polyval(g,xi)); %画出往后三个交易日的预测曲线
y1 = [8.27,8.17,9.54];  %股票以后三个交易日实际数据
plot(x,y,'*',xi,polyval(g,xi),x1,y1,'rp');  %将预测的曲线数据与实际数据画在同一个图上

%经过验证股票的走势并不能被拟合的曲线预测

2、算法的参数优化问题

clear
clc
format short;
%算法的参数最优化问题
x = 0.03:0.03:0.3;
y1 = [0.01,0.01,0.02,0.03,0.06,0.07,0.13,0.17,0.25,0.37];
y2 = [0.85,0.76,0.68,0.62,0.56,0.52,0.49,0.46,0.43,0.39];
plot(x,y1,'*',x,y2,'o');
hold on;
% 随机性参数的增长导致多样性增加,收敛性降低
% 两者同等重要,则取平衡点
% 平衡点最佳位置是多样性和收敛性相等的地方
p1 = polyfit(x,y1,2)    %为啥使用二次多项式未知
p2 = polyfit(x,y2,2)    %为啥使用二次多项式未知
plot(x,polyval(p1,x),'r',x,polyval(p2,x),'k');

%求两曲线交点的方法
p = p1-p2;
xi = roots(p);
disp('交点x值为 xi = ');
disp(xi);

xj = 0:0.03:0.36;
yj1 = polyval(p1,xj);
yj2 = polyval(p2,xj);
yi = polyval(p1,xi(2));
plot(x,y1,'*',x,y2,'o',xj,yj1,xj,yj2,xi(2),yi,'rp');
X = sprintf('交点为(%f,%f)',xi(2),yi);
disp(X);

%可以比较好的解决数据稳定变化的题目

3、数据插值与曲线拟合的比较

相同点:

      1、都属于函数逼近方法

      2、都能进行数据估算

不同点:

         1、实现方法不同,数据插值,要求逼近函数经过样本点;

                                        曲线拟合,不要求逼近函数样本点,只要求总体误差最小。

        2、结果形式不同,数据插值,往往分段进行逼近,没有同一的逼近函数;

                                       曲线拟合,用一个函数进行整体逼近,有确定的函数表达式

         3、侧重点不同,数据插值,一般用于样本区间内的插值计算;

                                    曲线拟合,不仅可以估算区间内其他点的函数值,还可以预测时序数据的发展趋势,以及从统计数据中总结一般性经验。

        4、应用场合不同,数据插值,样本数据采用精确数据,适合样本插值方法

                                      曲线拟合,样本数据为统计数据或者存在误差,适合用曲线拟合的方法。

        

猜你喜欢

转载自blog.csdn.net/weixin_41949409/article/details/120279985
今日推荐