北大经济学院招生简章:求非线性最小二乘法的算法及代码.

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/01 15:58:08
想要模拟一非线性曲线,
急需了解非线性最小二乘的原理,
并希望有相关的原代码.
Thanks

main ()
{
int n,i,flag2;
char flag1='y';
float ar[50],br[50],x,y,xe,ye,xye,xxe,sx,sy,sxy,sxx,a,b;
printf ("\n欢迎使用最小二乘法数据处理程序\n");
printf ("\n说明:本程序运行结果保留小数点后三位\n");
for (;flag1=='y'||flag1=='Y';)
{printf ("\n请输入您要处理的数据的组数:");
printf ("\n*****提示:本程序定义一对x,y值为一组数据:");
scanf ("%d",&n);
if (n>50) {printf ("\n对不起,本程序暂时无法处理50组以上的数据");
continue;
}
printf ("\n请选择您的数据的处理方式:");
printf ("\n\t1.y与x为一次线性关系");
printf ("\n\t2.y与x的2次为线性关系\n");
scanf ("%d",&flag2);
if (flag2>2||flag2<1) {printf ("\n对不起,您的输入不正确\n");continue;}
for (i=0;i<n;i++)
{printf ("\n请输入第%2d个x的值\tx%2d=",i+1,i+1);
scanf (" %f",&ar[i]);
printf ("\n请输入对应的y的值:\ty%2d=",i+1);
scanf (" %f",&br[i]);
}
if (flag2!=1)
{for (i=0;i<n;i++)
br[i]=br[i]/(ar[i]*ar[i]);
}
sx=sy=sxx=sxy=0;
for (i=0;i<n;i++)
{sx=sx+ar[i];
sy=sy+br[i];
sxx=sxx+ar[i]*ar[i];
sxy=sxy+ar[i]*br[i];
}
xe=sx/n;
ye=sy/n;
xye=sxy/n;
xxe=sxx/n;
b=(xye-xe*ye)/(xxe-xe*xe);
a=ye-b*xe;
printf ("\n对您输入的数据的处理已经完成,结果如下:");
printf ("\n\ta=%8.3f\n\tb=%8.3f\n",a,b);
printf ("\nb即为拟合直线的斜率,a为截距\n");
printf ("\n*********************************************************\n");
printf ("\n是否继续使用本程序处理数据?(y/n)?");
scanf (" %c",&flag1);
if (flag1=='y'||flag1=='Y') continue;
else if (flag1=='n'||flag1=='N') break;
else {printf ("\n***操作非法,本程序将关闭***\n");
exit (0);
}
}
exit (0);
}

用matlab的函数来做的话,就不需要了