粗大误差C语言程序#(精选.)
c语言误差算法

c语言误差算法C语言误差算法一、引言在计算机编程中,误差算法是非常重要的一个概念。
在实际的计算过程中,由于计算机的存储精度限制以及计算过程中的近似处理等因素,往往会引入一定的误差。
因此,我们需要了解误差的产生原因以及如何进行误差分析和控制,以确保程序的计算结果尽可能接近真实值。
二、误差的产生原因1. 计算机存储精度限制计算机内部的数值存储是有一定精度限制的,通常使用有限的二进制位数来表示实数。
这就意味着在存储实数时,会进行舍入操作,从而引入了一定的误差。
2. 近似处理在计算过程中,为了简化运算或提高计算效率,往往会采用近似处理的方法。
例如,对于复杂的数学函数,计算机通常使用数值逼近的方法来计算,而不是直接使用精确的函数表达式。
这样的近似处理也会导致误差的产生。
三、误差的分类误差可以分为绝对误差和相对误差两种。
1. 绝对误差绝对误差是指实际值与计算值之间的差异。
通常用|实际值-计算值|来表示。
绝对误差描述了计算结果与真实值之间的偏差情况。
2. 相对误差相对误差是指绝对误差与实际值之间的比值。
通常用|实际值-计算值|/|实际值|来表示。
相对误差描述了计算结果相对于真实值的精确度。
四、误差分析和控制对于误差的分析和控制,可以从以下几个方面入手。
1. 算法设计在算法设计阶段,应尽量选择精确度高的算法。
例如,在求解数值积分时,可以选择更高阶的数值积分方法,以提高计算结果的精确度。
2. 数据类型选择在进行数值计算时,应选择合适的数据类型。
对于需要高精度计算的问题,可以使用高精度库来代替内置的数据类型。
这样可以提高计算结果的精确度,减小误差的影响。
3. 误差传播分析在进行复杂计算时,误差可能会被传播到下一步计算中。
因此,需要进行误差传播分析,了解误差是如何从一个计算步骤传递到下一个计算步骤的。
通过分析误差传播的路径,可以有针对性地进行误差控制。
4. 误差估计在实际计算中,往往无法得知真实值。
因此,需要通过一些方法对误差进行估计。
C语言实现测量数据误差处理

误差处理程序(C语言)电子信息工程学院通信100910211159高子豪实验目的实现对输入数据的误差处理:剔除粗大误差。
判断累进性系统误差和周期性系统误差。
计算平均值,方差,不确定度。
程序代码#include<stdio.h>#include<math.h>double SUM(double x[],int n);double AVRG(double x[],int n);double SD(double x[],int n);int PauTa(double x[],int n);int Chauvenet(double x[],int n);int Grubbs_1(double x[],int n);int Grubbs_2(double x[],int n);static int n;static double a[500];int main(){int i,choose,leap=1;double avg,sd,v[500],M=0,AH=0,vmax=0;doubleP,PX[]={12.706,4.303,3.182,2.776,2.571,2.447,2.365,2.306,2.262,2.228,2.131,2.086,2.060,2.042,2.021,2 .000,1.980,1.960};printf("请输入数据总个数:\n");scanf("%d",&n);printf("请输入数据:\n");for(i=0;i<n;i++)scanf("%lf",&a[i]);avg=AVRG(a,n);sd=SD(a,n);printf("\n输入数据的平均值为%lf,标准差为%lf\n",avg,sd);while(leap){printf("请选择粗大误差的检验法:\n1.莱特检验法\n2.肖维纳检验法\n3.格拉布斯检验法(置信概率99%%)\n4.格拉布斯检验法(置信概率95%%)\n5.停止检验\n");scanf("%d",&choose);if(choose==1&&n<10)printf("数据总量小于10,不能使用莱特检验法。
粗大误差C语言程序

程序可以对采集的 数据进行预处理, 如滤波、平滑等
粗大误差检测算法 可以用于实时监测 数据采集过程
C语言程序可以与 其他数据处理软件 集成,提高数据处 理的效率
粗大误差检测:C语言程序可以快速准确地检测数据中的粗大误差,提高数据处理的质量。
数据清洗:通过C语言程序,可以对含有噪声或异常值的数据进行清洗,去除无效或错误信 息。
XX,a click to unlimited possibilities
汇报人:XX
CONTENTS
PART ONE
粗大误差:在数据测量或采集过程中,由于某些 特定原因(如设备故障、操作失误等)导致的明 显大于其他观测值的误差。
产生原因:粗大误差的产生通常与异常事件或错 误操作有关,例如传感器故障、测量设备失灵等。
粗大误差C语言程序在未来的应用场景将更加广泛,特别是在大数据和人工智能领域。 随着技术的不断发展,粗大误差C语言程序将更加高效、稳定和安全。 未来粗大误差C语言程序将与其他编程语言更好地融合,实现更加灵活和多样化的应用。 粗大误差C语言程序将不断优化和改进,以满足更多领域的需求,并推动相关领域的发展。
PART TWO
输入数据 计算处理 输出结果 程序结束
定义变量和常量
输入数据
计算处理
输出结果
编译过程:将源代码转换为可执行文件 运行过程:执行可执行文件,输出结果 调试过程:检查程序中的错误并进行修正 优化过程:提高程序的运行效率
PART THREE
粗大误差C语言程 序能够处理数据采 集中的异常值
数据来源:说明数据的来源 和获取方式
案例概述:介绍案例的背景、 目的和意义
粗大误差处理:对检测到的粗 大误差进行修正或处理的方法
系统误差粗大误差随机误差处理顺序

系统误差粗大误差随机误差处理顺序下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!系统误差、粗大误差和随机误差的处理顺序在进行任何测量或实验过程中,测量结果都会受到各种误差的影响。
粗大误差

81 361 121 361 81 361 441 (已剔除) 121 361 81 1 441 441 121
t15 =
t
i 1
15
i
15
=20.404
vi =0.01496
i 1
15
2
v '
i i 1
14
2
=0.003374
t14 =
t
i 1
14
σ=
i
0.01496 =0.033 15 1
除以上准则外,还有狄克逊(Dixon)准则等其他准则,可参阅有关文献。 要指出,以上各准则都是人为主观拟定的,直到目前为止,还没有统一的规定。 此外,所有准则,又都是以数据按正态分布为前提的,当偏离正态分布时,判断 的可靠性将受影响,特别是测量次数很少时更不可靠。因此,对待粗大误差,除 从测量结果中及时发现和利用剔除准则鉴别外, 更重要的是要提高工作人员的技 术水平和工作责任心,不要在情绪不宁和过于疲劳的情况下,进行重要的测量工 作, 另外, 要保证测量条件的稳定, 防止因环境条件剧烈变化而产生的突变影响。
n Zc
40 2.49
50 2.58
3.格拉布斯(Grubbs )准则
格拉布斯准则的来源推导较繁,这里只介绍具体用法。 在测量数值(测量列)中某一数据的残差的绝对值|v|>Gσ时,则判断此值 中含有粗大误差,应予剔除,此即格拉布准则。G 值按重复测量次数 n 及置信概 率 P ɑ由表 4-2 查出。 表 4-2 格拉布斯准则中的 G 值 测 量 测 量 置信概率 P ɑ 置信概率 P ɑ 次数 次数 n n 0.99 0.95 0.99 0.95 3 4 5 6 7 13 14 15 1.16 1.49 1.75 1.94 2.10 2.61 2.66 2.70 1.15 1.46 1.67 1.82 1.94 2.33 2.37 2.41 8 9 10 11 12 16 18 20 2.22 2.32 2.41 2.48 2.55 2.74 2.82 2.88 2.03 2.11 2.18 2.23 2.28 2.44 2.50 2.56
C语言程序设计- C语言程序常见错误与调试方法(原)

