?? small_secend.c
字號:
/*--以下代碼從王一波上位機中摘取出來,一種算法之一,以下為他的源代碼*/
void CDlgStdCurve::StraightParabolaFitting( int m, double x[], double y[], double a[])
{
/*
//正規方程組
a0----b
a1----k
stdr---R
stdr2---R2(stdr*stdr)
m*a0+xsum*a1+x2sum*a2=ysum
xsum*a0+x2sum*a1+x3sum*a2=xysum
x2sum*a0+x3sum*a1+x4sum*a2=x2ysum
A1=m; B1=xsum; C1=x2sum;
A2=xsum; B2=x2sum; C2=x3sum;
A3=x2sum; B3=x3sum; C3=x4sum;
y1=ysum; y2=xysum; y3=x2ysum;
//求解
tp1=(A2*y3-A3*y2)*(A1*B2-A2*B1)
-(A1*y2-A2*y1)*(A2*B3-A3*B2);
tp2=(A2*C3-A3*C2)*(A1*B2-A2*B1)
-(A1*C2-A2*C1)*(A2*B3-A3*B2);
a2=tp1/tp2;
tp1=A1*B2-A2*B1;
a1=((A1*y2-A2*y1)-(A1*C2-A2*C1)*a2)/tp1;
a0=(y1-(B1*a1+C1*a2))/A1;
tp=(m*x2sum-xsum*xsum)*(m*y2sum-ysum*ysum);
stdr = (m*xysum-xsum*ysum)/(sqrt(tp));
*/
double xsum,ysum,x2sum,x3sum,x4sum,y2sum,xysum,x2ysum,tp1,tp2,stdr,a0,a1,a2,
A1,A2,A3,B1,B2,B3,C1,C2,C3,y1,y2,y3;
xsum=ysum=x2sum=x3sum=x4sum=y2sum=xysum=x2ysum=0;
m=4;
x[0]=1;
x[1]=2;
x[2]=3;
x[3]=4;
y[0]=2;
y[1]=6;
y[2]=12;
y[3]=20;
for(int i=0;i<m;i++)
{
xsum +=x[i];
ysum +=y[i];
x2sum+=x[i]*x[i];
x3sum+=x[i]*x[i]*x[i];
x4sum+=x[i]*x[i]*x[i]*x[i];
y2sum+=y[i]*y[i];
xysum+=x[i]*y[i];
x2ysum+=x[i]*x[i]*y[i];
}
if (m>0)
{
A1=m ; B1=xsum; C1=x2sum;
A2=xsum; B2=x2sum; C2=x3sum;
A3=x2sum; B3=x3sum; C3=x4sum;
y1=ysum; y2=xysum; y3=x2ysum;
tp1=(A2*y3-A3*y2)*(A1*B2-A2*B1)
-(A1*y2-A2*y1)*(A2*B3-A3*B2);
tp2=(A2*C3-A3*C2)*(A1*B2-A2*B1)
-(A1*C2-A2*C1)*(A2*B3-A3*B2);
if (tp2!=0)
{
a2=tp1/tp2;
tp1=A1*B2-A2*B1;
if (tp1!=0)
{
a1=((A1*y2-A2*y1)-(A1*C2-A2*C1)*a2)
/tp1;
}
a0=(y1-(B1*a1+C1*a2))/A1;
}
}
tp1=(m*x2sum-xsum*xsum)*(m*y2sum-ysum*ysum);
if (tp1>0)
{
stdr = (m*xysum-xsum*ysum)/(sqrt(tp1));
stdr =stdr*stdr;
}
a[0]=a0;
a[1]=a1;
a[2]=a2;
CString s;
s.Format("a0=%.4f a1=%.4f a2=%.4f r^2=%.4f",a0,a1,a2,stdr);
ShowMS(s);
//AfxMessageBox(s);
}
/*依據王一波算法轉換而成的C算法*/
//----算法缺點:
// 1、R2值與EXCEL基本一致,略大,因為EXCEL只取四位小數,而C編譯后是以浮點數計算。
// 2、A、B值與EXCEL計算出來以后,略大或略小,不基本一致,小則差幾,大則差別上百。
void smallsuanfa(uint m,float x[6],float y[6])
{
uint i;
float tp1,tp2;
float stdr,stdr2;
float xsum,ysum,x2sum,x3sum,x4sum;
float y2sum,xysum,x2ysum;
float a0,a1,a2;
float A1,A2,A3,B1,B2,B3,C1,C2,C3;
float y1,y2,y3;
xsum=0;
ysum=0;
x2sum=0;
x3sum=0;
x4sum=0;
y2sum=0;
xysum=0;
x2ysum=0;
//----------------------------------
for(i=0;i<m;i++)
{
xsum +=x[i];
ysum +=y[i];
x2sum+=x[i]*x[i];
x3sum+=x[i]*x[i]*x[i];
x4sum+=x[i]*x[i]*x[i]*x[i];
y2sum+=y[i]*y[i];
xysum+=x[i]*y[i];
x2ysum+=x[i]*x[i]*y[i];
}
//----------------------------------
if (m>0)
{
A1=m ; B1=xsum; C1=x2sum;
A2=xsum; B2=x2sum; C2=x3sum;
A3=x2sum; B3=x3sum; C3=x4sum;
y1=ysum; y2=xysum; y3=x2ysum;
tp1=(A2*y3-A3*y2)*(A1*B2-A2*B1)-(A1*y2-A2*y1)*(A2*B3-A3*B2);
tp2=(A2*C3-A3*C2)*(A1*B2-A2*B1)-(A1*C2-A2*C1)*(A2*B3-A3*B2);
if (tp2!=0)
{
a2=tp1/tp2;
tp1=A1*B2-A2*B1;
if (tp1!=0)
{
a1=((A1*y2-A2*y1)-(A1*C2-A2*C1)*a2)/tp1;
}
a0=(y1-(B1*a1+C1*a2))/A1;
}
}
//------------------------------------
tp1=(m*x2sum-xsum*xsum)*(m*y2sum-ysum*ysum);
if (tp1>0)
{
stdr = (m*xysum-xsum*ysum)/(sqrt(tp1));
stdr2 =stdr*stdr;
}
//-------------------------------------
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -