院系:机电学院测控系 姓名:易荣武
学号: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;i for(i=0;i for(j=0;j p=sqrt(a/(n-1));//标准差 q=p/sqrt(float(n));//算术平均值的标准差 printf(\"系统误差的判定:\\n\"); for(j=0;j c=1.253*b*sqrt(float(n*(n-1)));//用别捷尔斯法求得的标准差 d=c/p; e=1-d; f= 2/sqrt(float(n-1)); if(e printf(\"用狄克松准则判定粗大误差,置信概率为99%\\n\"); /*把x[i]从小到大排列顺序*/ for (j=0;j k=x[i]; x[i]=x[i+1]; x[i+1]=k; } for(j=0;j 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(r10max r10max=(x[n-1]-x[n-2])/(x[n-1]-x[0]); r10min=(x[0]-x[1])/(x[0]-x[n-1]); if(r10max r10max=(x[n-1]-x[n-2])/(x[n-1]-x[0]); r10min=(x[0]-x[1])/(x[0]-x[n-1]); if(r10max if(r10min r11max=(x[n-1]-x[n-2])/(x[n-1]-x[1]); r11min=(x[0]-x[1])/(x[0]-x[n-2]); if(r10max r11max=(x[n-1]-x[n-2])/(x[n-1]-x[1]); r11min=(x[0]-x[1])/(x[0]-x[n-2]); if(r10max r11max=(x[n-1]-x[n-2])/(x[n-1]-x[1]); r11min=(x[0]-x[1])/(x[0]-x[n-2]); if(r10max r21max=(x[n-1]-x[n-3])/(x[n-1]-x[1]); r21min=(x[0]-x[2])/(x[0]-x[n-2]); if(r10max r21max=(x[n-1]-x[n-3])/(x[n-1]-x[1]); r21min=(x[0]-x[2])/(x[0]-x[n-2]); if(r10max r21max=(x[n-1]-x[n-3])/(x[n-1]-x[1]); r21min=(x[0]-x[2])/(x[0]-x[n-2]); if(r10max r22max=(x[n-1]-x[n-3])/(x[n-1]-x[2]); r22min=(x[0]-x[2])/(x[0]-x[n-3]); if(r10max 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(r10max 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;i for(i=0;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;i for(i=0;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语言应用的了解。这两个程序在一定程度上考验着我的编程能力。通过程序的编写,使我得到了一次用专业知识和专业技能分析和解决问题的全面锻炼,使我对误差理论和数据处理这门课程的有了更深的理解,在一定程度上复习并运用了相关的知识。在程序编写中遇到了许多困难,不过通过自己认真分析还是把问题解决了。编程要认真仔细,其中好多错误都是自己粗心导致的,有人说粗心是编程最忌讳的,我觉得也是。通过这次编程,我知道了如何去提出、发现、分析、解决问题,极大的提高了实践能力。 因篇幅问题不能全部显示,请点此查看更多更全内容