最小二乘法曲线拟合实验报告.docx
- 文档编号:2082161
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:6
- 大小:18.88KB
最小二乘法曲线拟合实验报告.docx
《最小二乘法曲线拟合实验报告.docx》由会员分享,可在线阅读,更多相关《最小二乘法曲线拟合实验报告.docx(6页珍藏版)》请在冰豆网上搜索。
最小二乘法曲线拟合实验报告
竭诚为您提供优质文档/双击可除
最小二乘法曲线拟合实验报告
篇一:
实验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;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最小二乘法 曲线拟合 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)