最小二乘法曲线拟合实验报告Word文档下载推荐.docx
《最小二乘法曲线拟合实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最小二乘法曲线拟合实验报告Word文档下载推荐.docx(6页珍藏版)》请在冰豆网上搜索。
0.15,0.4,0.6,1.01,1.5,2.2,2.4,2.7,2.9,3.5,3.8,
4.4,4.6,5.1,6.6,7.6;
y:
4.4964,5.1284,5.6931,6.2884,7.0989,7.5507,7.5106,8.0756,
7.8708,8.2403,8.5303,8.7394,8.9981,9.1450,9.5070,9.9115;
试作出幂函数拟合数据。
2)已知一组数据:
0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1
-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2;
试用最小二乘法求多项式函数,使与此组数据相拟合。
4、题目:
曲线拟合的最小二乘法
5、原理:
从整体上考虑近似函数同所给数据点(i=0,1,…,m)误差(i=0,1,…,m)的大小,常用的方法有以下三种:
一是误差(i=0,1,…,m)绝对值的最大值,即误差向量的∞—范数;
二是误差绝对值的和,即误差向量r的1—范数;
三是误差平方和的算术平方根,即误差向量r的2—范数;
前两种方法简单、自然,但不便于微分运算,后一种方法相当于考虑2—范数的平方,因此在曲线拟常采用误差平方和来度量误差(i=0,1,…,m)的整体大小.。
数据拟合的具体作法是:
对给定数据(i=0,1,…,m),在取定的函数类中,求,使误差(i=0,1,…,m)的平方和最小。
6、设计思想:
从几何意义上讲,就是寻求与给定点(i=0,1,…,m)的距离平方和为最小的曲线。
函数称为拟合函数或最小二乘解,求拟合函数的方法称为曲线拟合的最小二乘法。
7、对应程序:
(1)幂函数程序
#include
voidmain()
{doublea0[16][2],a1[2][16],A[2][2],Y[2];
inti,j,k;
double
x[16]={0.15,0.4,0.6,1.01,1.5,2.2,2.4,2.7,2.9,3.5,3.8,4.4,4.6,5.1,6.6,
7.6},
y[16]={4.4964,5.1284,5.6931,6.2884,7.0989,7.5507,7.5106,8.0756,7.8708,8.2403,8.5303,8.7394,8.9981,9.1450,9.5070,9.9115};
doublem0,m1,n;
for(i=0;
i {a0[i][0]=1;
a0[i][1]=log(x[i]);
y[i]=log(y[i]);
printf("
输入x的值:
"
);
%f"
a0[i][1]);
得到的对应的函数值:
%f\n"
y[i]);
}
\n"
i for(j=0;
j {a1[j][i]=a0[i][j];
}//以上正确
A[0][0]=0;
A[0][1]=0;
A[1][0]=0;
A[1][1]=0;
Y[0]=0;
Y[1]=0;
i {for(j=0;
j {for(k=0;
k {A[i][j]+=a1[i][k]*a0[k][j];
}
j {Y[i]+=a1[i][j]*y[j];
m0=(Y[0]*A[1][1]-Y[1]*A[0][1])/(A[0][0]*A[1][1]-A[1][0]*A[0][1]);
n=(Y[0]*A[1][0]-Y[1]*A[0][0])/(A[0][1]*A[1][0]-A[1][1]*A[0][0]);
m1=exp(m0);
得到的幂函数x的系数是:
m1);
得到的幂函数x的指数是:
n);
(2)最小二乘法求多项式
#include
#definen11//n个点
#defineT3//T次拟合
#definew1//权函数
#definepRecIsIon0.00001
floatpow_n(floata,intn)
{inti;
if(n==0)
return
(1);
floatres=a;
for(i=1;
i {res*=a;
return(res);
voidmutiple(floata[][n],floatb[][T+1],floatc[][T+1])
{floatres=0;
j {res=0;
for(k=0;
k {res+=a[i][k]*b[k][j];
c[i][j]=res;
}}
voidmatrix_trans(floata[][T+1],floatb[][n])
{inti,j;
j {b[j][i]=a[i][j];
voidinit(floatx_y[][2],intn)
请输入%d个已知点:
i {printf("
(x%dy%d):
i,i);
scanf("
%f%f"
}
voidget_A(floatmatrix_A[][T+1],floatx_y[][2],intn)
j {matrix_A[i][j]=w*pow_n(x_y[i][0],j);
voidprint_array(floatarray[][T+1],intn)
j {printf("
%-g"
array[i][j]);
voidconvert(floatargu[][T+2],intn)
{inti,j,k,p,t;
floatrate,temp;
i {for(j=i;
j {if(argu[i-1][i-1]==0)
{for(p=i;
p {if(argu[p][i-1]!
=0)break;
if(p==n)
{printf("
方程组无解!
exit(0);
for(t=0;
t {temp=argu[i-1][t];
argu[i-1][t]=argu[p][t];
argu[p][t]=temp;
rate=argu[j][i-1]/argu[i-1][i-1];
for(k=i-1;
k {argu(:
最小二乘法曲线拟合实验报告)[j][k]-=argu[i-1][k]*rate;
if(fabs(argu[j][k]) argu[j][k]=0;
}}}
voidcompute(floatargu[][T+2],intn,floatroot[])
floattemp;
for(i=n-1;
i>
=0;
i--)
{temp=argu[i][n];
for(j=n-1;
j>
i;
j--)
{temp-=argu[i][j]*root[j];
root[i]=temp/argu[i][i];
voidget_y(floattrans_A[][n],floatx_y[][2],floaty[],intn){inti,j;
i {temp=0;
for(j=0;
j {temp+=trans_A[i][j]*x_y[j][1];
y[i]=temp;
voidcons_formula(floatcoef_A[][T+1],floaty[],floatcoef_form[][T+2]){inti,j;
j {if(j==T+1)
coef_form[i][j]=y[i];
else
coef_form[i][j]=coef_A[i][j];
voidprint_root(floata[],intn)
%d个点的%d次拟合的多项式系数为:
n,T);
a[%d]=%g,"
i+1,a[i]);
拟合曲线方程为:
\ny(x)=%g"
a[0]);
+%g"
a[i]);
*x"
voidprocess()
{float
x_y[n][2],matrix_A[n][T+1],trans_A[T+1][n],coef_A[T+1][T+1],coef_formu[T+1][T+2],y[T+1],a[T+1];
init(x_y,n);
get_A(matrix_A,x_y,n);
矩阵A为:
篇二:
最小二乘法实验报告
计算方法与实习实验报告
2.已知实验数据如下:
试用形如y=a+b?
?
2的抛物线进行最小二乘拟合。
程序如下:
doublekk()
{
doublek=0;
for(inti=0;
i {k+=1*1;
returnk;
doublekj(doublex[4])
i {k+=x[i]*x[i];
doublejj(doublex[4])
i {k+=x[i]*x[i]*x[i]*x[i];