天天看點

C代碼:一階二階多項式曲線拟合

double sum_1(int *p, int m)//求和
{
    int i;
    double sum = ;
    for (i = ; i < m; i++)
    {
        sum += *(p + i);
    }
    return sum;
}

double sum_2(int *p, int m)//求平方和
{
    int i;
    double sum = ;
    for (i = ; i < m; i++)
    {
        sum += (*(p + i))*(*(p + i));
    }
    return sum;
}

double sum_3(int *p, int m)//求立方和
{
    int i;
    double sum = ;
    for (i = ; i < m; i++)
    {
        sum += pow(*(p + i), );
    }
    return sum;
}

double sum_4(int *p, int m)//求四次方和
{
    int i;
    double sum = ;
    for (i = ; i < m; i++)
    {
        sum += pow(*(p + i), );
    }
    return sum;
}

double sum_5(int *p, int*q, int m)//求乘積和xy
{
    int i;
    double sum = ;
    for (i = ; i < m; i++)
    {
        sum += (*(p + i))*(*(q + i));
    }
    return sum;
}

double sum_6(int *p, int*q, int m)//求乘積和x2y
{
    int i;
    double sum = ;
    for (i = ; 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[] = (sum_y*sum_x2 - sum_xy*sum_x) / (x_length*sum_x2 - sum_x*sum_x);
    p1[] = (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[] = (sum_x2y - k2*sum_y - k3*(sum_xy - k1*sum_y)) / ((sum_x4 - k2*sum_x2) - k3*(sum_x3 - k1*sum_x2));
    p2[] = (sum_xy - k1*sum_y - (sum_x3 - k1*sum_x2)*p2[]) / (sum_x2 - k1*sum_x);
    p2[] = (sum_y - sum_x2*p2[] - sum_x*p2[]) / x_length;