等精度测量系统误差编程处理一、实验目的(1)、通过C语言编程,实现系统误差的处理。
(2)、加深对C语言的理解,提高对C语言的使用能力。
(3)、掌握对系统误差的判断方法,加深对系统误差的理解。
二、实验内容1、实验数据算数平均值为24.775mm。
残余误差和为-0.001mm。
残余误差平方和为0.000069mm2。
贝塞尔公式求得的标准差为0.0029mm。
别捷尔斯公式求得的标准差为0.0031mm。
2、实验思路要想得到单次测量的标准差,必须先求的测量列的算术平均值,其次求的残余误差,再求残余误差平方和,然后由贝塞尔公式或别捷尔斯公式求得测量列单次的标准差,然后由不同公式计算标准差比较法,得出是否含有系统误差。
三、编程实现1、求算术平均值为了实现模块化,在此处用调用函数的方法,对数组求平均值。
将测量列看成数组,且赋值给一个数组,然后将数组的首地址当做参数传递给函数,结果由return语句返回到主函数。
实现算术平均值程序为:double averaqe_number(double *s,int N){double sum=0.0;double averaqe=0.0;int i=0;while(i<N){sum+=*s;s++;i++;}averaqe=sum/N;return(averaqe);}2.残余误差和的实现由残余误差计算公式可得:残余误差=测量值-平均值。
所以可以将上一步求得的平均值作为函数的一个参数传递到残余误差函数,然后在编写残余误差程序,实现对残余误差和的求解。
残余误差和求解程序如下:double offset(double b[],int N,double mean){double z=0.0;int i;for(i=0;i<N;i++){z+=(b[i]-mean);}return(z);}3、残余误差平方和的实现由残余物差平方和的公式:残余物差平方和=(测量值-平均值)^2,则同理可由求残余误差的方法求得残差平方和。
程序如下:double sum_squares(double b[],int N,double mean){double cuwcpfh=0.0,arr[9];int i;for(i=0;i<N;i++){arr[i] =(b[i]-mean)*(b[i]-mean);}for(i=0;i<N;i++){cuwcpfh+=arr[i];}return(cuwcpfh);}4、贝塞尔公式求标准差由贝塞尔公式可知:标准差等于残差平方和除以(n-1)再开根号。
所以只需把残差平方和及数据个数传递到贝塞尔公式求标准差的函数里即可。
程序实现如下:double standard_deviation(int N,double sse){double z;z= sqrt (sse/(N-1));return(z);}5、别捷尔斯公式求标准差由别捷尔斯公式可知,只需将测量值、数据个数、算术平均值传递到别捷尔斯公式求标准差函数即可。
程序如下:double biejiersi(double b[],int N,double mean){double z,sum_1=0.0;int i;for(i=0;i<N;i++){sum_1 += fabs(b[i]-mean);}z = 1.253*(sum_1/sqrtf (N*(N-1)));return(z);}6、用不同公式计算标准差比较法此处只是简单的加减乘除运算,没涉及到求和之类的复杂运算,所以直接在主函数里进行四则运算。
7、主函数主函数包括调用函数的申明以及需打印的函数值。
还有对系统误差是否有无得判别。
判别依据是,别捷尔斯公式求标准差/贝塞尔公式求标准差减一得到的差值与2除以根号下(n-1)作比较,如果前者小,则无根据怀疑测量列有系统误差;反之亦然。
四、实验结果及误差分析运行后结果如下:由对比可知:实验数据与理论数据有一些误差。
实验误差一部分是由于四舍五入之后再对数据处理造成的。
例如:在输出平均值时,平均值数值可以由数据转换命令由六位小数转换成与例题一样的三位数据,不过是显示结果为三位,但是存储平均值时依然是六位小数,在后面调用平均数的运算中,会导致数值差别。
实验误差的另一部分是由数据存储时造成的。
例如:输入数组的数值为24.780,但在内存里,可能是24.777779,虽然表面上这些差值很小,但数据处理的多了,这就对数据的处理造成了相应的误差。
五、实验程序#include"stdafx.h"#include"stdio.h"#include"math.h"double mean=0.0;void main(){double averaqe_number(double *s,int N);double offset(double b[],int N,double mean);double sum_squares(double b[],int N,double mean);double standard_deviation(int N,double sse);double biejiersi(double[],int N,double mean);int i,n=9;double offset_sum,sse,std,std_1,ratio,u,t;doublea[9]={24.774,24.778,24.771,24.780,24.772,24.777,24.773,24.775,24.774};for(i=0;i<9;i++)printf("%5.3f ",a[i]);printf("\n");mean = averaqe_number(a,n);printf("平均数mean = %5.3f\n",mean);offset_sum = offset(a,n,mean);printf("残余误差和offset_sum = %g\n",offset_sum);sse = sum_squares(a,n,mean);printf("残差平方和sse = %g\n",sse);std = standard_deviation(n,sse);printf("贝塞尔公式求标准差std = %g\n",std);std_1=biejiersi(a,n,mean);printf("别捷尔斯公式求标准差std_1 = %g\n",std_1);printf("用两种方法计算的标准差比值为:\n");printf(" std_1/std = %g\n",std_1/std);printf("令 std_1/std = u+1\n");u = std_1/std-1;printf("则 u = %g\n",u);t=2.0/sqrtf(n-1);if(fabs(u)<t){printf("因|u|= %f < 2/sqrt(n-1) = %g\n",fabs(u),t);printf("故可判断该测量列无系统误差存在。
\n");}else{printf("因|u|= %f > 2/sqrt(n-1) = %g\n",fabs(u),t);printf("故可判断该测量列有系统误差存在。
\n");}getchar(); getchar();}double averaqe_number(double *s,int N){double sum=0.0;double averaqe=0.0;int i=0;while(i<N){sum+=*s;s++;i++;}averaqe=sum/N;return(averaqe);}double offset(double b[],int N,double mean){double z=0.0;int i;for(i=0;i<N;i++){z+=(b[i]-mean);}return(z);}double sum_squares(double b[],int N,double mean){double cuwcpfh=0.0,arr[9];int i;for(i=0;i<N;i++){arr[i] =(b[i]-mean)*(b[i]-mean);}for(i=0;i<N;i++){cuwcpfh+=arr[i];}return(cuwcpfh);}double standard_deviation(int N,double sse) {double z;z= sqrt (sse/(N-1));return(z);}double biejiersi(double b[],int N,double mean) {double z,sum_1=0.0;int i;for(i=0;i<N;i++){sum_1 += fabs(b[i]-mean);}z = 1.253*(sum_1/sqrtf (N*(N-1)));return(z);}。