数个数) Goto statement missing label (Goto语句缺少标号) If statement missing( (If语句缺少"(") If statement missing) (If语句缺少")") lllegal initalization (非法初始化) lllegal octal digit (非法八进制数) 分析与处理:此类错误通常是由于八进制常数中包含了非八进制数字所致。 lllegal pointer subtraction (非法指针相减) lllegal structure operation (非法结构操作) lllegal use of floating point (浮点运算非法) lllegal use of pointer (指针使用非法)
误。 For statement missing( (For语句缺少"(") For statement missing; (For 语句缺少";")
C Programming
11.1 C语言程序设计中常见错误分析与出错信息
分析与处理:在 for语句中,当某个表达式后缺少分号,那么会出现此类错误。 Function call missing) (函数调用缺少")") 分析与处理:如果函数调用的参数表漏掉了右手括号或括号不匹配,那么会出现
现其它字符,那么会引起此类错误。 Division by zero (除数为零) 分析与处理:当源文件的常量表达式出现除数为零的情况,那么会造成此类错误。 Do statement must have while (do语句中必须有While关键字) 分析与处理:假设源文件中包含了一个无While关键字的 do语句,那么出现本
用C语言实现测量数据的处理

用C 语言实现测量数据的处理电子信息工程学院 通信0301 烟翔 学号 03211026一,一般步骤(1),消除或减小恒定系差(2),求测量数据的数学期望()x M ,即算术平均值x :()n x x x M n i i∑===1, 其中n 为测量数据次数,i x 为第i 次测量的数据。
(3),求剩余误差i v : x x v i i -=(4),根据贝塞尔公式求标准偏差δ: ∑=-=n i i v n 1211δ (5),检查是否有粗大误差。
检查时用了肖维纳准则。
如果某次测量的结果i x 所对应的δh v i >,则认为是坏值,予以剔除。
(6),如有坏值,剔除后重新进行步骤(2)~(5)的计算,直至无坏值为止。
(7),判断有无变值系差。
判断是可用马利科夫准则或阿卑—赫梅特准则。
(8),求出算术平均值的标准偏差-x δ: n x δδ-必须注意,如前面计算中曾出现坏值,则这里的δ应为剔除后重新计算出的标准偏差。
(9),求算术平均值的不确定度二,程序及注释#include<stdio.h>#include<math.h>void main(){double a[200]; /*输入数据数组*/int i; /*输入数据个数*/int k,j,p,m,f,s,t,M=0; /*中间变量*/double c[200]; /* 偏差数组*/double max,maxc,sumd,v;/*中间变量*/int g[200]; /*坏值位置数组*/double sum, sumb; /*中间变量数据的和值*/ double b; /*平均值*/double E; /*标准偏差估计*/ double F; /*不确定度*/double w[200]; /*偏差的绝对值*/double d,h; /*中间变量*/printf("input numbers \n");scanf("%d",&i); /* 输入数据总的个数*/ printf("input numbers is \n");printf("%d\n",i); /*输出数据的总个数*/printf("input the data\n");for(sum=0,k=0;k<i;k++) /*输入每一个数据的值*/ {scanf("%lf",&a[k]);sum+=a[k];}b=sum/i; /*求平均值*/art:switch(i) /* 找肖维纳准则系数*/ {case 1:case 2:case 3:case 4:case 5: h=1.65; break;case 6: h=1.73; break;case 7: h=1.79; break;case 8: h=1.86; break;case 9: h=1.92; break;case 10: h=1.96; break;case 11: h=2.00; break;case 12: h=2.04; break;case 13: h=2.07; break;case 14: h=2.10; break;case 15: h=2.13; break;case 16: h=2.16; break;case 17: h=2.18; break;case 18: h=2.20; break;case 19: h=2.22; break;case 20: h=2.24; break;case 21: h=2.26; break;case 22: h=2.28; break;case 23: h=2.30; break;case 24: h=2.32; break;case 25: h=2.33; break;case 26: h=2.34; break;case 27: h=2.35; break;case 28: h=2.37; break;case 29: h=2.38; break;case 30: h=2.39; break;default:h=3;}for(j=0,sumb=0;j<i;j++){c[j]=a[j]-b;sumb=sumb+c[j]*c[j];}d=sqrt(sumb/(i-1)); /*求方差*/m=0;p=0;for(k=0;k<i;k++){if(c[k]>h*d||c[k]<(-h)*d){m=1;g[p]=k;p++;}} /*找所有坏值*/if(m==0) /*如果无坏值*/{goto put;} /*转到输出*/for(f=g[0],max=0,t=f;f<=g[p-1];f++){if(max<a[f]) {max=a[f];t=f;}}/*找出坏值中的最大的一个*/ for (k=t;k<i-1;k++){a[k]=a[k+1];} /*剔除坏值并将后面的数据往前移*/ printf("out the error\n");printf("%lf\n",a[t]); /*找到最大的坏值*/i=i-1; /* 数据总个数减1*/for(s=0,sum=0;s<i;s++){sum+=a[s];} /* 重新求和*/b=sum/i; M+=1; /*重新算方差*/goto art; /*回去再找坏值*/put:E=d/sqrt(i); /*求标准偏差估计*/F=3*E; /*求不确定度*/for(k=0;k<i;k++){ w[k]=a[k]-b;}for(k=0,maxc=0;k<i;k++){ if(w[k]<0) w[k]=-w[k];else w[k]=w[k];if(maxc<w[k])maxc=w[k]; }for(k=0,v=0;k<i/2;k++){v+=w[k]-w[k+i/2];}if(v<maxc&&v>-maxc)printf("no progression error\n");else printf("have progression error \n");/*判断有无累进性误差*/ for(k=0,sumd=0;k<i-1;k++){sumd+=c[k]*c[k+1];}if(sumd>d*d*sqrt(i-1))printf("have periodicity error\n");else printf("no periodicity error\n"); /*判断有无周期性误差*/ printf("now all bad data number\n");printf("%d\n",M); /* 输出坏值个数*/ printf("mean value is equal to\n");printf("%lf\n",b); /*输出平均值*/printf("stander error is equal to\n");printf("%lf\n",d); /*输出标准偏差*/printf("input data and truncated error\n");for(k=0;k<i;k++){printf("%lf %lf\n",a[k],c[k]);} /*输出数据及偏差*/ printf("arithmetical stander error\n");printf("%lf\n",E); /*输出偏差估计*/printf("not accurate grade \n");printf("+-%lf\n",F); /* 输出不确定度*/ printf("analylc result\n");printf("%lf +-%lf\n",b,F); /*输出最终结果*/}测试结果(P115 例28)。
关于C语言程序的调试

2021/11/14
输入变量或表达 式,同时观察其 值的变化。
23
调试示例:
求二数的最小公倍数和最大公约数.
#include<stdio.h>
void main()
{ int m,n,j,k;
printf("input m,n:\n");
scanf("%d%d",&m,&n);
while(m<0 && n<0)
在输入窗口输入数据.
2021/11/14
12
2. 停止调试:
单击”终止调试”(Stop Debuging)
终止调试.
2021/11/14
13
二. 设置断点调试:
调试程序示例2: 计算累加和,程序有错。
#include<stdio.h> void main() {
int i,sum; for(i=1;i<=100;i++)
sum=sum+i;
printf("sum=%d\n",sum); }
2021/11/14
14
排除语法错误,运行后发现其结果显然不对。
2021/11/14
15
如下图所示,设置一断点。
使用此按钮, 运行到断点处.
2021/11/14
16
在变量窗口发现 sum的值有问题!
这时应想到是变 量没赋初值。
2021/11/14
2
2. 使用 设置(或取消)断点, 再使用 运行到断点. 可在“变量窗口”(Variables)观察和分析变量的变化。
然后决定是继续单步执行,还是运行到下一个断点。
误差理论-粗大误差处理

