栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言实现最小二乘法计算y = a* x+b

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言实现最小二乘法计算y = a* x+b

公式

代码实现
#define ARRAY_NUM 10
typedef struct {
  float yValue[ARRAY_NUM ];
  float xValue[ARRAY_NUM ];
  float a;
  float b;
  float c;
  int num;
} Linear_Func_Data;
//实现线性方程y=a*x+b
 void linearSquareMethod(Linear_Func_Data *linearArray)
 {
 	int i = 0;
 	float xSum = 0.0;
 	float ySum = 0.0;
 	float x2Sum = 0.0;
 	float xySum = 0.0;
 	float dividendTmp = 0.0;
 	float divisorTmpA = 0.0;
 	float divisorTmpB = 0.0;

	float *x = &linearArray->xValue[0];
	float *y = &linearArray->yValue[0];
	int n = linearArray->num;
 	for (i = 0; i < n; i++){
 		xSum += x[i]; //计算x的累加和
 		ySum += y[i]; //计算y的累加和
 		x2Sum += x[i] * x[i]; //计算x平方的累加和
 		xySum += x[i] * y[i]; //计算x * y的累加和
 	}
 	dividendTmp = n * x2Sum  - xSum * xSum;
 	divisorTmpA = n * xySum - xSum * ySum;
 	divisorTmpB = x2Sum * ySum - xSum * xySum;

	//计算a系数
	linearArray->a = divisorTmpA / dividendTmp;
	//计算b系数,或者使用 b = (ySum - a * xSum) / n;
	linearArray->b = divisorTmpB / dividendTmp;
 }
//实现二次方程y=a*x^2+b*x + c
void quardEquationMethod(Linear_Func_Data *linearArray)
{
 	int i = 0;
 	float xSum = 0.0;
 	float ySum = 0.0;
 	float x2Sum = 0.0;
 	float x3Sum = 0.0;
 	float x4Sum = 0.0;
 	float xySum = 0.0;
 	float x2ySum = 0.0;
 	
 	float dividendTmp = 0.0;
 	float divisorTmpA = 0.0;
 	float divisorTmpB = 0.0;
 	float divisorTmpC = 0.0;

	float *x = &linearArray->xValue[0];
	float *y = &linearArray->yValue[0];
	int n = linearArray->num;
 	for (i = 0; i < n; i++){
 		xSum += x[i]; //计算x的累加和
 		ySum += y[i]; //计算y的累加和
 		x2Sum += x[i] * x[i]; //计算x平方的累加和
 		x3Sum += x[i] * x[i] * x[i]; //计算x立方的累加和
 		x4Sum += x[i] * x[i] * x[i] * x[i]; //计算x4次方的累加和
 		xySum += x[i] * y[i]; //计算x * y的累加和
 	}
 	dividendTmp = n * (x2Sum * x4Sum - s3Sum * s3Sum)  - xSum * (xSum * s4Sum -s2Sum * s3Sum);
 	divisorTmpA = n * (x2Sum * s2ySum - xySum * s3Sum) - xSum * (xSum *s2ySum -ySum * s3Sum) + s2Sum * (xSum *xySum -ySum *s2Sum);
 	divisorTmpB = n * (xySum * s4Sum -s2ySum * s3Sum) - xSum *(ySum * s4Sum -s2Sum *s2ySum) + s2Sum * (ySum *s3Sum - xySum * s2Sum);
	divisorTmpC = ySum * (s2Sum * s4Sum - s3Sum * s3Sum) - xySum * (xSum * s4Sum - s2Sum * s3Sum) 
		+ x2ySum * (xSum * s3Sum - s2Sum * s2Sum);
	//计算a系数
	linearArray->a = divisorTmpA / dividendTmp;
	//计算b系数
	linearArray->b = divisorTmpB / dividendTmp;
	//计算c系数
	linearArray->c = divisorTmpC / dividendTmp;
 }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948129.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号