#include"HEAD.h"
#include"linearize.h"
//=====================
#define Code_number 45 //拟合数据量
#define n 4 //拟合次数
//=====================
//最小二乘法实现过程简化版
//优化内存资源
void linearize()
{
float xdata A[2]={0},B[2]={0},C;
float xdata Y[3][Code_number]={0};
float xdata temp;
float xdata Co[3][n+1]={0};
float xdata Coefficient[n+1]={0}; //存放最终的系数
unchar i,j;
float xdata x[]={0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,};
float xdata y[]={6981,7099,7341,7708,8202,8813,9543,10386,11335,12396,13553,14803,16142,17562,19054,20615,22239,23914,25632,27391,29174,30979,32793,
34613,36427,38224,40000,41744,43448,45106,46708,48245,49706,51089,52384,53583,54684,55676,56555,57315,57958,58482,58878,59147,59283};
//===记录Y0========
C=0;
for(i=0;i<Code_number;i++)
{
Y[0][i]=1;
C+=y[i];
A[0]+=x[i];
}
//==计算A[0] C[0]==
A[0]/=Code_number;
C/=Code_number;
//==记录系数=======
Co[0][0]=1; //0次方
//==系数和=========
Coefficient[0]=C;
//===计算Y1========
C=0;
for(i=0;i<Code_number;i++)
{
Y[1][i]=x[i]-A[0];
C+=Y[1][i]*y[i];
B[0]+=Y[1][i]*Y[1][i];
A[1]+=x[i]*Y[1][i]*Y[1][i];
}
//=计算A[1] C[1] B[0]=
A[1]/=B[0];
C/=B[0];
B[0]/=Code_number;
//==记录系数===
Co[1][0]=-1*A[0]; //0次方
Co[1][1]=1; //1次方
//=============
A[0]=A[1]; //转存
//==系数和=====
Coefficient[0]+=Co[1][0]*C;
Coefficient[1]=Co[1][1]*C;
//==计算其他Y和A、B及系数==
for(i=2;i<=n;i++)
{
temp=0;
C=0;
A[1]=0;
B[1]=0;
//===================
for(j=0;j<Code_number;j++)
{
Y[2][j]=Y[1][j];
Y[2][j]*=(x[j]-A[0]);
Y[2][j]-=(B[0]*Y[0][j]);
C+=Y[2][j]*y[j];
temp+=Y[2][j]*Y[2][j];
//==============
if(i<n)
{
A[1]+=x[j]*Y[2][j]*Y[2][j];
B[1]+=Y[1][j]*Y[1][j];
}
//==转移数据====
Y[0][j]=Y[1][j];
Y[1][j]=Y[2][j];
//==============
}
C/=temp;
//==计算系数======
for(j=i;j>=1;j--)
{
Co[2][j]=Co[1][j-1];
}
//================
for(j=0;j<i;j++)
{
Co[2][j]-=Co[1][j]*A[0];
}
//================
for(j=0;j<=i-2;j++)
{
Co[0][j]*=B[0];
Co[2][j]-=Co[0][j];
}
//================
for(j=0;j<=i;j++)
{
Co[0][j]=Co[1][j];
Co[1][j]=Co[2][j];
Co[2][j]=0;
}
//==求和==========
for(j=0;j<=i;j++)
{
Coefficient[j]+=C*Co[1][j];
}
//==计算A,B并转存=
if(i<n)
{
B[0]=temp/B[1];
A[0]=A[1]/temp;
//==============
}
//==============
}
//===================
}
//====================
//最小二乘法实现过程
/*
void linearize()
{
float xdata A[n]={0},B[n-1]={0},C[n+1]={0};
float xdata Y[n+1][Code_number]={0};
float xdata temp;
float xdata Co[3][n+1]={0};
float xdata Coefficient[n+1]={0}; //存放最终的系数
unchar i,j;
float xdata x[]={0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,};
float xdata y[]={6981,7099,7341,7708,8202,8813,9543,10386,11335,12396,13553,14803,16142,17562,19054,20615,22239,23914,25632,27391,29174,30979,32793,
34613,36427,38224,40000,41744,43448,45106,46708,48245,49706,51089,52384,53583,54684,55676,56555,57315,57958,58482,58878,59147,59283};
//===记录Y0===========
for(i=0;i<Code_number;i++)
{
Y[0][i]=1;
}
//==计算A[1]=========
for(i=0;i<Code_number;i++)
{
A[0]+=x[i];
}
A[0]/=Code_number;
//==计算其他Y和A及B===============
for(i=0;i<n;i++)
{
temp=0;
//=========================
for(j=0;j<Code_number;j++)
{
Y[i+1][j]=Y[i][j];
Y[i+1][j]*=(x[j]-A[i]);
if(i)
Y[i+1][j]-=(B[i-1]*Y[i-1][j]);
//==============
if(i<(n-1))
{
temp+=Y[i+1][j]*Y[i+1][j];
A[i+1]+=x[j]*Y[i+1][j]*Y[i+1][j];
B[i]+=Y[i][j]*Y[i][j];
}
}
//==============
if(i<(n-1))
{
B[i]=temp/B[i];
A[i+1]/=temp;
//==============
}
//==============
}
//===计算系数========
for(i=0;i<=n;i++)
{
temp=0;
for(j=0;j<Code_number;j++)
{
temp+=Y[i][j]*Y[i][j];
C[i]+=Y[i][j]*y[j];
}
C[i]/=temp;
}
//==计算最后系数=====
Co[0][0]=1; //0次方
Co[1][0]=-1*A[0]; //0次方
Co[1][1]=1; //1次方
//==系数和===========
Coefficient[0]=Co[0][0]*C[0]+Co[1][0]*C[1];
Coefficient[1]=Co[0][1]*C[0]+Co[1][1]*C[1];
//===================
for(i=2;i<=n;i++)
{
//================
for(j=i;j>=1;j--)
{
Co[2][j]=Co[1][j-1];
}
//================
for(j=0;j<i;j++)
{
Co[2][j]-=Co[1][j]*A[i-1];
}
//================
for(j=0;j<=i-2;j++)
{
Co[0][j]*=B[i-2];
Co[2][j]-=Co[0][j];
}
//================
for(j=0;j<=i;j++)
{
Co[0][j]=Co[1][j];
Co[1][j]=Co[2][j];
Co[2][j]=0;
}
//==求和==========
for(j=0;j<=i;j++)
{
Coefficient[j]+=C[i]*Co[1][j];
}
//================
}
//===================
}
*/