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;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值