您的当前位置:首页正文

误差报告

2023-01-06 来源:欧得旅游网
误差理论与数据处理程序编写报告

院系:机电学院测控系 姓名:易荣武

学号:20091001892 班号:076091 指导教师:沈博

一、实验目的

1、 巩固上课学习的理论知识 2、 提高动手能力 3、 学会分析解决问题 4、 把理论与实践相结合

二、实验内容

1、误差等问题处理 2、一元线性回归分析

三、实验工具

1、 计算机

2、 Vs2010软件

四、实验过程

程序的编写

实验1:误差处理

程序设计思路:首先在显示屏上输入x数组,然后通过scanf语句存入程序中,然后按书上公式求残余误差,求标准差,求算术平均值的标准差,求平均值的极限误差。在过程中有对是否有系统误差的判断但没有实施解决办法,有用狄克松准则判定粗大误差,程序中置信概率为99%。N的最大值只能为15,超出范围程序会提示。具体程序如下:

#include \"stdafx.h\" #include \"math.h\"

void main() {

intn,i,j;

int z[]={5,6,7,8,9,10.11,12,13,14,15};

floats=0,a=0,b=0,c,d,e,f,k,p,q,t,r10max=0,r10min=0,r11max=0,r11min=0,

r21max=0,r21min=0,r22max=0,r22min=0,final,limt,avex; float x[15]={0};

float y[]={4.03,3.71,3.50,3.36,3.25,3.17,3.11,3.05,3.01,2.98,2.95}; printf(\"请输入n\\n\");

scanf(\"%d\

printf(\"输入x序列\\n\"); for(i=0;iscanf(\"%f\输入x序列 }

for(i=0;is=s+x[i];//x[i]求和 } avex=s/n;

for(j=0;ja=a+(x[j]-avex)*(x[j]-avex);//残余误差平方和 }

p=sqrt(a/(n-1));//标准差

q=p/sqrt(float(n));//算术平均值的标准差 printf(\"系统误差的判定:\\n\"); for(j=0;jb=b+sqrt(x[j]-avex); }

c=1.253*b*sqrt(float(n*(n-1)));//用别捷尔斯法求得的标准差 d=c/p; e=1-d;

f= 2/sqrt(float(n-1));

if(eif(n=z[j]) t=y[j]; } limt=t*q;

printf(\"用狄克松准则判定粗大误差,置信概率为99%\\n\");

/*把x[i]从小到大排列顺序*/ for (j=0;jfor(i=0;ix[i+1]) {

k=x[i]; x[i]=x[i+1]; x[i+1]=k; }

for(j=0;j/*粗大误差的判断*/ switch(n) {

case 5: {

r0=0.780;

r10max=(x[n-1]-x[n-2])/(x[n-1]-x[0]); r10min=(x[0]-x[1])/(x[0]-x[n-1]);

if(r10maxif(r10minr0=0.698;

r10max=(x[n-1]-x[n-2])/(x[n-1]-x[0]); r10min=(x[0]-x[1])/(x[0]-x[n-1]);

if(r10maxif(r10minr0=0.637;

r10max=(x[n-1]-x[n-2])/(x[n-1]-x[0]); r10min=(x[0]-x[1])/(x[0]-x[n-1]);

if(r10max else printf(\"x[n-1]含有粗大误差\\n\");

if(r10minr0=0.683;

r11max=(x[n-1]-x[n-2])/(x[n-1]-x[1]); r11min=(x[0]-x[1])/(x[0]-x[n-2]);

if(r10maxif(r10minr0=0.635;

r11max=(x[n-1]-x[n-2])/(x[n-1]-x[1]); r11min=(x[0]-x[1])/(x[0]-x[n-2]);

if(r10maxif(r10minr0=0.597;

r11max=(x[n-1]-x[n-2])/(x[n-1]-x[1]); r11min=(x[0]-x[1])/(x[0]-x[n-2]);

if(r10maxif(r10min r0=0.679;

r21max=(x[n-1]-x[n-3])/(x[n-1]-x[1]); r21min=(x[0]-x[2])/(x[0]-x[n-2]);

if(r10maxif(r10minr0=0.642;

r21max=(x[n-1]-x[n-3])/(x[n-1]-x[1]); r21min=(x[0]-x[2])/(x[0]-x[n-2]);

if(r10maxif(r10minr0=0.615;

r21max=(x[n-1]-x[n-3])/(x[n-1]-x[1]); r21min=(x[0]-x[2])/(x[0]-x[n-2]);

if(r10maxif(r10minr0=0.641;

r22max=(x[n-1]-x[n-3])/(x[n-1]-x[2]); r22min=(x[0]-x[2])/(x[0]-x[n-3]);

if(r10maxif(r10minelse printf(\"x[0]含有粗大误差\\n\"); };break; case 15: {

r0=0.616;

r22max=(x[n-1]-x[n-3])/(x[n-1]-x[2]); r22min=(x[0]-x[2])/(x[0]-x[n-3]);

if(r10maxif(r10mindefault :printf(\"n不在计算范围内\\n\"); }

printf(\"平均值=%f\\n标准差=%f\\n算术平均值的标准差=%f\\n算术平均

值的极限误差=%f\\n\

printf(“最后测量结果为:\\nL=%f(+-)%f”,avex,limt); while(1);

}

运行的结果如下(这里只是其中一种)

实验2:一元线性回归分析

设计思路:首先在屏幕上输入x[n]、y[n],然后通过scanf语句输入程序里,然后计算lxx、lyy、lxy、b、b0,确定直线方程。然后是方差分析,接着是显著性检验,按照书上的公式进行计算,最后得出结论。下面是主程序:

#include \"stdafx.h\" #include \"math.h\"

void main() {

inti,N; float

b0,b,p,p2,U,Q,F,avex,avey,sumx1=0,sumy1=0,sumx2=0,sumy2=0,sumxy=0,lxx,lxy,lyy;

float x[15]={0},y[15]={0}; printf(\"请输入N:\\n\"); scanf(\"%d\

printf(\"请输入x序列:\\n\"); for (i=0;iscanf(\"%f\输入 }

for(i=0;isumx1=sumx1+x[i];//x[i]求和

sumx2=sumx2+x[i]*x[i];//x[i]平方求和 }

avex=sumx1/N; //求x平均值

lxx=sumx2-sumx1*sumx1/N;//计算lxx printf(\"请输入y序列:\\n\");

for (i=0;iscanf(\"%f\输入 }

for(i=0;isumy1=sumy1+y[i];//y[i]求和

sumy2=sumy2+y[i]*y[i];//y[i]平方求和 }

avey=sumy1/N; //求y平均值

lyy=sumy2-sumy1*sumy1/N;//计算lyy

for(i=0;i{

sumxy=sumxy+x[i]*y[i];//x*y求和 }

lxy=sumxy-sumx1*sumy1/N;//计算lxy b=lxy/lxx;//计算b

b0=avey-b*avex;//计算b0

printf(\"avex=%f\\navey=%f\\nsumx1=%f\\nsumx2=%f\\nsumy1=%f\\n

sumy2=%f\\nsumxy=%f\\nlxx=%f\\nlxy=%f\\nlyy=%f\\nb=%f\\nb0=%f\\n\ey,sumx1,sumx2,sumy1,sumy2,sumxy,lxx,lxy,lyy,b,b0); printf(“回归方程为:\\ny=%f+%fx\\n”,b0,b); printf(\"方差显著度分析:\\n\"); U=b*lxy;//回归平方和 Q=lyy-b*lxy;//残余平方和 F=U/(Q/(N-2));

p2=Q/(N-2);//残余方差 p=sqrt(p2);//残余标准差

printf(\"残余方差=%f\\n残余标准差=%f\\n\

/*显著性检验*/

switch(N) {

case 5:{

if (F>34.12)printf(\"回归是高度显著的\");

else if(10.13<=F<34.12)printf(\"回归是显著的\");

else if(5.54<=F<10.13)printf(\"回归不显著,y对x的线性关系不密切\"); };break; case 6:{

if (F>21.20)printf(\"回归是高度显著的\");

else if(7.71<=F<21.20)printf(\"回归是显著的\");

else if(4.54<=F<7.71)printf(\"回归不显著,y对x的线性关系不密切\"); };break; case 7:{

if (F>16.20)printf(\"回归是高度显著的\");

else if(6.61<=F<16.20)printf(\"回归是显著的\");

else if(4.06<=F<6.61)printf(\"回归不显著,y对x的线性关系不密切\");

};break; case 8:{

if (F>13.74)printf(\"回归是高度显著的\");

else if(5.99<=F<13.74)printf(\"回归是显著的\"); else if(3.78<=F<5.99)printf(\"回归不显著,y对x的线性关系不密切\");

};break; case 9:{

if (F>12.25)printf(\"回归是高度显著的\");

else if(5.59<=F<12.25)printf(\"回归是显著的\"); else if(3.59<=F<5.59)printf(\"回归不显著,y对x的线性关系不密切\");

};break; case 10:{

if (F>11.26)printf(\"回归是高度显著的\");

else if(5.32<=F<11.26)printf(\"回归是显著的\"); else if(3.36<=F<5.32)printf(\"回归不显著,y对x的线性关系不密切\"); };break; case 11:{

if (F>10.56)printf(\"回归是高度显著的\");

else if(5.12<=F<10.56)printf(\"回归是显著的\"); else if(3.36<=F<5.12)printf(\"回归不显著,y对x的线性关系不密切\");

};break; case 12:{

if (F>10.04)printf(\"回归是高度显著的\");

else if(4.96<=F<10.04)printf(\"回归是显著的\");

else if(3.28<=F<4.96)printf(\"回归不显著,y对x的线性关系不密切\"); };break; case 13:{

if (F>9.65)printf(\"回归是高度显著的\");

else if(4.84<=F<9.65)printf(\"回归是显著的\");

else if(3.23<=F<4.84)printf(\"回归不显著,y对x的线性关系不密切\");

};break; case 14:{

if (F>9.65)printf(\"回归是高度显著的\");

else if(4.75<=F<9.65)printf(\"回归是显著的\"); else if(3.18<=F<4.75)printf(\"回归不显著,y对x的线性关系不密切\");

};break; case 15:{

if (F>9.07)printf(\"回归是高度显著的\");

else if(4.67<=F<9.07)printf(\"回归是显著的\"); else if(3.14<=F<4.67)printf(\"回归不显著,y对x的线性关系不密切\");

};break;

default:printf(\"N的值超出规定范围\"); }

while(1); }

下面的是检验结果:

五、实验心得

通过这两个程序的编写,我受益匪浅,不仅熟练掌握了VS2010的使用方法,而且也加深了对c语言应用的了解。这两个程序在一定程度上考验着我的编程能力。通过程序的编写,使我得到了一次用专业知识和专业技能分析和解决问题的全面锻炼,使我对误差理论和数据处理这门课程的有了更深的理解,在一定程度上复习并运用了相关的知识。在程序编写中遇到了许多困难,不过通过自己认真分析还是把问题解决了。编程要认真仔细,其中好多错误都是自己粗心导致的,有人说粗心是编程最忌讳的,我觉得也是。通过这次编程,我知道了如何去提出、发现、分析、解决问题,极大的提高了实践能力。

因篇幅问题不能全部显示,请点此查看更多更全内容