C语言实现最小二乘多项式拟合

输入

x,y:待拟合的x,y
n:输入数据长度
m:阶数+1
a:输出的各项系数,a[0]为0次项,a[1]为1次…大小为阶数+1

结果

设输入的y均值为mean;
那么对于待预测数据xx,拟合的结果yy=a[0]+a[1](xx-mean)+a[2](xx-mean)^2 +…a[m-1](xx-mean)^n

解释

在这里插入图片描述

代码

BOOL hpir1(F64 x[], F64 y[], int  n, F64 a[], int m, F64 dt[])
{
    
     
    //the polynomial fit function
    int i, j, k;
    F64 z, p,cc, g, q, d1, d2, s[20], t[20], b[20];
    for (i = 0; i <= m - 1; i++) a[i] = 0.0;
    if (m > n) m = n;
    if (m > 20) m = 20;
    z = 0.0;
    for (i = 0; i <= n - 1; i++) z = z + x[i] / (1.0 * n);
    b[0] = 1.0; d1 = 1.0 * n; p = 0.0; cc = 0.0;
    for (i = 0; i <= n - 1; i++)
    {
    
    
        p = p + (x[i] - z); cc = cc + y[i];
    }    
    cc = cc / d1; p = p / d1;
    a[0] = cc * b[0];

    if (m > 1)
    {
    
    
        t[1] = 1.0; t[0] = -p;
        d2 = 0.0; cc = 0.0; g = 0.0;
        for (i = 0; i <= n - 1; i++)
        {
    
    
            q = x[i] - z - p; d2 = d2 + q * q;
            cc = cc + y[i] * q;
            g = g + (x[i] - z) * q * q;
        }
        cc = cc / d2; p = g / d2; q = d2 / d1;
        d1 = d2;
        a[1] = cc * t[1]; a[0] = cc * t[0] + a[0];
    }
    for (j = 2; j <= m - 1; j++)
    {
    
    
        s[j] = t[j - 1];
        s[j - 1] = -p * t[j - 1] + t[j - 2];
        if (j >= 3)
            for (k = j - 2; k >= 1; k--)
                s[k] = -p * t[k] + t[k - 1] - q * b[k];
        s[0] = -p * t[0] - q * b[0];
        d2 = 0.0; cc = 0.0; g = 0.0;
        for (i = 0; i <= n - 1; i++)
        {
    
    
            q = s[j];
            for (k = j - 1; k >= 0; k--)
                q = q * (x[i] - z) + s[k];
            d2 = d2 + q * q; cc = cc + y[i] * q;
            g = g + (x[i] - z) * q * q;
        }
        cc = cc / d2; p = g / d2; q = d2 / d1;
        d1 = d2;
        a[j] = cc * s[j]; t[j] = s[j];
        for (k = j - 1; k >= 0; k--)
        {
    
    
            a[k] = cc * s[k] + a[k];
            b[k] = t[k]; t[k] = s[k];
        }
    }
    dt[0] = 0.0; dt[1] = 0.0; dt[2] = 0.0;
    for (i = 0; i <= n - 1; i++)
    {
    
    
        q = a[m - 1];
        for (k = m - 2; k >= 0; k--)
            q = a[k] + q * (x[i] - z);
        p = q - y[i];
        if (fabs(p) > dt[2]) dt[2] = fabs(p);
        dt[0] = dt[0] + p * p;
        dt[1] = dt[1] + fabs(p);
    }
return 1;
}

猜你喜欢

转载自blog.csdn.net/weixin_44738872/article/details/127990823
今日推荐