matlab 邻近度 离群点_Matlab 学习记录帖 —— 多项式、插值和数据拟合

1cde01a0d45e29f26b8ad60c49276c6b.png

  1. 关于多项式Matlab命令

  • 一个多项式的幂级数形式可表示为:

  • 也可表示为嵌套形式:

  • 或因子形式

  • 幂系数:在matlab里,多项式用行向量表示,其元素未多项式的系数,并从左至右按降幂排列。

  • Roots:求多项式的零点。

%% 例如:y=2*x^3+x^2+5*x+4>> p=[2 1 5 4];>> poly2sym(p)ans =2*x^3 + x^2 + 5*x + 4>> r = roots(p)r =   0.1227 + 1.6334i   0.1227 - 1.6334i  -0.7454 + 0.0000i
  • Poly:由零点可得原始多项式的各系数,但可能相差一个常数倍。

>> poly(r)ans =    1.0000    0.5000    2.5000    2.0000
  • polyval:用来计算多项式的值

%% 求解多项式y=3*x^4-7*x^3+2*x^2+x+1在x=2.5的值c=[3 -7 2 1 1];xi=2.5;yi=polyval(c,xi)yi =   23.8125
  • polyfit:给定n+1个点将可以唯一确定一个n阶多项式。利用命令polyfit可容易确定多项式的系数。

  • 多项式积分:py=poly_itg(p),均为多项式的系数。

  • 多项式微分:polyder(),求多项式一阶导数的系数。

  • 多项式的和与差:c=poly_add(a,b); c=poly(a,-b)。

  • c=conv(a,b):求多项式乘积后的系数。

  • [q,r]=deconv(a,b):多项式除法,q是商,r是余数。

  2. 插值

2.1 Lagrange插值

    对给定的n个插值点及对应的函数值,利用构造的n-1次Lagrange插值多项式,则对插值区间内任意x的函数值y可通过下式求得

    Matlab实现

function y=lagrange(x0,y0,x)ii=1:length(x0);y=zeros(size(x));for i=ii    ij=find(ii~=i);    y1=1;    for j=1:length(ij)        y1=y1.*(x-x0(ij(j)));    end    y=y+y1*y0(i)/prod(x0(i)-x0(ij));end
>> x=[0.4:0.1:0.8];>> y=[-0.916291,-0.693147,-0.510826,-0.356675,-0.223144];>> lagrange(x,y,[0.54,0.55,0.78])ans =   -0.6161   -0.5978   -0.2484
2.2 Hermite插值    不少实际问题不但要求在节点上函数值相等,而且要求导数值也相等,甚至要求高阶导数也 相等,满足这一要求的的插值多项式就是Hermite插值多项式。下面只讨论函数值与一阶导数值各数相等且已知的情况。    已知n个插值点及对应的函数值和一阶导数值。则对插值区间内任意x的函数值y得Hermite插值公式:

其中,

    Matlab实现

% hermite.mfunction y=hermite(x0,y0,y1,x)n=length(x0);m=length(x);for k=1:m    yy=0.0;    for i=1:n        h=1.0;        a=0.0;        for j=1:n            if j~=i                h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2;                a=1/(x0(i)-x0(j))+a;            end        end        yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i));    end    y(k)=yy;end
>> x=[0.3,0.32,0.35];>> y0=[0.29552,0.31457,0.34290];>> y1=[0.95534,0.94924,0.93937];>> y=hermite(x,y0,y1,0.34)y =    0.3335

2.3 Runge现象

问题的提出:根据区间[a,b]上给出的节点做插值多项式p(x)的近似值,一般总认为p(x)的次数越高则逼近f(x)的精度就越好,但事实并非如此。

为了解决Runge问题,引入分段插值。

2.4 分段插值

算法分析:所谓分段插值就是通过插值点用折线或低次曲线连接起来逼近原曲线。

Matlab实现:

  • inter1:一维数据插值(表格查找)。该命令对数据点之间计算内插值。它找出一元函数f(x)在中间点的数值。其中函数f(x)由所给数据决定。

% 格式1yi=interp1(x,Y,xi)% 返回插值向量yi,每一元素对应于参量xi,同时由向量x与Y的内插值决定。% 参量x指定数据Y的点。若Y为一矩阵,则按Y的每列计算。% 算例temp=[300,400,500,600]';beta=100*[3.33,2.50,2.00,1.67]';alpha=10000*[0.2128,0.3605,0.5324,0.7190]';ti=[321,400,571]';propty=interp1(temp,[beta,alpha],ti);[ti,propty]ans =   1.0e+03 *    0.3210    0.3156    2.4382    0.4000    0.2500    3.6050    0.5710    0.1766    6.6489
    
