实验3__曲线拟合的最小二乘法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算方法》实验报告
学院:计算机学院
专业:计算机科学与技术
指导教师:爨莹
班级学号:201207010229 姓名:图尔荪托合提
实验三曲线拟合的最小二乘法
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
void main()
{ double a0[16][2],a1[2][16],A[2][2],Y[2];
int i,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};
double m0,m1,n;
for(i=0;i<=15;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<=15;i++)
for(j=0;j<=1;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<=1;i++)
{for(j=0;j<=1;j++)
{for(k=0;k<=15;k++)
{A[i][j]+=a1[i][k]*a0[k][j];}
}
}
for(i=0;i<=1;i++)
{for(j=0;j<=15;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
#define N 11//N个点
#define T 3 //T次拟合
#define W 1//权函数
#define PRECISION 0.00001
float pow_n(float a,int n)
{int i;
if(n==0)
return(1);
float res=a;
for(i=1;i {res*=a;} return(res);} void mutiple(float a[][N],float b[][T+1],float c[][T+1]) {float res=0; int i,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;}} } void matrix_trans(float a[][T+1],float b[][N]) {int i,j; for(i=0;i {for(j=0;j {b[j][i]=a[i][j];}}