线性回归方程

线性回归方程在嵌入式开发中是非常常用的,尤其在参数校准这块应用非常普遍,无论你是写在上位机代码中,还是直接写在嵌入式软件中。
下面是我在PT100校准中写的关于线性回归方程代码。

/*
线性回归方程公式
平均值XA=(X1+X2+...+XN)/N
平均值YA=(Y1+Y2+...+YN)/N
斜率K=((X1-XA)(Y1-YA)+(X2-XA)(Y2-YA)+...)/((X1-XA)(X1-XA)+(X2-XA)(X2-XA)+...)
截距T=YA-K*XA
*/
#define RES_100_REAL_VALUE 9930//0.01oumu
#define RES_110_REAL_VALUE 11050//0.01oumu
#define RES_120_REAL_VALUE 11850//0.01oumu
#define RES_130_REAL_VALUE 13020//0.01oumu

uint32_t PT100_REAL_RES_VALUEy[4]=
{
RES_100_REAL_VALUE,RES_110_REAL_VALUE,RES_120_REAL_VALUE,RES_130_REAL_VALUE
};

/*
平均值函数
*/
float Average(uint32_t *p_array,uint8_t n_size)
{
	uint32_t temp_sum =0;
	for(uint8_t i=0;i<n_size;i++)
	temp_sum+=p_array[i];
	return temp_sum/n_size;
}
/*
求平均值YN
*/
float REAL_RES_ave=Average(PT100_REAL_RES_VALUEy,sizeof(PT100_REAL_RES_VALUEy)/sizeof(PT100_REAL_RES_VALUEy[0]));

/*
函数功能:求数组各元素的线性回归方程的斜率
入口参数p_get_val为一个数组的首地址
入口参数n_size为数组元素个数
返回数组各元素的线性回归方程的斜率
*/
float PT100_K_CORRECT3(uint32_t *p_get_val,uint8_t n_size)
{
	float temp_k_val;
	float Get_Res_ave;
	
	Get_Res_ave=Average(p_get_val,n_size);//XA
	
	temp_k_val=(float)
		((p_get_val[0]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[0]-REAL_RES_ave)
		+(p_get_val[1]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[1]-REAL_RES_ave)
		+(p_get_val[2]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[2]-REAL_RES_ave)
		+(p_get_val[3]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[3]-REAL_RES_ave))
		/
		((p_get_val[0]-Get_Res_ave)*(p_get_val[0]-Get_Res_ave)
		+(p_get_val[1]-Get_Res_ave)*(p_get_val[1]-Get_Res_ave)
		+(p_get_val[2]-Get_Res_ave)*(p_get_val[2]-Get_Res_ave)
		+(p_get_val[3]-Get_Res_ave)*(p_get_val[3]-Get_Res_ave)
		);//K
	
	return temp_k_val;
}
/*
函数功能:求数组各元素的线性回归方程的截距
入口参数p_get_val为一个数组的首地址
入口参数n_size为数组元素个数
返回数组各元素的线性回归方程的截距
*/
short PT100_T_CORRECT3(uint32_t *p_get_val,uint8_t n_size)
{
	float temp_k_val,Get_Res_ave;
	short temp_t_val;
	
	Get_Res_ave=Average(p_get_val,n_size);//XA
	
	temp_k_val=PT100_K_CORRECT3(p_get_val,n_size);//K
	
	temp_t_val=REAL_RES_ave-temp_k_val*Get_Res_ave;//T
	
	return temp_t_val;
}

今天先弄一个keil编辑器里的源码,后期有时间弄VisualStudio的代码,以及测试代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhenleixiaoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值