用过最小二乘法曲线拟合的高手请进,看看为何不准??

ygchboy 2006-08-11 10:34:32
以下这个最小二乘法的源代码是网上搜到的最多的例子,
bool CalculateCurveParameter(float *X,float *Y,long M,long N,float *A)
{
//X,Y -- X,Y两轴的坐标
//M -- 结果变量组数
//N -- 采样数目
//A -- 结果参数

register long i,j,k;
float Z,D1,D2,C,P,G,Q;
float B[50],T[50],S[50];

if(M>N)M=N;
for(i=0;i<M;i++)
A[i]=0;
Z=0;
B[0]=1;
D1=N;
P=0;
C=0;
for(i=0;i<N;i++)
{
P=P+(*X)-Z;
C=C+(*Y);
}
C=C/D1;
P=P/D1;
A[0]=C*B[0];
if(M>1)
{
T[1]=1;
T[0]=-P;
D2=0;
C=0;
G=0;
for(i=0;i<N;i++)
{
Q=(*X)-Z-P;
D2=D2+Q*Q;
C=(*Y)*Q+C;
G=((*X)-Z)*Q*Q+G;
}
C=C/D2;
P=G/D2;
Q=D2/D1;
D1=D2;
A[1]=C*T[1];
A[0]=C*T[0]+A[0];
}
for(j=2;j<M;j++)
{
S[j]=T[j-1];
S[j-1]=-P*T[j-1]+T[j-2];
if(j>=3)
{
for(k=j-2;k>=1;k--)
S[k]=-P*T[k]+T[k-1]-Q*B[k];
}
S[0]=-P*T[0]-Q*B[0];
D2=0;
C=0;
G=0;
for(i=0;i<N;i++)
{
Q=S[j];
for(k=j-1;k>=0;k--)
Q=Q*((*X)-Z)+S[k];
D2=D2+Q*Q;
C=(*Y)*Q+C;
G=((*X)-Z)*Q*Q+G;
}
C=C/D2;
P=G/D2;
Q=D2/D1;
D1=D2;
A[j]=C*S[j];
T[j]=S[j];
for(k=j-1;k>=0;k--)
{
A[k]=C*S[k]+A[k];
B[k]=T[k];
T[k]=S[k];
}
}
return true;
}
在这里我们可以知道M为阶数,A为系数。我想验证一下这个函数,输入了两个数组X[4]={1,2,3,4},Y【4】={1,2,3,4},阶数为M=1,N=4,按照道理它应该给我们生成a【0】=0,a【1】=1,即y=x,但是它居然生成了a【0】=1,a【1】=0,即y=1的函数,我很茫然。求救各位高手告诉我为什么,谢谢。
...全文
225 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingtoo008 2006-08-12
  • 打赏
  • 举报
回复
路过...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