北京交通大学电子测量课程设计

更新时间:2023-12-16 17:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

北京交通大学电子测量课

要求的一个小课设。题目是输入一堆数, 求出来标准偏差估计值和剔除坏值。

那c编的小程序。

输入数据

附件:

#include \#include \#include \int main() {

//第一部分

printf(\程序开始************\\n\ double

datas[100],datas2[100],CanyuWucha[100],CanyuWuchaABS[100],CanyuWucha2[100]; doubleGeLaBuSi[100],ta[100]; double

GeLaBuSi99[100]={0,0,0,1.16,1.49,1.75,1.94,2.10,2.22,2.32,2.41,2.48,2.55,2.61,2.66,2.71,2.75,2.79,2.82,2.85,2.88,2.91,2.94,2.96,2.99,3.01}; double

GeLaBuSi95[100]={0,0,0,1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.29,2.33,2.37,2.41,2.44,2.47,2.50,2.53,2.56,2.58,2.60,2.62,2.64,2.66}; double ta95[100]={0,0,12.71,4.30,3.18,2.78,2.57,2.45,2.37,2.31,2.26,2.23}; double ta99[100]={0,0,63.66,9.93,5.84,4.60,4.03,3.71,3.50,3.36,3.25,3.17}; double

XWN[100]={0,0,0,0,0,1.65,1.73,1.79,1.86,1.92,1.96,2.00,2.04,2.07,2.10,2.13,2.16,2.18,2.20,2.22,2.24,2.26,2.28,2.30,2.32,2.33,2.34,2.35,2.37,2.38,2.39,2.45,2.50,2.58,2.64,2.74,2.81,3.02}; printf(\第一部分************\\n\ //程序开始

printf(\您好!请输入你要处理的数据个数:\ //输入数据个数 intdataNumber=0,dataNumber2=0; scanf(\ dataNumber2=dataNumber;

printf(\请依次输入需要的数据:\\n\ //输入具体数据 int j; for(j=0;j

printf(\

scanf(\ } printf(\接收数据成功!\\n\

//111111111111111111111111111111111111111111111 printf(\选择所需要的置信概率(1:0.99;2:0.95):\interer=0,ed=0; scanf(\if(erer==1) { for(ed=0;ed

GeLaBuSi[ed]=GeLaBuSi99[ed]; ta[ed]=ta99[ed]; } } else { for(ed=0;ed

GeLaBuSi[ed]=GeLaBuSi95[ed]; ta[ed]=ta95[ed]; } }

//第二部分

printf(\第二部分************\\n\

printf(\计算平均值&标准偏差估计值************\\n\ //计算平均值&标准偏差估计值

int k=0; //计算平均值 double average=0.0;

for(k=0;k

average+=datas[k]; }

average/=dataNumber;

int l=0; //计算残差 for(l=0;l

CanyuWucha[l]=datas[l]-average; CanyuWucha2[l]=datas[l]-average; CanyuWuchaABS[l]=fabs(datas[l]-average); } int m=0; //计算标准偏差估计值 doubleStanErrorEsti=0.0,ZhongJianLiang=0.0; for(m=0;m

StanErrorEsti=sqrt(ZhongJianLiang/(dataNumber-1)); printf(\数据的平均值是:%lf\\n\ //输出三个计算出的值 printf(\数据的残余误差是:\\n\int n=0;

for(n=0;n

printf(\

printf(\

}

printf(\数据的标准偏差估计值是:%lf\\n\

//第三部分

printf(\第三部分************\\n\

printf(\检测并去除异常数据************\\n\ //检测并去除异常数据 int p=0,q=0,s=0; double temp1=0.0,temp2=0.0; //给残余误差的绝对值按从大到小排序 for(p=0;p

for(q=0;q

if(CanyuWuchaABS[q]

temp1=CanyuWuchaABS[q]; temp2=datas[q]; CanyuWuchaABS[q]=CanyuWuchaABS[q+1]; datas[q]=datas[q+1]; CanyuWuchaABS[q+1]=temp1; datas[q+1]=temp2; } else continue; } } printf(\

printf(\选择所要使用的检验方法(1:莱特检验法;2:肖维纳检验法;3:格拉布斯检验法):\ int r=0,t=0,u=0;

scanf(\ //选取以下三种检验法中的一种 if(r==1) //莱特检验法 { for(t=0;t=(3*StanErrorEsti)) u=1; else u=0;

if(u==0) break; //没有坏值则跳出 else { //有坏值则踢出坏值继续 //重新计算标准偏差估计值 average=0; //重新计算平均值

for(k=t+1;k

average/=(dataNumber-t-1);

for(l=t+1;l

CanyuWucha[l]=datas[l]-average; } StanErrorEsti=0,ZhongJianLiang=0; //重新计算标准偏差估计值 for(m=t+1;m

StanErrorEsti=sqrt(ZhongJianLiang/(dataNumber-1-t-1)); } temp1=0,temp2=0;//重新给残余误差的绝对值按从大到小排序 for(p=t+1;p

if(CanyuWuchaABS[q]

temp1=CanyuWuchaABS[q]; temp2=datas[q]; CanyuWuchaABS[q]=CanyuWuchaABS[q+1]; datas[q]=datas[q+1]; CanyuWuchaABS[q+1]=temp1; datas[q+1]=temp2; } else continue; } } } dataNumber=dataNumber-t; } else if(r==2) //肖维纳检验法 { for(t=0;t=(CH*StanErrorEsti)) u=1; else u=0;

if(u==0) break; //没有坏值则跳出循环 else

{ //有坏值则踢出坏值继续循环 //重新计算标准偏差估计值

average=0; //重新计算平均值 for(k=t+1;k

average/=(dataNumber-t-1); for(l=t+1;l

CanyuWucha[l]=datas[l]-average; } StanErrorEsti=0,ZhongJianLiang=0; //重新计算标准偏差估计值 for(m=t+1;m

StanErrorEsti=sqrt(ZhongJianLiang/(dataNumber-1-t-1)); }

temp1=0,temp2=0; //重新给残余误差的绝对值按从大到小排序 for(p=t+1;p

if(CanyuWuchaABS[q]

temp1=CanyuWuchaABS[q]; temp2=datas[q]; CanyuWuchaABS[q]=CanyuWuchaABS[q+1]; datas[q]=datas[q+1]; CanyuWuchaABS[q+1]=temp1; datas[q+1]=temp2; } else continue; } } } dataNumber=dataNumber-t; } else //格拉布斯检验法 { for(t=0;t

{ double g=0.0; intzxc; zxc=dataNumber-t; g=GeLaBuSi[zxc] ; //根据选择置信概率的不同用不同的系数“g” if(CanyuWuchaABS[t]>=(g*StanErrorEsti)) u=1; else u=0;

if(u==0) break; //没有坏值则跳出循环 else

{ //有坏值则踢出坏值继续循环 //重新计算标准偏差估计值

average=0; //重新计算平均值 for(k=t+1;k

average/=(dataNumber-t-1); for(l=t+1;l

CanyuWucha[l]=datas[l]-average; }

StanErrorEsti=0,ZhongJianLiang=0; //重新计算标准偏差估计值 for(m=t+1;m

StanErrorEsti=sqrt(ZhongJianLiang/(dataNumber-1-t-1)); }

temp1=0,temp2=0; //重新给残余误差的绝对值按从大到小排序 for(p=t+1;p

if(CanyuWuchaABS[q]

temp1=CanyuWuchaABS[q]; temp2=datas[q]; CanyuWuchaABS[q]=CanyuWuchaABS[q+1]; datas[q]=datas[q+1]; CanyuWuchaABS[q+1]=temp1; datas[q+1]=temp2; } else continue; }

}

}

}

dataNumber=dataNumber-t;

//检查完坏值了 printf(\printf(\printf(\

printf(\已经没有坏值了,剩余数据的个数为:%d\\n\ printf(\

printf(\剩余值的平均值是:%lf\\n\ //输出剩余值的平均值 printf(\

printf(\剩余值的标准偏差估计值是:%lf\\n\输出剩余值的标准偏差估计值

//第四部分 printf(\

printf(\第四部分************\\n\

printf(\判断变值系统误差************\\n\ //判断变值系统误差 //累进性系统误差,马利科夫判据 int v=0,w=0,x=0,y=0;

for(v=0;v

for(v=0;v

if(CanyuWucha2[v]!=0) datas2[v-y]=CanyuWucha2[v]; //data2里是去除坏值后原始排序的残余误差 else y=y+1; }

for(v=0;v

CanyuWucha2[v]=datas2[v]+average;

}

printf(\去除坏值之后的残余误差为(原始排序):\\n\ //输出踢出坏值之后的残余误差 n=0;

for(n=0;n

printf(\

printf(\ }

doubleQianBan=0.0,HouBan=0.0,pp=0.0; if(dataNumber%2==0)

{ for(n=0;n<(dataNumber/2-1);n++) {

QianBan+=datas2[n]; } for(n=(dataNumber/2);n

HouBan+=datas2[n]; }

if(fabs(QianBan-HouBan)>=CanyuWuchaABS[t]) { pp=1; printf(\ printf(\存在累进性系统误差,不建议使用本组测量数据!\\n\ } else { pp=0; printf(\ printf(\不存在累进性系统误差!\\n\ } } else

{ QianBan=0,HouBan=0; for(n=0;n<((dataNumber-1)/2-1);n++) {

QianBan+=datas2[n]; } for(n=((dataNumber-1)/2);n

HouBan+=datas2[n]; }

if(fabs(QianBan-HouBan)>=CanyuWuchaABS[t]) { pp=1;

}

printf(\ }

printf(\存在累进性系统误差,不建议使用本组测量数据!\\n\else

{ pp=0; printf(\ printf(\不存在累进性系统误差!\\n\ }

//周期性系统误差,阿卑-赫梅特判据 doubleChengJi=0.0,qq=0.0; for(n=0;n<(dataNumber-1);n++) {

ChengJi+=(datas2[n]*datas2[n+1]); }

if(fabs(ChengJi)>=((sqrt(dataNumber-1)*StanErrorEsti))) { qq=1; printf(\ printf(\存在周期性系统误差,不建议使用本组测量数据!\\n\ } else { qq=0; printf(\ printf(\不存在周期性系统误差!\\n\ } //第五部分 printf(\

printf(\第五部分************\\n\

printf(\给出置信区间************\\n\ //给出置信区间 double StanErrorEsti2=0.0,aa=0.0,bb=0.0,cc=0.0,dd=0.0; cc=sqrt(dataNumber);

StanErrorEsti2=StanErrorEsti/cc; dd=ta[dataNumber]*StanErrorEsti2; aa=average-dd; bb=average+dd;

printf(\置信区间是(%lf,%lf)\\n\return 0; }

本文来源:https://www.bwwdw.com/article/c1d5.html

Top