C代码:一阶二阶多项式曲线拟合

来源:互联网 发布:淘宝网男运动套装 编辑:程序博客网 时间:2024/05/24 01:34
double sum_1(int *p, int m)//求和{    int i;    double sum = 0.0;    for (i = 0; i < m; i++)    {        sum += *(p + i);    }    return sum;}double sum_2(int *p, int m)//求平方和{    int i;    double sum = 0.0;    for (i = 0; i < m; i++)    {        sum += (*(p + i))*(*(p + i));    }    return sum;}double sum_3(int *p, int m)//求立方和{    int i;    double sum = 0.0;    for (i = 0; i < m; i++)    {        sum += pow(*(p + i), 3);    }    return sum;}double sum_4(int *p, int m)//求四次方和{    int i;    double sum = 0.0;    for (i = 0; i < m; i++)    {        sum += pow(*(p + i), 4);    }    return sum;}double sum_5(int *p, int*q, int m)//求乘积和xy{    int i;    double sum = 0.0;    for (i = 0; i < m; i++)    {        sum += (*(p + i))*(*(q + i));    }    return sum;}double sum_6(int *p, int*q, int m)//求乘积和x2y{    int i;    double sum = 0.0;    for (i = 0; i < m; i++)    {        sum += (*(p + i))*(*(p + i))*(*(q + i));    }    return sum;}

p1[0],p1[1]一阶拟合系数
p2[0],p2[1],p2[2]二阶拟合系数

sum_x = sum_1(x, x_length);    sum_y = sum_1(data_r, x_length);    sum_x2 = sum_2(x, x_length);    sum_x3 = sum_3(x, x_length);    sum_x4 = sum_4(x, x_length);    sum_xy = sum_5(x, data_r, x_length);    sum_x2y = sum_6(x, data_r, x_length);    //一阶拟合    p1[1] = (sum_y*sum_x2 - sum_xy*sum_x) / (x_length*sum_x2 - sum_x*sum_x);    p1[0] = (x_length*sum_xy - sum_x*sum_y) / (x_length*sum_x2 - sum_x*sum_x);    //二阶拟合    double k1 = sum_x / x_length;    double k2 = sum_x2 / x_length;    double k3 = (sum_x3 - k2*sum_x) / (sum_x2 - k1*sum_x);    p2[0] = (sum_x2y - k2*sum_y - k3*(sum_xy - k1*sum_y)) / ((sum_x4 - k2*sum_x2) - k3*(sum_x3 - k1*sum_x2));    p2[1] = (sum_xy - k1*sum_y - (sum_x3 - k1*sum_x2)*p2[0]) / (sum_x2 - k1*sum_x);    p2[2] = (sum_y - sum_x2*p2[0] - sum_x*p2[1]) / x_length;