公式
代码实现
#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;
}