C语言直线拟合算法

#include <stdio.h>
#include <math.h>


typedef struct tagPOINT_2 {
	double x;
	double y;
}POINT_2, *PPOINT_2;

int LineInfo(POINT_2 *pt_input, int ptNumbers, double * k, double * b)
{
	int nRet = 0;
	double X_aver = 0;
	double Y_aver = 0;
	double A = 0;
	double B = 0;
	double _2_XY_av = 0;
	double _2_XX_av = 0;

	do
	{
		if (ptNumbers < 2)
		{
			nRet = -1;
			break;
		}

		for (int loop = 0; loop < ptNumbers; loop++)
		{
			X_aver += pt_input[loop].x;
			Y_aver += pt_input[loop].y;

			_2_XY_av += pt_input[loop].x * pt_input[loop].y;
			_2_XX_av += pt_input[loop].x * pt_input[loop].x;
		}
		X_aver /= ptNumbers;
		Y_aver /= ptNumbers;

		_2_XY_av /= ptNumbers;
		_2_XX_av /= ptNumbers;

		for (int loop = 0; loop < ptNumbers; loop++)
		{
			A += fabs((pt_input[loop].x - X_aver) * (pt_input[loop].y - Y_aver));
			B += fabs((pt_input[loop].x - X_aver) * (pt_input[loop].x - X_aver));
		}

		if (B < 0.000001)
		{
			nRet = -2;
			break;
		}
		//方式一
		//*k = A / B;
		//*b = Y_aver - *k * X_aver;
		//方式二
		*k = (_2_XY_av - X_aver * Y_aver) / (_2_XX_av - X_aver * X_aver);
		*b = Y_aver - (*k) * X_aver;
	} while (0);

	return nRet;
}


int main()
{
	POINT_2 pt[16] = {
	{0,0},
	{5182,5000},
	{10391,10000},
	{15628,15000},
	{20791,20000},
	{26001,25000},
	{31228,30000},
	{36419,35000},
	{41683,40000},
	{46846,45000},
	{52083,50000},
	{57292,55000},
	{62263,60000},
	{67674,65000},
	{72966,70000},
	{83375,80000},
	};
	int ret;
	double k = 0, b = 0;
	ret = LineInfo(pt, 10, &k, &b);
	
	if(ret == 0)
	{
		printf("拟合成功,直线为y = %lf * x + %lf\n", k, b);
	}
	else if(ret == -1)
	{
		printf("拟合失败,传入的点少于二点\n");
	}
	else if(ret == -2)
	{
		printf("拟合失败,传入的点x坐标重合\n");
	}
	else
	{
		printf("error\n");	
	}	
	return 0;
}











 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值