粗大误差的处理粗大误差的数值比较大,它会对测量结果产生明显的歪曲,一旦发现含有粗大误差的测量值,应将其从测量结果中剔除。
设计思路:1.学习并掌握粗大误差处理的一般原理及处理过程;2.定义所需的变量及数组,然后提示输入测量次数n;3.输入测量数据次数n,然后提示输入测量数据;4.输入测量数据之后,提示选择判别粗大误差的准则方式Way;5.选择判别方式,则开始调用相应判别准则的处理函数,在需要查表的函数里,再调用相应的表函数查表;6.开始进行计算并判别是否含有粗大误差,如有应予剔除;7.最后显示处理结果。
参考文献:1)误差理论与数据处理/费业泰主编-5版--北京:机械工业出版社2004.62)C程序设计语言/(美)克尼汉(Kernighan,B.W.)(美)里奇(Ritchie,D.M.)著;徐宝文,李志泽。
2版--北京:机械工业出版社,2004.13)C程序设计/谭浩强著-3版--北京:清华出版社,2005源代码:/*----------粗大误差的处理----------*/#include"stdafx.h"#include"stdio.h"#include"math.h"#define NUM1 50#define NUM2 10void main(){float K(int n,int a);//罗曼诺夫斯基准则的检验系数K(n,a)表的声明float g0(int n,int a);//格罗布斯准则的临界值g0(n,a)表的声明float r0(int n,int a);//狄克松准则的临界值r0(n,a)表的声明void Way1(int n,float array1[],float array2[]);//3σ准则(莱以特准则的函数声明void Way2(int n,float array1[],float array2[]);//罗曼诺夫斯基准则的函数声明void Way3(int n,float array1[],float array2[]);//格罗布斯准则的函数声明void Way4(int n,float array1[],float array2[]);//狄克松准则的函数声明int n,i,t=1,Way;float array1[NUM1]={0},array2[NUM2]={0};printf("*--*--*--*--*--*粗大误差的处理*--*--*--*--*--*\n");printf(">>>请输入测量次数n:(n<50)\n>>");scanf("%d",&n);printf(">>>请输入%d 个测量数据:\n",n);for(i=0;i<n;i++){printf("%2d.",i+1);scanf("%f",&array1[i]);}printf(">>>通常用来判别粗大误差的准则有:\n");printf(">>>1:3σ准则(莱以特准则)\n");printf(">>>2:罗曼诺夫斯基准则\n");printf(">>>3:格罗布斯准则\n");printf(">>>4:狄克松准则\n");printf(">>>请输入所采用的准则方式Way:\n>>");scanf("%d",&Way);switch(Way){case 1:Way1(n,array1,array2);break;case 2:Way2(n,array1,array2);break;case 3:Way3(n,array1,array2);break;case 4:Way4(n,array1,array2);break;}printf(">>>含有粗大误差的测得值:\n");i=0;if(array2[i]){while(array2[i]){printf("%6.2f\n",array2[i]);i++;}}else{printf(">>无\n");}printf(">>不含有粗大误差的测得值:\n");i=0;while(array1[i]){printf("%6.2f\n",array1[i]);i++;}getchar();printf(">>>按Enter键结束:\n");if(getchar())t=0;while(t);}/*3σ准则(莱以特准则的函数*/void Way1(int n,float array1[],float array2[]) {int i,j=0,k,q=1;float x,σ,V1,V2;float v1[NUM1]={0};while(q){q=0;x=0;σ=0;V1=0;V2=0;for(i=0;i<n;i++)x+=array1[i]/n;//测量数据的算术平均值for(i=0;i<n;i++){v1[i]=array1[i]-x;//第i个测得值的残余误差V1+=v1[i];//测得值的残余误差的代数和V2+=pow(v1[i],2);//测得值的残余误差的平方和 }σ=sqrt(V2/(n-1));//由残余误差求得单次测量的标准差的估计值for(i=0;i<n;i++){if(fabs(v1[i])>3*σ){q=1;array2[j]=array1[i];j++;for(k=i;k<(n-1);k++){array1[k]=array1[k+1];v1[k]=v1[k+1];}array1[n-1]=0;n--;i--;}}}}/*罗曼诺夫斯基准则的函数*/void Way2(int n,float array1[],float array2[]){float K(int n,int a);int i,j,a,k,q=1,r=0;float x=0,σ,t,V1,V2=0;float v1[NUM1]={0};printf(">>请选择显著度a:\n");printf(">>1 a=0.01\n");printf(">>2 a=0.05\n");scanf("%d",&a);while(q){q=0;x=0;V2=0;for(i=0;i<n;i++)x+=array1[i]/n;//测量数据的算术平均值for(i=0;i<n;i++)v1[i]=array1[i]-x;//第i个测得值的残余误差for(i=0;i<n;i++){if(fabs(v1[0])<=fabs(v1[i])){j=i;t=v1[0];v1[0]=v1[i];v1[i]=t;}}x=0;for(i=0;i<n;i++){if(i!=j)x+=array1[i]/(n-1);//不含x(j)的测量数据的算术平均值 }for(i=0;i<n;i++)v1[i]=array1[i]-x;//第i个测得值的残余误差for(k=j;k<(n-1);k++)v1[k]=v1[k+1];v1[n-1]=0;for(i=0;i<(n-1);i++)V2+=pow(v1[i],2);//不含x(j)的测得值的残余误差的平方和σ=sqrt(V2/(n-1));//由残余误差求得单次测量的标准差的估计值if(fabs(array1[j]-x)>K(n,a)*σ){printf(">>第%d个测得值%6.2f含有粗大误差,将其剔除。
粗大-系统-随机误差处理

课程设计用仪器设备名称此次课程设计用到的仪器设备和软件包括: (1) 个人计算机; (2) Matlab 软件。
课程设计过程1、课程设计处理原理:此次课程开展的数据处理包:(1)粗大误差处理;(2)系统误差处理;(3)随机误差处理。
他们的原理分别分析如下:(1)粗大误差处理对于粗大误差,采用莱以特准则和罗曼诺夫斯基准则。
莱以特准则:求出数据的算数平均值x 和标准差σ,将残差的绝对值i x v 和3σ进行比较,大于3σ的值都认为是粗大误差。
罗曼诺夫斯基准则:首先剔除该数据中的最大值,然后再按照t 分布检验,求出该项与剔除后平均值的差,即d x x −,再与()2,K n a σ−进行比较,如果前者大于等于后者,那么该数据有系统误差。
(2)系统误差处理对于系统误差,我们采用了残差总和判断法,阿贝-赫梅判别法,标准差比较法,他们的原理如下:残差总和判断法:对于等精度的系统测量数据12,,...n x x x ,设相对的残差分别是12,,...n v v v ,若有12ni i v =>∑,则怀疑测量数据有系统误差阿贝-赫梅判别法:对于等精度的系统测量数据12,,...n x x x ,设相对的残,分别是12,,...n v v v ,1223111...nn n i i i u v v v v v v v v−+==+++=∑,如果2u >,则判定该组数据含有系统误差。
标准差比较法:对于等精度的系统测量数据12,,...n x x x ,设相对的残差分别是12,,...n v v v ,用不同的公式计算标准差,通过比较可以发现存在的系统误差。
用贝塞尔公式计算,1s=,用别捷尔斯公式计算,1s=211s s ≥,则怀疑测量中存在系统误差。
(3)随机误差处理我们考虑了正态分布和t 分布两种情况,通过置信概率和自由度分别在正态分布积分表和t 分布表中找到对应的t 值,再求出极限误差lim x t ςσ=+。
传感与检测C语言程序

