源代码:
#include <stdio.h>
/*********************************************************************
* 宏定义
**********************************************************************/
/*********************************************************************
* 数据fifo长度
**********************************************************************/
#define LEN 100
/*********************************************************************
* 数据结构
**********************************************************************/
/*********************************************************************
* 数据单元
**********************************************************************/
struct _Data_Unit
{
float x;
float y;
};
/*********************************************************************
* 数据fifo
**********************************************************************/
struct _Data
{
struct _Data_Unit data[LEN];
int len;
};
/*********************************************************************
* 全局变量
**********************************************************************/
/*********************************************************************
* 数据fifo
**********************************************************************/
struct _Data Data =
{
.len = 0
};
/*********************************************************************
* 函数
**********************************************************************/
/*********************************************************************
* 压入数据
*参数:x:测量数据x
* y:测量数据y
**********************************************************************/
void push(float x,float y)
{
int i = 0;
if (Data.len < LEN)
{
Data.data[Data.len].x = x;
Data.data[Data.len++].y = y;
return;
}
//数据移动,去掉最后一个数据
for (i = 0;i < LEN - 1;i++)
{
Data.data.x = Data.data[i + 1].x;
Data.data.y = Data.data[i + 1].y;
}
Data.data[LEN].x = x;
Data.data[LEN].y = y;
Data.len = LEN;
}
/*********************************************************************
* 计算估值
*拟合曲线y = a * x + b
*参数:x:需要估值的数的x值
*返回:估值y
**********************************************************************/
float calc(float x)
{
int i = 0;
float mean_x = 0;
float mean_y = 0;
float num1 = 0;
float num2 = 0;
float a = 0;
float b = 0;
//求t,y的均值
for (i = 0;i < Data.len;i++)
{
mean_x += Data.data.x;
mean_y += Data.data.y;
}
mean_x /= Data.len;
mean_y /= Data.len;
printf("mean_x = %f,mean_y = %f\n",mean_x,mean_y);
for (i = 0;i < Data.len;i++)
{
num1 += (Data.data.x - mean_x) * (Data.data.y - mean_y);
num2 += (Data.data.x - mean_x) * (Data.data.x - mean_x);
}
b = num1 / num2;
a = mean_y - b * mean_x;
printf("a = %f,b = %f\n",a,b);
return (a + b * x);
}
int main()
{
float length[10] = {208,152,113,227,137,238,178,104,191,130};
float width[10] = {21.6,15.5,10.4,31.0,13.0,32.4,19.0,10.4,19.0,11.8};
int i = 0;
for (i = 0;i < 10;i++)
{
push(length,width);
}
printf("300m长度的战舰预测宽度为为%f米\n",calc(300));
getchar();
return 0;
}
|