首先根据已知点的分布判断是几阶函数,再拟合出各次项系数。
c++代码如下:
#include "math.h"
#include "stdio.h"
#define N 7
int main(){
float a[10][10], x[N + 1], y[N + 1], s, t[10], d, t1;
int i, j, k, m = 2, l; //m为阶数
for(i=1;i<=N;i++){
scanf("%f %f",&x[i],&y[i]);
}
scanf("%d",&m);
for (i = 0; i <= m; i++){
s = 0;
for (k = 1; k <= N; k++)
s = s + pow(x[k], i)*y[k];
a[i][m + 1] = s;
for (j = 0; j <= m; j++){
s = 0;
for (k = 1; k <= N; k++)
s = s + pow(x[k], i + j);
a[i][j] = s;
}
}
for (i = 0; i <= m; i++){
for (j = 0; j <= m; j++)
printf("%f", a[i][j]);
printf("\n");
}
//列主元高斯消去法求解线性方程组
for (k = 0; k<m; k++)
{
d = a[k][k];
l = k;
for (i = k + 1; i <= m; i++){
if (a[i][k]>a[l][k]){ d = a[i][k]; l = i; }
}
if (fabs(d)<1e-6){
printf("data error"); break;
}
if (l != k){
for (j = k; j <= m + 1; j++){
t1 = a[l][j]; a[l][j] = a[k][j]; a[k][j] = t1;
}
}
for (i = k + 1; i <= m; i++){
a[i][k] = a[i][k] / a[k][k];
}
for (i = k + 1; i <= m; i++)
for (j = k + 1; j <= m + 1; j++)
a[i][j] = a[i][j] - a[k][j] * a[i][k];
}
for (k = m; k >= 0; k--){
s = 0;
for (j = k + 1; j <= m; j++)
s = s + a[k][j] * t[j];
t[k] = (a[k][m + 1] - s) / a[k][k];
}
printf("%f", t[0]);
for (i = 1; i <= m; i++){
if (t[i]>0) printf("+");
printf("%f*x^%d", t[i], i);
}
return 0;
}