最小二乘法曲线拟合实验报告.docx
《最小二乘法曲线拟合实验报告.docx》由会员分享,可在线阅读,更多相关《最小二乘法曲线拟合实验报告.docx(8页珍藏版)》请在冰点文库上搜索。
最小二乘法曲线拟合实验报告
竭诚为您提供优质文档/双击可除
最小二乘法曲线拟合实验报告
篇一:
实验3曲线拟合的最小二乘法
实验三曲线拟合的最小二乘法
1、实验目的:
在科学研究与工程技术中,常常需要从一组测量数据出发,寻找变量的函数关系的近似表达式,使得逼近函数从总体上与已知函数的偏差按某种方法度量能达到最小而又不一定过全部的点。
这是工程中引入最小二曲线拟合法的出发点。
充分掌握:
1.最小二乘法的基本原理;2.用多项式作最小二乘曲线拟合原理的基础上,通过编程实现一组实验数据的最小二乘拟合曲线。
2、实验要求:
1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法;
2)编写上机实验程序,作好上机前的准备工作;
3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);
4)分析和解释计算结果;
5)按照要求书写实验报告;
3、实验内容:
1)给定数据如下:
x:
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)已知一组数据:
x:
0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1
y:
-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
#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的值:
");
printf("%f",a0[i][1]);
printf("得到的对应的函数值:
");
printf("%f\n",y[i]);}
printf("\n");
for(i=0;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;
for(i=0;i {for(j=0;j {for(k=0;k {A[i][j]+=a1[i][k]*a0[k][j];}
}
}
for(i=0;i {for(j=0;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);
printf("得到的幂函数x的系数是:
%f\n",m1);
printf("得到的幂函数x的指数是:
%f\n",n);
}
(2)最小二乘法求多项式
#include
#include
#include
#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;
inti,j,k;
for(i=0;i for(j=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;
for(i=0;i {for(j=0;j {b[j][i]=a[i][j];}}
}
voidinit(floatx_y[][2],intn)
{inti;
printf("请输入%d个已知点:
\n",n);
for(i=0;i {printf("(x%dy%d):
",i,i);
scanf("%f%f",}
}
voidget_A(floatmatrix_A[][T+1],floatx_y[][2],intn)
{inti,j;
for(i=0;i {for(j=0;j {matrix_A[i][j]=w*pow_n(x_y[i][0],j);}}
}
voidprint_array(floatarray[][T+1],intn)
{inti,j;
for(i=0;i {for(j=0;j {printf("%-g",array[i][j]);}
printf("\n");}
}
voidconvert(floatargu[][T+2],intn)
{inti,j,k,p,t;
floatrate,temp;
for(i=1;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("方程组无解!
\n");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[])
{inti,j;
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;
floattemp;
for(i=0;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;
for(i=0;i {for(j=0;j {if(j==T+1)
coef_form[i][j]=y[i];
else
coef_form[i][j]=coef_A[i][j];}}
}
voidprint_root(floata[],intn)
{inti,j;
printf("%d个点的%d次拟合的多项式系数为:
\n",n,T);
for(i=0;i {printf("a[%d]=%g,",i+1,a[i]);}
printf("\n");
printf("拟合曲线方程为:
\ny(x)=%g",a[0]);
for(i=1;i {printf("+%g",a[i]);
for(j=0;j {printf("*x");}
}
printf("\n");}
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);
printf("矩阵A为:
\n");
篇二:
最小二乘法实验报告
计算方法与实习实验报告
2.已知实验数据如下:
试用形如y=a+b?
?
2的抛物线进行最小二乘拟合。
程序如下:
#include
doublekk()
{
doublek=0;
for(inti=0;i {k+=1*1;}
returnk;
}
doublekj(doublex[4])
{
doublek=0;
for(inti=0;i {k+=x[i]*x[i];}
returnk;
}
doublejj(doublex[4])
{
doublek=0;
for(inti=0;i {k+=x[i]*x[i]*x[i]*x[i];}
returnk;
}
doubleyk(doubley[4])
{
doublek=0;
for(inti=0;i {k+=y[i];}
returnk;
}
doubleyj(doublex[4],doubley[4])
{
doublek=0;
for(inti=0;i {k+=y[i]*x[i]*x[i];}
returnk;
}
voidmain(void)
{
doublex[4]={1.0,2.5,3.5,4.0};
doubleY[4]={3.8,1.50,26.0,33.0};
doubleA[2][3];
doublea=0,b=0;
A[0][0]=kk();
A[0][1]=kj(x);
A[1][0]=kj(x);
A[1][1]=jj(x);
A[0][2]=yk(Y);
A[1][2]=yj(x,Y);
doublek=A[1][0]/A[0][0];
A[1][0]=0;
A[1][1]=A[1][1]-k*A[0][1];
A[1][2]=A[1][2]-k*A[0][2];
b=A[1][2]/A[1][1];
a=(A[0][2]-A[0][1]*b)/A[0][0];
cout }
拟合结果如
结果与答案几乎没有误差,可以认为算法正确,实验基本成功。
心得:
经过本次试验,认识了最先二乘法在曲线拟合时的优点,这激发了我认真学习最小二乘法拟合曲线的兴趣,一定要好好掌握并在生活中加以应用。
篇三:
数值计算实验曲线拟合的最小二乘法
实验报告
实验课程名称数值计算
实验项目名称曲线拟合的最小二乘法
年级20XX级
专业信计
学生姓名成富
学号1007010167
理学院
实验时间:
20XX年4月9日
学生实验室守则
一、按教学安排准时到实验室上实验课,不得迟到、早退和旷课。
二、进入实验室必须遵守实验室的各项规章制度,保持室内安静、整洁,不准在室内打闹、喧哗、吸烟、吃食物、随地吐痰、乱扔杂物,不准做与实验内容无关的事,非实验用品一律不准带进实验室。
三、实验前必须做好预习(或按要求写好预习报告),未做预习者不准参加实验。
四、实验必须服从教师的安排和指导,认真按规程操作,未经教师允许不得擅自动用仪器设备,特别是与本实验无关的仪器设备和设施,如擅自动用或违反操作规程造成损坏,应按规定赔偿,严重者给予纪律处分。
五、实验中要节约水、电、气及其它消耗材料。
六、细心观察、如实记录实验现象和结果,不得抄袭或随意更改原始记录和数据,不得擅离操作岗位和干扰他人实验。
七、使用易燃、易爆、腐蚀性、有毒有害物品或接触带电设备进行实验,应特别注意规范操作,注意防护;若发生意外,要保持冷静,并及时向指导教师和管理人员报告,不得自行处理。
仪器设备发生故障和损坏,应立即停止实验,并主动向指导教师报告,不得自行拆卸查看和拼装。
八、实验完毕,应清理好实验仪器设备并放回原位,清扫好实验现场,经指导教师检查认可并将实验记录交指导教师检查签字后方可离去。
九、无故不参加实验者,应写出检查,提出申请并缴纳相应的实验费及材料消耗费,经批准后,方可补做。
十、自选实验,应事先预约,拟订出实验方案,经实验室主任同意后,在指导教师或实验技术人员的指导下进行。
十一、实验室内一切物品未经允许严禁带出室外,确需带出,必须经过批准并办理手续。
学生所在学院:
理学院专业:
信计班级:
101