最小二乘法难题

来源:百度知道 编辑:UC知道 时间:2024/07/02 15:23:45
某类疾病发生率y%o和年龄段x(每五年为一段,例如0~5岁为第一段,6~10岁为第二段,……)之间有形如y=a*(ebx){e的bx次幂}的关系。试根据观测得到的如下数据表,用最小二乘法确定式中的参数a和b,并计算相应的均方误差与最大偏差(注意:本题在方法应用上需要经过一定努力,才能得到较理想结果。)
X 1 2 3 4 5 6 7 8 9
Y 0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02
X 10 11 12 13 14 15 16 17 18 19
Y 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8
小弟感激不尽啊!(用C语言编写)

参考答案:如果在乎的没有那么多,想要的没有那么多,生活便会简单得很多。

#include<stdio.h>
#include<math.h>
int main(void)
{
double a,b,e,m,f,f1,f2,g,g1,g2,c,d;
double x[19],y[19];
int i,j;
for(i=0;i<19;i++)
x[i]=i+1;
for(i=0;i<19;i++){
scanf("%lf",&y[i]);
}
scanf("%lf",&a);
scanf("%lf",&b);
f=f1=f2=g=g1=g2=0;
for(j=0;j<10;j++){
for(i=0;i<19;i++){
f=f+2*(a*exp((i+1)*b)-y[i])*exp((i+1)*b);
f1=f1+2*exp(2*(i+1)*b);
f2=f2+4*(i+1)*a*exp(2*(i+1)*b)-2*(i+1)*y[i]*exp((i+1)*b);
g=g+2*(a*exp((i+1)*b)-y[i])*(i+1)*a*exp((i+1)*b);
g1=g1+4*(i+1)*a*exp(2*(i+1)*b)-2*(i+1)*y[i]*exp((i+1)*b);
g2=g2+4*pow((i+1)*a,2)*exp(2*(i+1)*b)-2*pow((i+1),2)*a*y[i]*exp((i+1)*b);
}
c=f1*a+f2*b-f;
d=g1*a+g2*b-g;
b=(d-c*(g1/f1))/(g2-f2*(g1/f1));
a=(c-f2*b)/f1;
e=0;
m=0;
for(i=0;i<19;i++)
e=e+pow((a*exp(