[转载][转载]曲线拟合的MATLAB实现
函数插值与曲线拟合
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]\’;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*%多项式拟合
*