帮忙啊,急求最小二乘法算法程序

adashm 2005-04-20 09:15:25
我要对二元一次方程y=ax1+bx2进行a,b系数估计,谁能给出源程序,急等
...全文
258 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fisher_kevin 2005-04-21
  • 打赏
  • 举报
回复
这是我编的最小二乘法多项式拟合的函数,我正在做,这个函数可能再用结构体当参数调用是有一些问题,修改一下做二次曲线拟合没有问题。不用解方程组,用正交法多项式法拟合。如果还解决不了你的问题的话,强烈建议你去查查《计算机常用算法》


struct stripe
{
double x_axis;
double y_axis;
};
struct stripe ori[],wave_2[],wave_3[];

void fit(struct stripe a[],double c[],int n,int m) /*输入数组(峰值),输出数组,拟合点数,阶数*/
{
double d[10];
double b[10];
double t[10];
double s[10];
double q[10];
double al[10];
double be[10];
double x,y,z;
int i,j,k,l,p;

/*第零级*/
b[0]=1;
d[0]=n;
y=0;
x=0;
for(i=0;i<n;i++)
{
x=x+a[i].x_axis;
y=y+a[i].y_axis;
}
q[0]=y/d[0];
al[0]=x/d[0];
c[0]=q[0]*b[0];

/*第一级*/
t[0]=-al[0];
t[1]=1;
d[1]=0;
x=y=0;
for(i=0;i<n;i++)
{
d[1]=d[1]+(t[1]*a[i].x_axis+t[0])*(t[1]*a[i].x_axis+t[0]);
y=y+a[i].y_axis*(t[1]*a[i].x_axis+t[0]);
x=x+a[i].x_axis*(t[1]*a[i].x_axis+t[0])*(t[1]*a[i].x_axis+t[0]);
}
q[1]=y/d[1];
al[1]=x/d[1];
be[1]=d[1]/d[0];
c[0]=c[0]+q[1]*t[0];
c[1]=q[1]*t[1];

/*二级以上*/
if(m>=2)
{
for(j=2;j<=m;j++)
{
s[0]=-al[j-1]*t[0]-be[j-1]*b[0];
for(k=j-2;k>=1;k--)
{
s[k]=-al[j-1]*t[k]-be[j-1]*b[k];
}
s[j-1]=-al[j-1]*t[j-1]+t[j-2];
s[j]=t[j-1];
/*计算d[j]*/
d[j]=0;
for(i=1;i<=n;i++)
{
/*计算Q(x)2*/
z=s[0];
for(l=1;l<=j;l++)
{
z=z+s[l]*pow(a[i].x_axis,l);
}
z=z*z;
d[j]=d[j]+z;
}
/*计算q[j]*/
q[j]=0;
for(i=1;i<=n;i++)
{
z=s[0];
for(l=1;l<=j;l++)
{
z=z+s[l]*pow(a[i].x_axis,l);
}
z=z*a[i].y_axis;
q[j]=q[j]+z;
}
q[j]=q[j]/d[j];
/*计算al[j]*/
p=0;
for(i=1;i<=n;i++)
{
z=s[0];
for(l=1;l<=j;l++)
{
z=z+s[l]*pow(a[i].x_axis,l);
}
z=z*z*a[i].x_axis;
p=p+z;
}
al[j]=p/d[j];
be[j]=d[j]/d[j-1];
c[j]=q[j]*s[j];
for(k=j-1;k>=0;k--)
{
c[k]=c[k]+q[j]*s[k];
}
for(k=j-1;k>=0;k--)
{
b[k]=t[k];
}
for(k=j;k>=0;k--)
{
t[k]=s[k];
}
}
}
}
xjp6688 2005-04-21
  • 打赏
  • 举报
回复
www.vcok.com
找找看
zhang_jiang 2005-04-20
  • 打赏
  • 举报
回复
设m个点(X_i, Y_i), i=0, 1, ..., m
要求S(x)=a_0*Z_0(x)+a_1*Z_1(x)+...+a_n*Z_n(x)
如:Z_0, Z_1,..., Z_n可取: 1, x, x^2, ..., x^(n-1)

定义[Z_j, Z_k]={w(X_i)*Z_j(X_i)*Z_k(x_i)对i从0到m求和}.
[f, Z_k]={w(X_i)*f(X_i)*Z_k(x_i)对i从0到m求和}.
其中, w(X_i)为X_i点的样本的权重.f(X_i)为X_i出样本的值(即Y_i).

==>
n
SUM [Z_k, Z_j]a_j = [f, Z_k]
j=0
解这个方程组得到a_i即可.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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