【matlab】科学计算与MATLAB语言(MOOC课程)笔记六

专题五  数据分析与多项式计算

一    数据统计分析

        本部分主要包括求最大元素与最小元素、求平均值与中值、求和与求积、累加和与累乘积、求标准差与相关系数、排序等。

1. 求矩阵的最大元素和最小元素

  • max():求向量或矩阵的最大元素。
  • min():求向量或矩阵的最小元素。

上述两函数的调用格式相同。以下以max函数为例进行介绍,min函数的用法与以下介绍相同。

当函数参数为向量时,函数有两种调用格式:

  • y=max(X):返回向量X的最大值存入y。如果X中包含复数元素,则按模取最大值。
  • [y, k]=max(X):返回向量X的最大值存入y,最大值元素的序号存入k。如果X中包含复数元素,则按模取最大值。

举个例子:求向量x的最大元素及最大元素的位置。

clear; clc; 
x = [-43, 72, 9, 16, 23, 47]; 
[y, k] = max(x)

运行结果显示y=72, k=2。

当函数参数为矩阵时,函数有三种调用格式:

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

举个例子:求矩阵A的每行及每列的最大元素,并求整个矩阵的最大元素。

clear; clc; 
A = [13, -56, 78; 25, 63, -235; 78, 25, 563; 1, 0, -1]; 

% 求矩阵A的每列的最大元素及最大元素的位置
[y1, k1] = max(A);

