在本例中,自变量为序号,1~n,因变量为待测数据
//******************最小二乘线性拟合*************************
double cal_xx(int start, int end, double avg_x);
double cal_yy(int start, int end, double avg_y, double *y);
double cal_xy(int start, int end, double avg_x, double avg_y, double *y);
double average_x(int start, int end);
double average_y(int start, int end, double *y);
void Line_Fit(int start, int end, double *y, double &b, double &a)
{
double x_avg = average_x(start, end); //对自变量求平均值
double y_avg = average_y(start, end, y); //对因变量求平均值
double L_xx = cal_xx(start, end, x_avg);
double L_yy = cal_yy(start, end, y_avg, y);
double L_xy = cal_xy(start, end, x_avg, y_avg, y);
b = L_xy / L_xx; //回归系数,即斜率
a = y_avg - b * x_avg; //回归常数
}
double average_x(int start, int end) //相当于求中位数
{
return (double)start + (end - start)/2.0;
}
double average_y(int start, int end, double *y)
{
double average = 0;
for(int i=start; i<=end; i++)
average += y[i];
average /= (end-start+1);
return average;
}
double cal_xx(int start, int end, double avg_y)
{
double sum = 0;
for(int i=start; i<=end; i++)
sum += pow(i-avg_y, 2);
return sum;
}
double cal_yy(int start, int end, double avg_y, double *y)
{
double sum = 0;
for(int i=start; i<=end; i++)
sum += pow(y[i]-avg_y, 2);
return sum;
}
double cal_xy(int start, int end, double avg_x, double avg_y, double *y)
{
double sum = 0;
for(int i=start; i<=end; i++)
sum += (i-avg_x)*(y[i]-avg_y);
return sum;
}