函数插值与曲线拟合


1、函数插值


  一维插值:interp1(x,y,cx,’method’)


  一维插值:interp1(x,y,z,cx,cy,’method’)


method:nearest、linear、spline、cubic


例:


clear


echo on


x=-2:0.4:2;


y=[2.8 2.96 2.54 3.44 3.565.4


6.0 8.7 10.1 13.3 14.0];


t=-2:0.01:2;


nst=interp1(x,y,t,\’nearest\’);


plot(x,y,\’r*\’,t,nst)


title(\’最临近点插值\’)


lnr=interp1(x,y,t,\’linear\’);


figure(2)

 


plot(x,y,\’r*\’,t,lnr,\’b:\’)


title(\’线性插值\’)


spl=interp1(x,y,t,\’spline\’);


figure(3)


plot(x,y,\’r*\’,t,spl)


title(\’样条插值\’)


cbc=interp1(x,y,t,\’cubic\’);


figure(4)


plot(x,y,\’r*\’,t,cbc,\’k-\’)


title(\’三次插值\’)


2、曲线拟合


多项式拟合:polyfit(x,y,m) 线性:m=1,二次:m=2, …


例:


x=0:0.1:1;


y=[-0.447 1.978 3.28 6.16 7.08 7.347.66 9.56 9.48 9.30
11.2];


A=polyfit(x,y,2)


Z=polyval(A,x);


Plot(x,y,’r*’,x,z,’b’)


matalb 曲线拟合的问题

%多项式拟合函数polyfit示例

x=[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];

y=[-0.4471 0.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30
11.2];

n=2;%polynomial order

p=polyfit(x, y, n);

%polyfit 的输出是一个多项式系数的行向量。

%其解是y = -9.8108×2+20.1293x-0.0317。为了将曲线拟合解与数据点比较,

让我们把二者都绘成图。

xi=linspace(0, 1, 100);%x-axis data for plotting

z=polyval(p, xi);%polyval 求多项式值

plot(x, y, \’ o \’ , x, y, xi, z, \’ : \’ )

xlabel(\’x\’)

ylabel(\’y=f(x)\’)


title(\’Second Order Curve Fitting\’)


//最小二乘法曲线拟合

typedef CArrayCDoubleArray;

BOOL CalculateCurveParameter(CDoubleArray *X,CDoubleArray *Y,long
M,long N,CDoubleArray *A)

{

 //X,Y —  X,Y两轴的坐标

 //M  
—  结果变量组数

 //N  
—  采样数目

 //A  
—  结果参数


 register long i,j,k;

 double Z,D1,D2,C,P,G,Q;

 CDoubleArray B,T,S;

 B.SetSize(N);

 T.SetSize(N);

 S.SetSize(N);

 if(M>N)M=N;

 for(i=0;i

  (*A)[i]=0;

 Z=0;

 B[0]=1;

 D1=N;

 P=0;

 C=0;

 for(i=0;i

 {

  P=P+(*X)[i]-Z;

  C=C+(*Y)[i];

 }

 C=C/D1;

 P=P/D1;

 (*A)[0]=C*B[0];

 if(M>1)

 {

  T[1]=1;

  T[0]=-P;

  D2=0;

  C=0;

  G=0;

  for(i=0;i

  {

   Q=(*X)[i]-Z-P;

   D2=D2+Q*Q;

   C=(*Y)[i]*Q+C;

   G=((*X)[i]-Z)*Q*Q+G;

  }

  C=C/D2;

  P=G/D2;

  Q=D2/D1;

  D1=D2;

  (*A)[1]=C*T[1];

  (*A)[0]=C*T[0]+(*A)[0];

 }

 for(j=2;j

 {

  S[j]=T[j-1];

  S[j-1]=-P*T[j-1]+T[j-2];

  if(j>=3)

  {

  
for(k=j-2;k>=1;k–)

   
S[k]=-P*T[k]+T[k-1]-Q*B[k];

  }

  S[0]=-P*T[0]-Q*B[0];

  D2=0;

  C=0;

  G=0;

  for(i=0;i

  {

   Q=S[j];

  
for(k=j-1;k>=0;k–)

   
Q=Q*((*X)[i]-Z)+S[k];

   D2=D2+Q*Q;

   C=(*Y)[i]*Q+C;

   G=((*X)[i]-Z)*Q*Q+G;

  }

  C=C/D2;

  P=G/D2;

  Q=D2/D1;

  D1=D2;

  (*A)[j]=C*S[j];

  T[j]=S[j];

  for(k=j-1;k>=0;k–)

  {

  
(*A)[k]=C*S[k]+(*A)[k];

   B[k]=T[k];

   T[k]=S[k];

  }

 }

 return TRUE;

}

 


*%只考虑线性拟合*                           

                                          

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     

*%原始数据
*                                

t = [0 .3 .8 1.1 1.6
2.3]\’;               

y = [0.5 0.82 1.14 1.25 1.35
1.40]\’;      

                                          

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     

*%多项式拟合
*                              

                                       

版权声明:本文为gisalameda原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gisalameda/p/12840552.html