% 求矩阵A的每行的最大元素及最大元素的位置
[y2, k2] = max(A, [], 2); 
% or  [y2, k2] = max(A');

% 求整个矩阵的最大元素
y = max(max(A)); 
% or   y = max(y1);   or   y = max(y2); 

工作空间中保存的变量如下:


用什么方法只调用一次max函数就能求得整个矩阵的最大值?

clear; clc; 
A = [13, -56, 78; 25, 63, -235; 78, 25, 563; 1, 0, -1]; 
[y, k] = max(A(:)); % 采用A(:)的方法将矩阵元素按列堆叠,形成一个列向量

运行结果显示y=563, k=11。

2. 求矩阵的平均值和中值

  • 平均值指的是算术平均值,即每项数据之和除以数据的项数。
  • 中值:指在数据序列中,其值的大小处在中间的元素。如果数据个数为奇数,则取值为大小位于中间的元素;如果数据个数为偶数,则取中间两个元素的平均值。

有了平均值,为什么还要中值?

        因为平均值容易受少数极端数据的影响。

在MATLAB中求矩阵的平均值和中值:

  • mean():求算术平均值。
  • median():求中值。

上述两个函数的调用方式与max函数相似。

3. 求和与求积

在MATLAB中,对向量和矩阵进行求和与求积的函数如下:

  • sum():求和函数。
  • prod():求积函数。

上述两个函数的调用方式与max函数相似。

4. 累加和与累乘积


在MATLAB中,对向量和矩阵进行累加和与累乘积的函数如下:

  • cumsum():累加和函数。
  • cumprod():累乘积函数。

举个例子:求向量X=[1,2,3,4,5,6,7,8,9,10]的积与累乘积。


5. 标准差与相关系数

标准差


其中,S1称为样本标准差,S2称为总体标准差。在MATLAB中用于计算数据序列标准差的函数是std()。std函数有3种调用格式:

  • std(X):计算向量X的标准差。
  • std(A):计算矩阵A的各列的标准差。
  • std(A,flag,dim):其中flag取值为0或1。当flag=0时,按S1所列公式计算样本标准差;当flag=1时,按S2所列公式计算总体标准差。dim的用法与max函数中相同。默认情况下,flag=0, dim=1(即计算各列的样本标准差)。

相关系数


r越接近于0,说明两组数据序列越不相关;|r|越接近于1,说明两组数据序列越相关。在MATLAB中计算两组数据序列之间相关系数的函数是corrcoef()。corrcoef函数有两种调用格式:

  • corrcoef(A):返回由矩阵A所形成的的一个相关系数矩阵。其中,第i行第j列的元素表示原矩阵A中第i列与第j列之间的相关系数。
  • corrcoef(X,Y):这里的X,Y是向量。它们与corrcoef([X,Y])的作用一样,用于求向量X,Y之间的相关系数。

6. 排序

在MATLAB中采用函数sort()对向量或矩阵进行排序。调用格式如下:

  • sort(X):对向量X按升序排序。
  • [Y, I] = sort(A, dim, mode):其中,dim指明对矩阵A的列还是行进行排序。mode指明按升序还是降序进行排序,若取'ascend',则按升序排序,若取'descend',则按降序排序,默认情况下,采用升序排序。输出参数中,Y是排序后的矩阵,而I记录了Y中的元素在A中的位置。

------------------------------------------------------------------------------------------------------------------------

二    多项式计算

1. 多项式的表示


2. 多项式的四则运算

加减运算直接用系数向量做加减。乘法用函数conv(),除法采用函数deconv()。用时具体查。

3. 多项式的求导


4.多项式的求值

采用的函数如下:

  • polyval(p,x):代数多项式求值。
  • polyvalm(p,x):矩阵多项式求值。

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

polyvalm(p,x)要求x为方阵,以方阵为自变量求多项式的值。(这里需要理解以方阵为自变量的意思)

当x是方阵时,polyvalm(p,x)与polyval(p,x)的含义是不同的。polyval(p,x)是对方阵x中每个元素求多项式的值;而polyvalm(p,x)不同。例如:设x是方阵,p代表多项式x³-5x²+8,那么polyvalm(p,x)的含义是x*x*x-5*x*x+8*eye(size(x));而polyval(p,x)的含义是x.*x.*x-5*x.*x+8*ones(size(x))。

5. 多项式求根

采用函数roots(p),其中p是多项式的系数向量。若已知多项式的全部根,则可以用poly函数建立起该多项式,其调用格式为:p=poly(x)。

------------------------------------------------------------------------------------------------------------------------

三    数据插值

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

interp1():一维插值函数。

其调用格式:Y1=interp1(X, Y, X1, method),根据X, Y的值,计算函数在X1处的值。其中,X, Y是两个等长的已知向量,分别表示采样点和采样值。X1是一个向量或标量,表示要插值的点。输出参数Y1是一个与X1等长的插值结果。method表示某种特定的插值方法,method取值不同,所得到的结果也不同。method常用的取值有以下4种:

  • linear:线性插值,这是默认的方法。将与插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
  • nearest:最近点插值。选择最近样本点的值作为插值数据。如果插值点与前后两点距离相等,则选择后一个样本点的值作为插值数据。
  • pchip:分段3次埃米尔特插值。采用分段3次多项式,除满足插值条件,还需满足在若干节点处相邻段插值函数的一阶导数相等,使得曲线光滑的同时,还具有保形性。
  • spline:3次样条插值。每个分段内构造一个3次多项式,使其插值函数除满足插值条件外,还要求在各节点处具有连续的一阶和二阶导数。

为什么这两种插值方法都用3次多项式而不使用更高次的多项式?

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

interp2():二维插值函数。

其调用格式:Z1=interp2(X, Y, Z, X1, Y1, method),其中,X, Y是两个向量,表示两个参数的采样点,Z是采样点对应的函数值。X1, Y1是两个标量或者向量,表示要插值的点。二维插值函数中的method除了不能使用pchip插值以外,其余的与一维插值函数相同。

------------------------------------------------------------------------------------------------------------------------

四    曲线拟合


一般是采用多项式函数做逼近函数,根据最小二乘法计算最小误差。


在MATLAB中用于多项式拟合的函数是polyfit函数,该函数的功能是求得最小二乘拟合多项式的系数,polyfit函数有3种调用格式:

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

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

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

举例1


首先,绘制该股票数据的散点图,可以看出:数据点跳动幅度大,不稳定,难以看出规律。

close; 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]; 
figure('Name', '图1');
plot(x, y, '*'); 

继续输入命令,进行多项式拟合,选择常用的3次多项式,再绘制散点与拟合曲线图。

p = polyfit(x, y, 3); 
plot(x, y, '*', x, polyval(p, x)); 

预测未来3个交易日的股票数据。

x1 = [x, 31, 32, 33]; 
plot(x, y, '*', x1, polyval(p, x1)); 

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

相同点:

  • 都属于函数逼近方法。
  • 都能根据有限的离散样本数据,去估算其他数据。

不同点:

  • 实现方法不同。数据插值要求逼近函数经过样本点,曲线拟合不要求逼近函数经过样本点,只要求总体误差最小。
  • 结果形式不同。数据插值没有统一的逼近函数,曲线拟合用一个函数进行整体逼近,有确定的函数表达式。
  • 侧重点不同。数据插值一般是估算区间内的插值点数据,曲线拟合不仅可以估算区间内插值点的数据,还可以估算区间外的插值点数据。
  • 应用场合不同。如果样本数据为精确数据,适合采用数据插值的方法;如果样本数据为统计数据或存在误差,则适合采用曲线拟合的方法。

猜你喜欢

转载自blog.csdn.net/qq_15971883/article/details/80869955