- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
曲线拟合的方法及过程
一、课程设计题目:
对于函数
从开始,取步长的20个数据点,求五次最小二乘拟合多项式
其中
二、原理分析
(1)最小二乘法的提法
当数据量大且由实验提供时,不宜要求近似曲线严格地经过所有数据点,亦即不应要求拟合函数在处的偏差(又称残差)
(i=1,2,…,m)
都严格的等于零,但是,为了使近似曲线能尽量反应所给数据点的变化趋势,要求偏差适当的小还是必要的,达到这一目标的途径很多,例如,可以通过使最大偏差最小来实现,也可以通过使偏差绝对值之和最小来实现……,考虑到计算方便等因素,通常用使得偏差平方和最小(成为最小二乘原则)来实现。
按最小二乘原则选择近似函数的方法称为最小二乘法。
用最小二乘法求近似函数的问题可以归结为:对于给定数据 (i=1,2,…,m),要求在某个函数类Φ中寻求一个函数,使
(1-1)
其中为函数类中任意函数。
确定函数类,即确定的形式。这不是一个单纯的数学问题,还与其他领域的一些专业知识有关。在数学上,通常的做法是将数据点描绘在坐标纸上,然后根据这些点的分布情况来选择的形式。
球最小二乘法的解,即求满足条件(1-1)的近似函数。
(3)最小二乘法的实验原理
设具有如下形式
=F (1-2)
其中nm, (k=0,1,…,n)是待定参数,求具有这种形式的最小二乘解的实质,就是要适当选择= (k=0,1,…,n),使相应的函数
(1-3)
满足条件(1-1),也就是说,点是多元函数
的极小点,从而使满足方程组
,(k=0,1,…,n) (1-4)
因此,可以通过解上述方程组(称为法方程组)来求取(k=0,1,…,n),以便获得最小二乘解。
必须指出,在一般情况下,法方程组不一定是线性方程组,但是,若能表示成一组已知函数的线性组合,即
(1-5)
则相应的发方程组必须是线性方程组。事实上,此时,
令 ,(k=0,1,…,n)即得方程组
若引用记号
(1-6)
则所得的方程组可表示成
(k=0,1,…,n)
即
(1-7)
这是一个系数矩阵为对称矩阵的线性方程组,可以证明,当
线性无关时,存在有唯一解 (k=0,1,…,n)
并且相应的函数就是满足(1-1) 的最小二乘解。
作为曲线拟合的一种常见情况,若讨论的是代数多项式拟合,即
(1-8)
此时只要将(1-5)中的函数依次看成函数则由(1-6)与(1-7)立即可得相应的法方程组
其中“”是“”的简写。
综上分析,求最小二乘解的步骤可以归结为:先根据的特点,建立确定(k=0,1,…,n)的法方程组;然后根据写法方程组求取最小二乘解对应的参数。
三、程序流程图
四、程序设计
#includestdio.h
#includemath.h
static double x[20],y[20];
double main()
{ double h=0.1;
int i=0;
double aa[6][6],b[6];
int l,j,k;
for(i=0;i20;i++)
{
x[0]=0.0;x[i]=x[0]+i*h;
y[i]=x[i]-exp(double(-x[i]));
}
for(i=0;i20;i++)
{ printf(x[%d]=%8.6f,i,x[i]);printf(y[%d]=%8.6f,i,y[i]);
}
aa[0][0]=0.0;
double n=0.0;
for(l=0;l6;l++)
{for(j=0;j6;j++)
{ int t;
t=l+j;
double m=0.0;
for(k=0;k20;k++)
{
m=m+pow( (x[k]-0.95),t);
}
printf(aa[%d][%d]=%8.6f,l,j,m);
}
}
for(l=0;l6;l++)
{
int w; w=l; double n=0.0;
for(k=0;k20;k++)
{
n=n+pow( (x[k]-0.95),w)*y[k];
}
printf(b[%d]=%8.6f,l,n);
}
}
上面程序的结果显示
#includemath.h
#includestdio.h
#define N 6
main()
{
double A[N][N+1]={
{20.00,0.000,6.650,0.0000,3.966725,0.0000,9.913816},
{0.000,6.650
原创力文档


文档评论(0)