% 格式2yi=interp1(Y,xi)% 假定x=1:N,其中N为向量Y的长度,或为矩阵Y的行数% 格式3yi=interp1(x,Y,xi,method)% 用指定的算法计算插值:% nearest:最近邻点插值,直接完成计算;% linear:线性插值(缺省方式),直接完成计算;% spline:三次样条函数插值。% cubic:分段三次Hermite插值。% v5cubic% 对于超出x范围的xi的分量,使用nearest、linear、v5cubic的插值算法,相应地将返回NaN。对于其他方法,interp1将对超过恶分量执行插值算法yi=interp1(x,Y,xi,method,'extrap')yi=interp1(x,Y,xi,method,extrapval) %确定超过x范围的xi中俄分量的外插值extrapval,其值通常取NaN或0.
  • interp2:二维数据内插值(表格查找)

% 格式1ZI=inter2(X,Y,Z,XI,YI)% 返回矩阵ZI,其元素对应于参量XI与YI(可以是向量、或同型矩阵)的元素。% 参量X与Y必须是单调的,且相同的划分格式,就像由命令meshgrid生成的一样。% 若Xi与Yi中有在X于Y范围之外的点,则相应地返回NaN。% 格式2ZI=interp2(Z,XI,YI)% 缺省地,X=1:n、Y=1:m,其中[m,n]=size(Z)。再按第一种情形进行计算。% 格式3ZI=interp2(X,Y,Z,XI,YI,method)% 用指定的算法method计算二维插值
2. 5  二维一般分布数据的插值功能:可对非网格数据进行插值
% 格式z=griddata(x0,y0,z0,x,y,'method')% v4插值算法效果较好;
  • interp3

% 三维网格生成用meshgrid()函数,调用格式[x,y,z]=meshgrid(x1,y1,z1)% 其中x1,y1,z1为这三维所需要的分割形式,应以向量形式给出,返回x,y,z为网格恶数据生成,均为三维数组% griddata3() 三维非网格形式的插值拟合
  • interpn

% n维网格生成用ndgrid()函数[x1,x2,...,xn]=ndgrid[v1,v2,...,vn]% griddatan() n维非网格形式的插值拟合% interp3()、interpn()调用格式同interp2()函数一致% griddata3()、griddatan()调用格式同griddata()函数一致
2.6 样条插值的Matlab表示

5007a68c2e6573b8f58684e9519a0930.png

    定义一个三次样条函数类:

S=csapi(x,y)% 其中x=[x1,x2,...,xn],y=[y1,y2,...,yn]为样本点。% S返回样条函数对象的插值结果,包括子区间点、各区间点三次多项式系数等。% 可用fnplt()绘制出插值结果,其调用格式fnplt(S)% 对给定的向量xp,可用fnval()函数计算yp=fnval(S,xp)% 其中得出的yp是xp上各点的插值结果% 函数spline% 三次样条数据插值% 格式:yy=spline(x,y,xx)
3. 数据拟合    3.1 多项式数据拟合用插值的方法对一函数进行近似,要求所得到的插值多项式经过已知插值节点;在n比较大的情况下,插值多项式往往是高次多项式,这也就容易出现震荡现象(Runge现象),即虽然在插值节点上没有误差,但在插值节点之外插值误差变得很大,从“整体”上看,插值逼近效果将变得“很差”。    所谓数据拟合就是要求一个简单的函数,例如是一个低次多项式,不要求太过已知的这些点,而是要求在整体上“尽量好”的逼近原函数。这时,在每个已知点上就会有误差,数据拟合就是从整体上使误差尽量的小一些。

912d14b22c5c0da326db0703fea93c00.png

多项式拟合matlab命令:polyfit

% 格式:p=poltfit(x,y,n)% x和y为原始的样本点构成的向量% n为选定额多项式阶数% p为多项式系数按降幂排列得出的行向量

3.2 函数线性组合的曲线拟合方法

354eb57d981a6f1b9cad7aba89af4e46.png

5d182a53e03329e76b7cf0e43788f9eb.png

3.3 最小二乘曲线拟合

08b9282196af4ffa84fcda4f8ba5c6df.png

% 格式[a,jm]=lsqcurvefit(Fun,a0,x,y)% Fun为原型函数的Matlab表示,可以是M-函数或inline()函数% a0为最优化的初值% x,y为原始输入输出数据向量% a为返回恶待定系数向量% jm为此待定系数下的目标函数的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值