可以先通过这里来理解一下 线性拟合和二次拟合方程
http://wenku.baidu.com/link?url=cr0U9oPZ4KxO-s34ORBolH42hjux2dwH2DtRJEKTI0xsiDk2y28wyU6ZLlbRSQfCNhtdlz0nORxEYQ94n-MLITaMFR2PbVel-s_KJXpV1mG
随后可以通过这里
http://wenku.baidu.com/link?url=Y8RWDFJMQKbRkQeNTfMqeFhexr15CZkK7cywH3--igHKbQ0_ROrcNs12nHBDC2T51P4FpPcbvbYQCkzBkvupunOCkk1b0igW1GjLuWptRCS
里面有C 得 code 什么得可以应用
代码如下 一阶和二阶
#include<stdio.h>
#include<cmath>
double sum_1(double *p, int m)
{
int i;
double sum = 0.0;
for(i = 0; i<m; i++)
{
sum += *(p+i);
}
return sum;
}
double sum_2(double *p, int m)
{
int i;
double sum = 0.0;
for(i = 0; i<m; i++)
{
sum += (*(p+i)*(*(p+i)));
}
return sum;
}
double sum_3(double *p,double *q, int m)
{
int i;
double sum = 0.0;
for(i = 0; i<m; i++)
{
sum += (*(p+i)*(*(q+i)));
}
return sum;
}
double sum_4(double *p,double *q, int m)
{
int i;
double sum = 0.0;
for(i = 0; i<m; i++)
{
sum += (( *(p+i) ) * ( *(p+i) )*( *(q+i)) );
}
return sum;
}
double sum_5(double *p, int m)
{
int i;
double sum = 0.0;
for(i = 0; i < m; i++)
{
sum += pow(*(p+i),3);
}
return sum;
}
double sum_6(double *p, int m)
{
int i;
double sum = 0.0;
for(i = 0; i < m; i++)
{
sum += pow(*(p+i),4);
}
return sum;
}
int main()
{
double x[50],y[50],a0 = 0, a1 = 0, a = 0;
double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0, sum_y = 0, sum_xy = 0, sum_x2y = 0;
int i, c = 0;
double k = 0, k1 = 0,k2 = 0, b0 = 0, b1 = 0, b2 = 0;
printf("请输入数据少于50个多于2个且小数位数不超过3位,不必输入括号,输入完毕后按回车确认,全部输入完毕请输入字符e确认结束:\n");
for(i = 0;i<50; i++)
{
printf("(x:%d,y:%d):", i+1,i+1);
if(scanf("%lf %lf",&x[i],&y[i]) == 2)
{
c++;
}
else if(getchar() == 'e')
{
printf("\n");
break;
}
else
{
printf("您输入的数据中有非数字,且不是e, 请重新输入地%d个数据:\n",i+1);
x[i]==y[i] == 0;
i--;
}
}
if(c>1)
{
printf("您输入的数据如下:\n");
for(i = 0; i<c; i++)
{
if(i%3 == 0)
{
printf("\n");
}
printf("(%0.3f,%0.3f)\n", x[i],y[i]);
}
printf("\n\n");
sum_x = sum_1(x,c);
sum_x2 = sum_2(x,c);
sum_x3 = sum_5(x,c);
sum_x4 = sum_6(x,c);
sum_y = sum_1(y,c);
sum_xy = sum_3(x,y,c);
sum_x2y = sum_4(x,y,c);
a = c*sum_x2 - sum_x*sum_x;
a0 = (sum_y* sum_x2 - sum_xy*sum_x)/a;
a1 = (c*sum_xy - sum_x*sum_y)/a;
printf("按照最小二乘法求得拟合1阶直线方程: y = %0.3f x+ (%0.3f) \n\n",a1,a0);
}
if (c>2)
{
k = sum_x/c;
k1 = sum_x2/c;
k2 = (sum_x3 - k1*sum_x)/(sum_x2-k*sum_x);
b2 = (sum_x2y-k1*sum_y-k2*(sum_xy-k*sum_y))/( (sum_x4-k1*sum_x2)-k2*(sum_x3-k*sum_x2) );
b1 = (sum_xy-k*sum_y-(sum_x3-k*sum_x2)*b2)/(sum_x2-k*sum_x);
b0 = (sum_y-sum_x2*b2-sum_x*b1)/c;
printf("按照最小二乘法求得拟合2阶曲线方程: y = %0.3f x^2+(%0.3f)x+(%0.3f)\n\n", b2,b1,b0);
}
return 0;
}