输入
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;
}