p=p+1;
}
y=y/(n-1-j);
return y;
}
/*数据中坏值得个数计算*/
int bad(float *p,int n)
{int i,j=0;
for(i=0;i<n;i++)
if(*p==0)
++j;
return j;
}
/*数据中坏值为0时n个数计算平均数*/
float aver(float *p,int n)
最小二乘法
即先将三次测量的正行程和反行程的值求平均值,再对求的平均值用最小二乘法进行直线拟合。
则有c语言程序:
#include <stdio.h>
#include <math.h>
/*求绝对值*/
float fab(float a)
{float z;
z=a;
if(a<0)
z=-a;
return z;
++j;
}
}
}
}
}
结果为:
p=p+2;
}
return y;
}
/*迟滞误差计算*/
float delay(float *p)
{float max,z,c;
int i;
c=*(p+1)-(*p);
max=fab(c);
for(i=0;i<17;i++)
{ p=p+2;
c=*(p+1)-(*p);
z=fab(c);
if(z>max)
}
/*求线性度*/
C语言编程处理粗 大 误 差

误差理论与数据处理实验报告指导老师:**班级: 076091学号: *********** **: ***设计时间: 2011.10.01粗大误差处理一、实验目的通过编程深入地了解误差的基本性质以及处理方法二、实验原理1、误差的基本概念所谓误差就是测量值与真实值之间的差,可以用下式表示误差=测得值-真值(1)绝对误差:某量值的测得值和真值之差为绝对误差,通常简称为误差。
绝对误差=测得值-真值(2)相对误差绝对误差与被测量的真值之比称为相对误差,因测得值与真值接近,故也可以近似用绝对误差与测得值之比值作为相对误差。
相对误差=绝对误差/真值≈绝对误差/测得值(3)引用误差所谓引用误差指的是一种简化和使用方便的仪器仪表表示值的相对误差,它以仪器仪表某一刻度点的示值误差为分子,以测量范围上限值或全量程为分母,所得的比值称为引用误差。
引用误差=示值误差/测量范围上限2、精度反映测量结果与真值接近程度的量,称为精度,它与误差大小相对应,因此可以用误差大小来表示精度的高低,误差小则精度高,误差大则精度低。
精度可分ⅰ准确度它反映测量结果中系统误差的影响程度ⅱ精密度它反映测量结果中随机误差的影响程度ⅲ精确度它反映测量结果中系统误差和随机误差综合的影响程度,其定量特征可以用测量的不确定度来表示。
3、有效数字与数据运算含有误差的任何近似数,如果其绝对误差界是最末位数的半个单位,那么从这个近似数左方起的第一个非零的数字,称为第一位有效数字。
从第一位有效数字起到最末一位数字止的所有数字,不论是零或非零的数字,都叫有效数字。
数字舍入规则如下:①若舍入部分的数值,大于保留部分的末位的半个单位,则末位加1。
②若舍去部分的数值,小于保留部分的末位的半个单位,则末位不变。
③若舍去部分的数值,等于保留部分的末位的半个单位,则末位凑成偶数。
即当末位为偶数时则末位不变,当末位为奇数时则末位加1。
(2)算术平均值对某一量进行一系列等精度测量,由于存在随机误差,其测得值皆不相同,应以全部测得值的算术平均值作为最后的测量结果。
粗大误差C语言程序

误差分析的C语言实现学院:电子信息工程学院专业班级:通信1004学生姓名:童博学号:102840432012 年12 月26 日一、编程分析1、误差的基本概念所谓误差就是测量值与真实值之间的差,可以用下式表示误差=测得值-真值(1)绝对误差:某量值的测得值和真值之差为绝对误差,通常简称为误差。
绝对误差=测得值-真值(2)相对误差绝对误差与被测量的真值之比称为相对误差,因测得值与真值接近,故也可以近似用绝对误差与测得值之比值作为相对误差。
相对误差=绝对误差/真值≈绝对误差/测得值(3)引用误差所谓引用误差指的是一种简化和使用方便的仪器仪表表示值的相对误差,它以仪器仪表某一刻度点的示值误差为分子,以测量范围上限值或全量程为分母,所得的比值称为引用误差。
引用误差=示值误差/测量范围上限2、精度反映测量结果与真值接近程度的量,称为精度,它与误差大小相对应,因此可以用误差大小来表示精度的高低,误差小则精度高,误差大则精度低。
精度可分ⅰ准确度它反映测量结果中系统误差的影响程度ⅱ精密度它反映测量结果中随机误差的影响程度ⅲ精确度它反映测量结果中系统误差和随机误差综合的影响程度,其定量特征可以用测量的不确定度来表示。
3、有效数字与数据运算含有误差的任何近似数,如果其绝对误差界是最末位数的半个单位,那么从这个近似数左方起的第一个非零的数字,称为第一位有效数字。
从第一位有效数字起到最末一位数字止的所有数字,不论是零或非零的数字,都叫有效数字。
数字舍入规则如下:①若舍入部分的数值,大于保留部分的末位的半个单位,则末位加1。
②若舍去部分的数值,小于保留部分的末位的半个单位,则末位不变。
③若舍去部分的数值,等于保留部分的末位的半个单位,则末位凑成偶数。
即当末位为偶数时则末位不变,当末位为奇数时则末位加1。
(2)算术平均值对某一量进行一系列等精度测量,由于存在随机误差,其测得值皆不相同,应以全部测得值的算术平均值作为最后的测量结果。
粗大误差的判别

先将以上数据以一个行向量的形式输入一个新打开的MATLAB文件,存盘名为:count2.dat,
数据之间用空格隔开。
loadcount2.dat
sort(count2)
h=sum(count2)
j=mean(count2)
f=std(count2)
m=min(count2)
g=(j-m)./f
19.9920
g =
3.1202
实验设备
计算机及MATLAB软件
结论
用软件实现粗大误差的初步判断
实验日期
2015年11月6日
实验者
比较计算出的g和从书中4-1查得的
G(α,n)=G(0.01,20)=2.884
可知:g=3.1202>2.884
可知:测量列中的最小值含有粗大误差,剔除后,重新ห้องสมุดไป่ตู้n=19计算j,f,再找m重复进行以上步骤,直到没有粗大误差为止
验证结果
h =
399.9980
j =
19.9999
f =
0.0025
m =
实验名称
粗大误差的判别
实验性质
验证
内容提要
用格拉布斯准则判断测量列是否含有粗大误差
实验要求
用MATLAB编程
测量数据(mm)
20.002 20.000 20.000 20.001 20.000 19.998 19.998 20.000 20.001 19.998 20.002 20.002 20.000 20.004 20.000 20.002 19.992 19.998 20.002 19.998
C语言误差处理(平均数、残差)

#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<math.h>double d[100];double x1=0.0,x2=0.0,x3=0.0,average=0.0;doubleT[]={63.66,9.92,5.84,4.60,4.03,3.71,3.50,3.36,3.25,3.17,3.11,3.05,3.01,2.98,2.95,2.92,2.90,2.88,2.86,2.8 5,2.83, 2.82,2.81,2.80,2.79,2.78,2.77,2.76,2.76,2.75,2.70,2.68,2.66,2.65,2.64,2.63,2.63,2.58};double average_fun(double datas[],int datas_num){int k=0;for(k=0;k<datas_num;k++){average+=datas[k];}average/=datas_num;return average;}double surplus(int num,double a[],double x){int i,j;double c[100],w;for(i=0;i<num;i++){c[i]=a[i]-x;d[i]=c[i];}printf("求得的残余误差为:\n ");for(j=0;j<num;j++)printf("%f ",d[j]);for(i=0;i<num;i++){w+=d[i];}return(w);}void check(int num,double w){double A;if(num%2==0){if(w>num/2.0*A){printf("该算术平均值不正确!\n");}else printf("该算术平均值正确!\n");}else{if(w>(num/2.0-0.5)*A){printf("该算术平均值不正确!\n");}else printf("该算术平均值正确!\n");}}judge1(int num){int t,j;double m=0.0,n=0.0,z=0.0;if(num%2==0){t=num/2;for(j=0;j<t;j++)m+=d[j];for(j=t;j<num;j++)n+=d[j];z=m-n;}else{t=(num+1)/2;for(j=0;j<t;j++)m+=d[j];for(j=t;j<num;j++)n+=d[j];z=m-n;printf("%lf",z);}if(z<=0.002)printf("无根据怀疑此组存在系统误差\n");elseprintf("怀疑此组存在系统误差\n");}std(int num,double data[]){double m=0.0;int k;for(k=0;k<num;k++){m+=data[k]*data[k];}x1=sqrt(m/(num-1));x2=x1/(sqrt(num));}void judge2(int w){int i;for(i=0;i<w;i++){if(d[i]<3*x1)printf("该数据存在粗大误差\n");elseprintf("该数据不存在粗大误差\n");}}limit(int num){double t=0.0;t=T[num-1];x3=t*x2;}bear(int datas_num,double datas[]){double y=0.0,k=0.0;int i;for(i=0;i<datas_num;i++){k+=datas[i];}k/=datas_num;y=k+x3;printf("结果为:");printf("%lf",y);}void main(){int num;int i;double a[100];double x=0.0,w=0.0;printf("输入实验组数:");scanf("%d",&num);printf("输入测得的数据:");for(i=0;i<num;i++)scanf("%lf",&a[i]);for(i=0;i<num;i++)printf("%lf",a[i]);printf("\n");x=average_fun(a,num);printf("平均数为:\n");printf("%lf",x);printf("残余误差为:\n");w=surplus( num, a, x);check(num,w);judge1(num);std(num,d);judge2(num);limit(num);bear(num,a);}。
测量数据的合理性检验程序设计

差叫系统误差。系统误差可以采取一定的技术措施加以减弱或清
除;在实际相同条件下多次测量同一量时,误差的绝对值和符号以
不可预定的方式变化的误差称为随机误差。随机误差具有:有界性,
对称性,抵偿性三个特点。根据随机误差的几个特性。在测量的过程
中,加大测试次数即可消除或减少随机误差对测量结果的影响。对
超出规定条件下预期的误差我们叫粗大误差[1]。
开始
定义 x[ ]
1→i 0→ssum ssum+x(i)*x(i)→ssum i+1→i
N i>n
Y (ssum- N * AVG* AVG/(N- 1)→sigma
图 3 主程序
返回
图5 标准偏差估计值子程序:sigma函数图
195
Copyright©博看网 . All Rights Reserved.
1 目地及意义 运用现代计算机技术,根据测量误差理论和统计学原理,来完
成一批数据(等精度测量)的自动分析和处理,为实现高准确度测量 提供了可能。给工、农业生产及科研提供了更有价值的信息和科学 依据。
2 课题的理论基础
的分散程度可用标准偏差 来表示。绝对值很大的随机误差出 现的概率趋近于零,因此测量值有一个实际界限[2]。
(7)
况下,如果测量次数足够多,通常取c=3,作为判别异常数据的界限,
称为莱特准则。使用莱特准则在分析和处理测量数据时,简单、方
便、准确,因此广泛应用[3]。
3 总体设计思想
开方得:
(8)
(8)式即为我们今后常用到的贝塞尔公式。
2.3 测量结果的置信区间和置信概率
由于随机误差的影响,测量值一般来说均偏离被测量的数学期
代替标准偏差,凡测量值x_i在区间[M(x)-cσ(x)],[M(x)+cσ
C语言误差处理(平均数、残差、系统误差)

C语言处理数据程序:#include<stdio.h>#include<stdlib.h>#include<math.h>doublegebruce[]={1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.28,2.33,2.37,2.41,2.44,2.48,2.50, 2.53,2.56,2.58,2.60,2.62,2.64,2.66,2.74,2.81,2.87,2.96,3.17};doubleT[]={63.66,9.92,5.84,4.60,4.03,3.71,3.50,3.36,3.25,3.17,3.11,3.05,3.01,2.98,2.95,2.92,2.90, 2.88,2.86,2.85,2.83,2.82,2.81,2.80,2.79,2.78,2.77,2.76,2.76,2.75,2.70,2.68,2.66,2.65,2.64,2. 63,2.63,2.58};double average_fun(double datas[],int datas_num);void canyu_error_fun(double datas[],double canyu_error_data[],double average,int datas_num);void revise_average_fun(double datas[],double canyu_error_data[],double average,int datas_num);void judge_system_error_fun(double canyu_error_data[],int datas_num);void abei(double canyu_error_data[],double std_error_average,int datas_num);double std_row_fun(double canyu_error_data[],int datas_num);void crassitude_error_fun(double datas[],double average,double std_besia,int datas_num); int liyiter(double canyu_error_data[],double std_row_besia,int datas_num);double std_error_average_fun(double std_bersia,int datas_num);double limit_error_average_fun(double std_error_average,int datas_num);double myround(double val,int digits);int main(int argc, char* argv[]){double *datas,*canyu_error_data;doubleaverage,canyu_error=0,std_besia=0,std_error_average=0,limit_error_average=0;int datas_num,j,flags;datas_num=9;printf("请输入实验组数:");scanf("%d",&datas_num);datas=(double *)calloc(datas_num,sizeof(double));canyu_error_data=(double *)calloc(datas_num,sizeof(double));printf("请输入测得的数据:\n");for(j=0;j<datas_num;j++){printf("%d:",j+1);scanf("%lf",datas+j);}average=myround(average_fun(datas,datas_num),3);canyu_error_fun(datas,canyu_error_data,average,datas_num);printf("平均值为:%lf\n",average);printf("残余误差为:\n");for(j=0;j<datas_num;j++){printf("%d:",j+1);printf("%lf\n",canyu_error_data[j]);}revise_average_fun(datas,canyu_error_data,average,datas_num);printf("残余误差校核法:\n");judge_system_error_fun(canyu_error_data,datas_num);std_besia=std_row_fun(canyu_error_data,datas_num);printf("测量列单次测量的标准差为:%lf\n",std_besia);crassitude_error_fun(datas,average,std_besia,datas_num);flags=liyiter(canyu_error_data,std_besia,datas_num);printf("莱以特准则判断粗大误差:\n");if(flags==0) printf("不存在粗大误差\n");else printf("存在粗大误差,应剔除\n");std_error_average=std_error_average_fun(std_besia,datas_num);printf("算数平均值的标准差为:%lf\n",std_error_average);printf("阿卑准则判定:\n");abei(canyu_error_data,std_error_average,datas_num);return 0;}double average_fun(double datas[],int datas_num){int k=0;double average=0;for(k=0;k<datas_num;k++)average+=datas[k];average/=datas_num;return average;}void canyu_error_fun(double datas[],double canyu_error_data[],double average,int datas_num){int k=0;for(k=0;k<datas_num;k++)canyu_error_data[k]=datas[k]-average;}void revise_average_fun(double datas[],double canyu_error_data[],double average,int datas_num){int k=0;double sum_canyu=0,sum_datas=0,sum_canyu_test,A;for(k=0;k<datas_num;k++)sum_canyu+=canyu_error_data[k];sum_datas+=datas[k];sum_canyu_test=sum_datas-datas_num*average;printf("该算术平均值为:%lf\n",average);if(datas_num%2==0)if(sum_canyu_test>datas_num/2.0*A)printf("该算术平均值不正确!\n");else printf("该算术平均值正确!\n");elseif(sum_canyu_test>(datas_num/2.0-0.5)*A)printf("该算术平均值不正确!\n");else printf("该算术平均值正确!\n");}void judge_system_error_fun(double canyu_error_data[],int datas_num){int k,j;double system_errors=0,system_error=0,data_error; j=(datas_num+1)/2;for(k=0;k<j;k++)system_errors+=canyu_error_data[k];for(k=0;k<datas_num;k++)system_error+=canyu_error_data[k];data_error=system_errors-system_error;if(data_error<0.01)printf("无根据怀疑此组存在系统误差\n");else printf("怀疑此组存在系统误差\n");}double std_row_fun(double canyu_error_data[],int datas_num){double std_row_besia=0,std_row_bejacks=0,u;int k=0;for(k=0;k<datas_num;k++){std_row_besia+=canyu_error_data[k]*canyu_error_data[k];std_row_bejacks+=double(fabs(canyu_error_data[k]));}std_row_besia=myround(sqrt(std_row_besia/((float)(datas_num-1))),4);std_row_bejacks=myround(1.253*std_row_bejacks/(sqrt(datas_num*(float)(datas_num-1))),4);u=myround(std_row_bejacks/std_row_besia-1,4);printf("贝赛尔-别捷尔斯判断系统误差:\n");if(double(fabs(u)<2/sqrt((double)datas_num-1))){printf("因为|u|=%lf<2/sqrt(%d-1)=%lf,\n",u,datas_num,2/sqrt((double)datas_num-1));printf("所以无根据怀疑此组存在系统误差\n");}else{printf("因为|u|=%lf>2/sqrt(%d-1)=%lf\n",u,datas_num,2/sqrt((double)datas_num-1));printf("所以怀疑此组存在系统误差\n");}return std_row_besia;}void crassitude_error_fun(double datas[],double average,double std_besia,int datas_num) {double *datas_list,temp;double x1,xi,g0,g1,gi;//flag为α,flag=0时α=0.01,flag=1时α=0.05int k=0,j=0,flag=0;datas_list=(double *)calloc(datas_num,sizeof(double));for(k=0;k<datas_num;k++)datas_list[k]=datas[k];for(k=0;k<datas_num;k++){for(j=0;j<datas_num-k;j++){if(datas_list[j]>datas_list[j+1]){temp=datas_list[j];datas_list[j]=datas_list[j+1];datas_list[j+1]=temp;}else continue;}}}int liyiter(double canyu_error_data[],double std_row_besia,int datas_num){int k=0,m=0;while(k<datas_num){if(fabs(canyu_error_data[k])>3*std_row_besia){m=1;break;}else k++;}return m;}double std_error_average_fun(double std_bersia,int datas_num){double std_error_average;std_error_average=std_bersia/(sqrt((double)datas_num));return myround(std_error_average,4);}double limit_error_average_fun(double std_error_average,int datas_num){double ta,limit_error_average;ta=T[datas_num-1];limit_error_average=ta*std_error_average;return myround(limit_error_average,4);}void abei(double canyu_error_data[],double std_error_average,int datas_num){int k;double abei_sum=0;for(k=0;k<datas_num-1;k++){abei_sum+=canyu_error_data[k]*canyu_error_data[k+1];}if(abei_sum>sqrt((double)datas_num-1)*std_error_average*std_error_average){printf("因为u=%lf>sqrt(%d-1)*δ*δ=%lf\n",abei_sum,datas_num,sqrt((double)datas_num-1)*std_error_average*std_error_ave rage);printf("存在周期性误差\n");}else printf("不存在周期性误差\n");}double myround(double val,int digits) {double d =pow(10.0,digits);return (int)(val*d+0.5)/d;}结果:。
粗大误差C语言程序#(精选.)

误差分析的C语言实现学院:电子信息工程学院专业班级:通信1004学生姓名:童博学号:102840432012 年12 月26 日一、编程分析1、误差的基本概念所谓误差就是测量值与真实值之间的差,可以用下式表示误差=测得值-真值(1)绝对误差:某量值的测得值和真值之差为绝对误差,通常简称为误差。
绝对误差=测得值-真值(2)相对误差绝对误差与被测量的真值之比称为相对误差,因测得值与真值接近,故也可以近似用绝对误差与测得值之比值作为相对误差。
相对误差=绝对误差/真值≈绝对误差/测得值(3)引用误差所谓引用误差指的是一种简化和使用方便的仪器仪表表示值的相对误差,它以仪器仪表某一刻度点的示值误差为分子,以测量范围上限值或全量程为分母,所得的比值称为引用误差。
引用误差=示值误差/测量范围上限2、精度反映测量结果与真值接近程度的量,称为精度,它与误差大小相对应,因此可以用误差大小来表示精度的高低,误差小则精度高,误差大则精度低。
精度可分ⅰ准确度它反映测量结果中系统误差的影响程度ⅱ精密度它反映测量结果中随机误差的影响程度ⅲ精确度它反映测量结果中系统误差和随机误差综合的影响程度,其定量特征可以用测量的不确定度来表示。
3、有效数字与数据运算含有误差的任何近似数,如果其绝对误差界是最末位数的半个单位,那么从这个近似数左方起的第一个非零的数字,称为第一位有效数字。
从第一位有效数字起到最末一位数字止的所有数字,不论是零或非零的数字,都叫有效数字。
数字舍入规则如下:①若舍入部分的数值,大于保留部分的末位的半个单位,则末位加1。
②若舍去部分的数值,小于保留部分的末位的半个单位,则末位不变。
③若舍去部分的数值,等于保留部分的末位的半个单位,则末位凑成偶数。
即当末位为偶数时则末位不变,当末位为奇数时则末位加1。
(2)算术平均值对某一量进行一系列等精度测量,由于存在随机误差,其测得值皆不相同,应以全部测得值的算术平均值作为最后的测量结果。
c语言计算标准偏差

c语言计算标准偏差一、概述标准偏差是一种常用的统计学指标,用于描述一组数据的离散程度。
在C语言中,可以通过编写程序来计算标准偏差。
本篇文章将介绍如何使用C语言计算标准偏差。
二、计算公式标准偏差的计算公式为:标准偏差=(平均值-总体平均值)的平方根×方差。
其中,平均值为数据集的算术平均值,方差则是数据集所有数值与平均值之差的平方的平均值。
三、C语言实现代码以下是一个使用C语言计算标准偏差的示例代码:```c#include<stdio.h>#include<stdlib.h>#include<time.h>//计算标准偏差函数doublecalculate_standard_deviation(double*data,intsize){ doublesum=0.0;//数据总和doublemean=0.0;//平均值doublevariance=0.0;//方差doublestddev=0.0;//标准偏差inti;//计算平均值和方差for(i=0;i<size;i++){sum+=data[i];}mean=sum/size;for(i=0;i<size;i++){variance+=pow(data[i]-mean,2);}variance/=size;//计算标准偏差stddev=sqrt(variance);returnstddev;}intmain(){//生成随机数作为数据集srand(time(NULL));doubledata[]={rand()%100,rand()%100,rand()%100,...};//生成随机数,直到数组填满为止intsize=sizeof(data)/sizeof(data[0]);//数据集大小//调用函数计算标准偏差并输出结果doublestddev=calculate_standard_deviation(data,size);printf("标准偏差为:%.4f\n",stddev);return0;}```四、注意事项在上述代码中,我们使用了C标准库中的rand()函数生成随机数作为数据集。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
误差分析的C语言实现学院:电子信息工程学院专业班级:通信1004学生姓名:童博学号:102840432012 年12 月26 日一、编程分析1、误差的基本概念所谓误差就是测量值与真实值之间的差,可以用下式表示误差=测得值-真值(1)绝对误差:某量值的测得值和真值之差为绝对误差,通常简称为误差。
绝对误差=测得值-真值(2)相对误差绝对误差与被测量的真值之比称为相对误差,因测得值与真值接近,故也可以近似用绝对误差与测得值之比值作为相对误差。
相对误差=绝对误差/真值≈绝对误差/测得值(3)引用误差所谓引用误差指的是一种简化和使用方便的仪器仪表表示值的相对误差,它以仪器仪表某一刻度点的示值误差为分子,以测量范围上限值或全量程为分母,所得的比值称为引用误差。
引用误差=示值误差/测量范围上限2、精度反映测量结果与真值接近程度的量,称为精度,它与误差大小相对应,因此可以用误差大小来表示精度的高低,误差小则精度高,误差大则精度低。
精度可分ⅰ准确度它反映测量结果中系统误差的影响程度ⅱ精密度它反映测量结果中随机误差的影响程度ⅲ精确度它反映测量结果中系统误差和随机误差综合的影响程度,其定量特征可以用测量的不确定度来表示。
3、有效数字与数据运算含有误差的任何近似数,如果其绝对误差界是最末位数的半个单位,那么从这个近似数左方起的第一个非零的数字,称为第一位有效数字。
从第一位有效数字起到最末一位数字止的所有数字,不论是零或非零的数字,都叫有效数字。
数字舍入规则如下:①若舍入部分的数值,大于保留部分的末位的半个单位,则末位加1。
②若舍去部分的数值,小于保留部分的末位的半个单位,则末位不变。
③若舍去部分的数值,等于保留部分的末位的半个单位,则末位凑成偶数。
即当末位为偶数时则末位不变,当末位为奇数时则末位加1。
(2)算术平均值对某一量进行一系列等精度测量,由于存在随机误差,其测得值皆不相同,应以全部测得值的算术平均值作为最后的测量结果。
1、算术平均值的意义在系列测量中,被测量所得的值的代数和除以n 而得的值成为算术平均值。
设 1l ,2l ,…,n l 为n 次测量所得的值,则算术平均值121...nin i l l l l x n n=++==∑ 算术平均值与真值最为接近,由概率论大数定律可知,若测量次数无限增加,则算术平均值x 必然趋近于真值0L 。
i v = i l -xi l ——第i 个测量值,i =1,2,...,;n i v ——i l 的残余误差(简称残差)2、算术平均值的计算校核算术平均值及其残余误差的计算是否正确,可用求得的残余误差代数和性质来校核。
残余误差代数和为:11n niii i v l nx ===-∑∑当x 为未经凑整的准确数时,则有1nii v==∑01)残余误差代数和应符合: 当1n ii l =∑=nx ,求得的x 为非凑整的准确数时,1nii v =∑为零;当1n ii l =∑>nx ,求得的x 为凑整的非准确数时,1nii v =∑为正;其大小为求x 时的余数。
当1nii l =∑<nx ,求得的x 为凑整的非准确数时,1nii v =∑为负;其大小为求x 时的亏数。
2)残余误差代数和绝对值应符合: 当n 为偶数时,1ni i v =∑≤2n A; 当n 为奇数时,1nii v =∑≤0.52n A ⎛⎫- ⎪⎝⎭ 式中A 为实际求得的算术平均值x 末位数的一个单位。
(3)测量的标准差测量的标准偏差称为标准差,也可以称之为均方根误差。
1、测量列中单次测量的标准差σ==式中 n —测量次数(应充分大)i δ——测得值与被测量值的真值之差σ=2、测量列算术平均值的标准差x σ=3、标准差的其他计算法1.别捷尔斯法nivσ=∑二、程序流程1、算术平均值2、求残余误差3、校核算术平均值及其残余误差4、判断系统误差5、求测量列单次测量的标准差6、判别粗大误差7、求算术平均值的标准差8、求算术平均值的极限误差9、写出最后测量结果三、编程实现源程序:#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "math.h"double gebruce[]={1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.28,2.33,2.37,2.41,2.44,2.48,2.50,2.53,2.56,2.58,2.60,2.62,2.64,2.66,2.74,2.81,2.87,2.96,3.17};double T[]={63.66,9.92,5.84,4.60,4.03,3.71,3.50,3.36,3.25,3.17,3.11,3.05,3.01,2.98,2.95,2.92,2.90,2.88,2.86,2.85,2.83,2.82,2.81,2.80,2.79,2.78,2.77,2.76,2.76,2.75,2.70,2.68,2.66,2.65,2.64,2.63,2.63,2.58};double average_fun(double datas[],int datas_num);//求平均数void canyu_error_fun(double datas[],double canyu_error_data[],double average,int datas_num);//求残余误差void revise_average_fun(double datas[],double canyu_error_data[],double average,int datas_num);void judge_system_error_fun(double canyu_error_data[],int datas_num);//判断系统误差//马利准则//阿卑准则void abei(double canyu_error_data[],double std_error_average,int datas_num);//求测量列单次测量的标准差double std_row_fun(double canyu_error_data[],int datas_num);//判别粗大误差void crassitude_error_fun(double datas[],double average,double std_besia,int datas_num);int liyiter(double canyu_error_data[],double std_row_besia,int datas_num);//求算数平均值的标准差double std_error_average_fun(double std_bersia,int datas_num);//求算数平均值的极限误差double limit_error_average_fun(double std_error_average,int datas_num);double myround(double val,int digits);int main(int argc, char* argv[]){//开辟数组的指针double *datas,*canyu_error_data;//保存的数据double average,canyu_error=0,std_besia=0,std_error_average=0,limit_error_average=0; //测试数据//double datas[]={24.774,24.778,24.771,24.780,24.772,24.777,24.773,24.775,24.774}; //数组长度以及一些常量int datas_num,j,flags;datas_num=9;printf("输入你要创建的数据容量:");scanf("%d",&datas_num);//创建数组,数据,残余误差datas=(double *)calloc(datas_num,sizeof(double));canyu_error_data=(double *)calloc(datas_num,sizeof(double));printf("请输入你要测试的数据:\n");//接收数据for(j=0;j<datas_num;j++){printf("%d:",j+1);scanf("%lf",datas+j);}// printf("接收数据成功!\n");average=myround(average_fun(datas,datas_num),3);canyu_error_fun(datas,canyu_error_data,average,datas_num);//平均值printf("****************************************************\n");printf("平均值为:%lf\n",average);printf("****************************************************\n");//残余误差printf("残余误差为:\n");for(j=0;j<datas_num;j++){printf("%d:",j+1);printf("%lf\n",canyu_error_data[j]);}printf("****************************************************\n");//校核算术平均值revise_average_fun(datas,canyu_error_data,average,datas_num);printf("****************************************************\n");//判别系统误差printf("马利可夫准则判定:\n");judge_system_error_fun(canyu_error_data,datas_num);printf("****************************************************\n");//测量列单次测量的标准差std_besia=std_row_fun(canyu_error_data,datas_num);printf("测量列单次测量的标准差为:%lf\n",std_besia);printf("****************************************************\n");//判别粗大误差crassitude_error_fun(datas,average,std_besia,datas_num);printf("****************************************************\n");flags=liyiter(canyu_error_data,std_besia,datas_num);printf("莱以特准则判断粗大误差:\n");if(flags==0){printf("不存在粗大误差\n");}else printf("存在粗大误差,应剔除\n");printf("****************************************************\n");//算数平均值的标准差std_error_average=std_error_average_fun(std_besia,datas_num);printf("算数平均值的标准差为:%lf\n",std_error_average);printf("****************************************************\n");//算数平均值的极限误差limit_error_average=limit_error_average_fun(std_error_average,datas_num);printf("算数平均值的极限误差为:%lf\n",limit_error_average);printf("****************************************************\n");//阿卑printf("阿卑准则判定:\n");abei(canyu_error_data,std_error_average,datas_num);printf("****************************************************\n");return 0;}//main//求平均数double average_fun(double datas[],int datas_num){int k=0;double average=0;for(k=0;k<datas_num;k++){average+=datas[k];}average/=datas_num;return average;}//求残余误差void canyu_error_fun(double datas[],double canyu_error_data[],double average,int datas_num) {int k=0;for(k=0;k<datas_num;k++){canyu_error_data[k]=datas[k]-average;}}//校核算术平均值void revise_average_fun(double datas[],double canyu_error_data[],double average,int datas_num){int k=0;double sum_canyu=0,sum_datas=0,sum_canyu_test,A;for(k=0;k<datas_num;k++){sum_canyu+=canyu_error_data[k];sum_datas+=datas[k];}sum_canyu_test=sum_datas-datas_num*average;printf("该算术平均值为:%lf\n",average);printf("该算术平均值末位数的一个单位是:");scanf("%lf",&A);if(datas_num%2==0){if(sum_canyu_test>datas_num/2.0*A){printf("该算术平均值不正确!\n");}else printf("该算术平均值正确!\n");}else{if(sum_canyu_test>(datas_num/2.0-0.5)*A){printf("该算术平均值不正确!\n");}else printf("该算术平均值正确!\n");}}//残余误差法判断系统误差void judge_system_error_fun(double canyu_error_data[],int datas_num){int k,j;double system_errors=0,system_error=0,data_error;j=(datas_num+1)/2;for(k=0;k<j;k++)system_errors+=canyu_error_data[k];for(k=0;k<datas_num;k++)system_error+=canyu_error_data[k];data_error=system_errors-system_error;printf("该系统误差为:%lf,",data_error);if(data_error<0.01)printf("系统误差较小,故不存在系统误差\n");else printf("存在系统误差\n");}//求测量列单次测量的标准差,方法二double std_row_fun(double canyu_error_data[],int datas_num){double std_row_besia=0,std_row_bejacks=0,u;int k=0;for(k=0;k<datas_num;k++){std_row_besia+=canyu_error_data[k]*canyu_error_data[k];std_row_bejacks+=double(fabs(canyu_error_data[k]));}std_row_besia=myround(sqrt(std_row_besia/((float)(datas_num-1))),4);std_row_bejacks=myround(1.253*std_row_bejacks/(sqrt(datas_num*(float)(datas_num-1))),4); u=myround(std_row_bejacks/std_row_besia-1,4);printf("贝赛尔-别捷尔斯判断系统误差:\n");if(double(fabs(u)<2/sqrt((double)datas_num-1))){printf("因为|u|=%lf<2/sqrt(%d-1)=%lf,",u,datas_num,2/sqrt((double)datas_num-1));printf("不存在系统误差\n");}else{printf("因为|u|=%lf>2/sqrt(%d-1)=%lf\n",u,datas_num,2/sqrt((double)datas_num-1));printf("存在系统误差\n");}return std_row_besia;}//判别粗大误差void crassitude_error_fun(double datas[],double average,double std_besia,int datas_num){double *datas_list,temp;double x1,xi,g0,g1,gi;//flag为α,flag=0时α=0.01,flag=1时α=0.05int k=0,j=0,flag=0;datas_list=(double *)calloc(datas_num,sizeof(double));for(k=0;k<datas_num;k++)datas_list[k]=datas[k];//冒泡排序法...由小到大排序for(k=0;k<datas_num;k++){for(j=0;j<datas_num-k;j++){if(datas_list[j]>datas_list[j+1]){temp=datas_list[j];datas_list[j]=datas_list[j+1];datas_list[j+1]=temp;}else continue;}}x1=datas_list[1];xi=datas_list[datas_num];x1=average-x1;xi=xi-average;gi=xi/std_besia;g0=gebruce[datas_num-3];g1=x1/std_besia;printf("使用格罗布斯判别准则判定粗大误差为:\n");printf("x1=%lf,\tx%d=%lf\n",datas_list[1],datas_num,datas_list[datas_num]);printf("x1=%lf,\tx%d=%lf\n",x1,datas_num,xi);printf("g1=%lf,\tg%d=%lf\tg0=%lf\n",gebruce[datas_num],datas_num,gi,g0);if(g1<gi&&gi<g0)printf("不存在粗大误差\n");else printf("存在粗大误差\n");free(datas_list);}//莱以特准则判别int liyiter(double canyu_error_data[],double std_row_besia,int datas_num) {int k=0,m=0;while(k<datas_num){if(fabs(canyu_error_data[k])>3*std_row_besia){m=1;break;}else k++;}return m;}//求算数平均值的标准差double std_error_average_fun(double std_bersia,int datas_num){double std_error_average;std_error_average=std_bersia/(sqrt((double)datas_num));return myround(std_error_average,4);}//求算数平均值的极限误差double limit_error_average_fun(double std_error_average,int datas_num) {double ta,limit_error_average;ta=T[datas_num-1];limit_error_average=ta*std_error_average;return myround(limit_error_average,4);}void abei(double canyu_error_data[],double std_error_average,int datas_num) {int k;double abei_sum=0;for(k=0;k<datas_num-1;k++){abei_sum+=canyu_error_data[k]*canyu_error_data[k+1];}abei_sum=fabs(abei_sum);if(abei_sum>sqrt((double)datas_num-1)*std_error_average*std_error_average) {printf("因为u=%lf>sqrt(%d-1)*δ*δ=%lf\n",abei_sum,datas_num, sqrt((double)datas_num-1)*std_error_average*std_error_average);printf("存在周期性误差\n");}else printf("不存在周期性误差\n");}double myround(double val,int digits){double d = pow(10.0, digits);return (int)( val * d + 0.5 ) / d;}四、程序使用说明根据界面提示输入所需测试数据个数再逐一输入测试数据即可判断出该组数据是否存在粗大误差五、程序实例1.输入数据个数为8个输入数据分别为:12.11312.11412.11712.11912.11512.11612.11812.301通过程序可以发现最后一位存在粗大误差2.输入数据个数为9个输入数据分别为:24.77424.77824.77124.78024.77224.77724.77324.77524.774通过程序验证该组数据无粗大误差最新文件仅供参考已改成word文本。