用MatlAB处理实验数据程序

程序实现的功能:

 disp('#################################################################')
    disp('##                      基本数据处理程序                        ##')
    disp('####请选择:                                                  ####')
    disp('##        0:求平均值                                            ##')
    disp('##        1:求残差                                              ##')
    disp('##        2:求标准差                                            ##')
    disp('##        3:算术平均值的标准差                                   ##')
    disp('##        4:极限误差                                            ##')
    disp('##        5:判断粗大误差                                        ##')
    disp('##        6:判断系统误差                                        ##')
    disp('##        7:一键分析                                            ##')
    disp('##        8:退出                                                ##')
    disp('##################################################################')

源程序:

clear
clc
%以下为罗曼诺夫斯基准则中的判别表 a=0.05
cd_va=[4.97 3.56 3.30 2.78 2.62 2.51 2.43 2.37 2.33 2.29 2.26 2.24 2.22 2.20 2.18 2.17 2.26 2.15 2.14 2.13 2.12 2.11 2.10 2.10 2.09 2.09 2.08];

%以下为t分布表,a=0.01
t=[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];

%以下为检验周期性系统误差需要的表 p=0.95
zhouqi=[0.39 0.41 0.445 0.468 0.492 0.512 0.531 0.548 0.564 0.578 0.591 0.603 0.614 0.624];

%以下数据为罗曼诺夫斯基判别粗大误差所用数据     取a=0.01
luo=[11.46 6.53 5.04 4.36 3.96 3.71 3.53 3.41 3.31 3.23 3.17 3.12 3.08 3.04 3.01 3.00 2.95 2.93];

%=0;      %显著度


while 1
    %x=[20.42 20.43 20.40 20.43 20.42 20.43 20.39 20.30 20.40 20.43 20.42 20.41 20.39 20.39 20.40];
    disp('请在下面输入测量列,格式如右所示:[n1 n2 n3 n4 ... nx]')
    x=input('')
    l=length(x);               
    mean_x=0;                   %平均值
    for i=1:l
        mean_x=mean_x+x(1,i)/l;
    end

    v=0;
    for i=1:l
        v(1,i)=x(1,i)-mean_x;     %v为残差
    end
    y=0;             %中间变量
    for i=1:l
         y=y+v(1,i)*v(1,i)/(l-1);
    end
    q=sqrt(y);         %  q为标准差
   
    qx=q/sqrt(l);   %算术平均的标准差
   
    dx=qx*t(1,(l-4)); %极限误差
   
    %------------------------------------------------------
    %以下用罗曼夫斯基准则判别粗大误差
    %------------------------------------------------------
  
    for i=1:l        %对残差求绝对值
        s(1,i)=abs(v(1,i));
    end
    max_=max(s); %求残差绝对值中的最大值
        n=1;         %改粗大误差值对应的列号
        for i=1:l
            if s(1,i)==max_
                break;
            else
                n=n+1;
            end
           end
        qq=1;      %剔除算法
        pp=1;
        for i=1:l
            if i==n
           
                pp=pp+1;
            else
             x1(1,qq)=x(1,pp);      %剩余测量列
             qq=qq+1;
             pp=pp+1;
            end
        end
    
       
     %计算剩余测量列的平均值、标准差、等
        len=length(x1);
        mean_x1=0;                   %平均值
        for i=1:len
            mean_x1=mean_x1+x1(1,i)/len;
        end
        v1=0;
        for i=1:len
            v1(1,i)=x1(1,i)-mean_x1;     %v1为残差
        end

        y1=0;         %中间变量
        for i=1:len
            y1=y1+v1(1,i)*v1(1,i)/(len-1);
        end
        q1=sqrt(y1);         %  q1为标准差
       
        qx1=q1/sqrt(len);   %算术平均的标准差
       
        dx1=qx1*t(1,(len-4)); %极限误差
       
        kl=luo(1,(l-3));
        kl=kl*q1;
        tl=x(1,n)-x1;
        tl=abs(tl);
        if tl>kl
            lyt_f=0;
        else
            lyt_f=1;
        end
       
       
       
        for i=1:len        %对残差求绝对值
            s1(1,i)=abs(v1(1,i));
        end
       
        max_2=max(s1); %求残差绝对值中的最大值
        n2=1;
        for i=1:len
            if s1(1,i)==max_2
            break;
            else
            n2=n2+1;
            end
        end
 % 第二次剔除可疑值     
        qq1=1;
        pp1=1;
        for i=1:len
            if i==n2
           
                pp1=pp1+1;
            else
                h1(1,qq1)=x1(1,pp1);
                qq1=qq1+1;
                pp1=pp1+1;
            end
        end
 
        len2=length(x1);
        mean_x2=0;                   %平均值
        for i=1:len2
            mean_x2=mean_x2+x1(1,i)/len2;
        end
        v2=0;
        for i=1:len2
            v2(1,i)=x1(1,i)-mean_x2;     %v为残差
        end
        y2=0;
        for i=1:len2
            y2=y2+v2(1,i)*v2(1,i)/(len2-1);
        end
       
        q2=sqrt(y2);         %  q为标准差
       
        k2=q2*luo(1,(l-3));
        can1=x1(1,n2)-mean_x2;
        can1=abs(can1);
        if can1>k2
            lyt_f1=0;       %有粗大误差
        else
            lyt_f1=1;
        
        end
       
       
     %残余误差校核法校核系统误差
    if lyt_f==1
        for i=1:l
            v2(1,i)=v(1,I);
        end
    else
        for i=1:len
            v2(1,i)=v1(1,i);
        end
    end
    
   
    %校核线性误差
    len1=length(v2);
    k=(len1+1)/2;
    k=fix(k);         %截尾取整
    sum1=0;
    for i=1:k
        sum1=sum1+v2(1,i);
    end
    sum2=0;
    for i=(k+1):len1
        sum2=sum2+v2(1,i);
    end
   
    sub=sum1-sum2;
    sub=abs(sub);
    if sub<0.1  %差值小于0.1断定含有线性误差,wucha=0
        wucha=1;
    else
        wucha=0;
    end
   
    % 校核周期线性误差
    bz=0;
    for i=1:(len1-1)
        bz=bz+(v2(1,i)-v2(1,(i+1)))*(v2(1,i)-v2(1,(i+1)));
    end
    ba=0;
    for i=1:len1
        bz=ba+v2(1,i)*v2(1,i);
    end
    xx1=bz/(2*ba);
    xx2=zhouqi(1,(len1-3));   %xx1>xx2不存在周期性误差
   
    while 1
       
    clc
    disp('#################################################################')
    disp('##                      基本数据处理程序                        ##')
    disp('####请选择:                                                  ####')
    disp('##        0:求平均值                                            ##')
    disp('##        1:求残差                                              ##')
    disp('##        2:求标准差                                            ##')
    disp('##        3:算术平均值的标准差                                   ##')
    disp('##        4:极限误差                                            ##')
    disp('##        5:判断粗大误差                                        ##')
    disp('##        6:判断系统误差                                        ##')
    disp('##        7:一键分析                                            ##')
    disp('##        8:退出                                                ##')
    disp('##################################################################')
   
    disp('输入你的选项:')
    option=input('')
    clc
    switch option
        case 0
            if lyt_f==1
                disp('该测量列的平均值:')
                mean_x
                disp('按回车键继续……')
                zhu=input('')
            else
                disp('该测量列中存在粗大误差,是否剔除? 0:剔除,1:不剔除')
                pdf=input('')
                if pdf==0
                    clc
                    disp('剔除粗大误差后的平均值为:')
                   
                    mean_x1
                disp('按回车键继续……')
                zhu=input('')                
                else
                    disp('该测量列含有粗大误差,你未剔除改粗大误差,未剔除粗大误差测量列的平均值为:')
                    mean_x
                 disp('按回车键继续……')
                zhu=input('')
                end  
            end
          
           
        case 1
             if lyt_f==1
                disp('该测量列的残差:')
                v
                 disp('按回车键继续……')
                zhu=input('')        
            else
                disp('该测量列中存在粗大误差,是否剔除? 0:剔除,1:不剔除')
                pdf=input('')
                clc
                if pdf==0
                    disp('剔除粗大误差后的残差为:')
                    v1
                  disp('按回车键继续……')
                zhu=input('')           
                else
                    disp('该测量列含有粗大误差,你未剔除改粗大误差,未剔除粗大误差测量列的平均值为:')
                    v
                 disp('按回车键继续……')
                zhu=input('')        
                end  
            end
              
        case 2
               if lyt_f==1
                disp('该测量列的标准差:')
                q
                 disp('按回车键继续……')
                zhu=input('')     
            else
                disp('该测量列中存在粗大误差,是否剔除? 0:剔除,1:不剔除')
                pdf=input('')
                clc
                if pdf==0
                    disp('剔除粗大误差后的标准差为:')
                    q1
                  disp('按回车键继续……')
                zhu=input('')
                                
                else
                    disp('该测量列含有粗大误差,你未剔除改粗大误差,未剔除粗大误差测量列的标准差值为:')
                    q
                 disp('按回车键继续……')
                zhu=input('')       
                end  
            end
           
           
        case 3
             if lyt_f==1
                disp('该测量列算术平均值的标准差:')
                qx
                 disp('按回车键继续……')
                zhu=input('')  
            else
                disp('该测量列中存在粗大误差,是否剔除? 0:剔除,1:不剔除')
                pdf=input('')
                clc
                if pdf==0
                    disp('剔除粗大误差后算术平均值的标准差为:')
                    qx1
                 disp('按回车键继续……')
                zhu=input('')          
                else
                    disp('该测量列含有粗大误差,你未剔除改粗大误差,未剔除粗大误差测量列算术平均值的标准差为:')
                    qx
                 disp('按回车键继续……')
                zhu=input('')          
                end  
             end
        case 4
             if lyt_f==1
                disp('按t分布、a=0.01计算测量列的极限误差:')
                dx
                 disp('按回车键继续……')
                zhu=input('')   
            else
                disp('该测量列中存在粗大误差,是否剔除? 0:剔除,1:不剔除')
                pdf=input('')
                clc
                if pdf==0
                    disp('剔除粗大误差后,按t分布、a=0.01 计算测量列的极限误差为:')
                    dx1
                 disp('按回车键继续……')
                zhu=input('')    
                else
                    disp('该测量列含有粗大误差,你未剔除改粗大误差!!未剔除粗大误差的测量列,按t分布、a=0.01计算测量列的列极限误差为:')
                    dx
                 disp('按回车键继续……')
                zhu=input('')                
                end  
             end 
       
        case 5
            if lyt_f==1
                disp('使用罗曼诺夫斯基判别法判别粗大误差,a=0.01')
                disp('该测量列无粗大误差')
                 disp('按回车键继续……')
                zhu=input('')     
            else
                disp('使用罗曼诺夫斯基判别法判别粗大误差,a=0.01')
                disp('该测量列中含有粗大误差')
                disp('该粗大误差所在的测量列列值为:')
                n
                disp('该值为:')
                x(1,n)
                disp('是否剔除该值? 0:剔除,1不剔除')
                jj=input('')
                clc
                disp('再次使用罗曼诺夫斯基判别法判别剩余测量列的粗大误差,a=0.01')
                disp('计算剔除后是否还有粗大误差……')
                disp('                          ')
                disp('计算完毕:')
                if lyt_f1==1
                    disp('                    ')
                   
                    disp('剔除后的测量列不含粗大误差')
                 disp('按回车键继续……')
                zhu=input('')              
                else
                    disp('                       ')
                    disp('使用罗曼诺夫斯基判别法判别粗大误差,a=0.01')
                    disp('剔除后的测量列仍含粗大误差')
                    disp('该粗大误差所在的测量列列值为:')
                    n1
                    disp('该值为:')
                    x1(1,n2)
                  disp('按回车键继续……')
                zhu=input('')               
                end
            end
       
        case 6
            disp('')
            disp('使用残余误差校核法校核该测量列的系统误差')
            if wucha==1
                disp('该测量列含有线性系统误差')
                           
            else
                disp('该测量列不含线性系统误差')
                      
            end
            disp('')
            disp('使用小样本序校核法校核该测量列的周期性系统误差')           
            if xx1>xx2
                disp('')
                disp('该测量列不含有周期性系统误差')
                 disp('按回车键继续……')
                zhu=input('')           
            else
                disp('该测量列含有周期性误差')
                 disp('按回车键继续……')
                zhu=input('')       
            end
      
        case 7
            disp(['该测量列为',x ])
            x
           
          
            if lyt_f==1
                disp('使用罗曼诺夫斯基判别法判别粗大误差,a=0.01')
                disp(['该测量列无粗大误差'])
                disp(['该测量列的算术平均值',mean_x])
                mean_x
                disp(['该测量列的标准差',q])
                q
                disp(['该测量列算术平均值的标准差',qx])
                qx
                disp(['该测量列的极限误差dx',dx])
             
            else
                disp('使用罗曼诺夫斯基判别法判别粗大误差,a=0.01')
                disp('该测量列含有粗大误差')
                disp('该粗大误差在的列值为:')
                n
                disp('该值为:')
                x(1,n)
                                   
                if lyt_f1==1
                    disp('将该值剔除……')
                    disp('再次使用罗曼诺夫斯基判别法判别剩余测量列的粗大误差,a=0.01')
                    disp('判别中……')
                    disp('判别完毕:')
                    disp('剔除粗大误差后的测量列无粗大误差')
                else
                    disp('剔除粗大误差后的测量列仍有粗大误差')
                end
                disp('                                         ')
                disp(['剔除粗大误差后的测量列的算术平均值',mean_x1])
                mean_x1
                disp(['剔除粗大误差后的测量列的标准差',q1])
                q1
                disp(['剔除粗大误差后的测量列算术平均值的标准差',qx1])
                qx1
                disp(['剔除粗大误差后的测量列的极限误差',dx1])
                dx1
            end
            disp('使用残余误差校核法校核该测量列的线性系统误差:')
            if wucha==1
                disp('该测量列含有线性系统误差')
            else
                disp('该测量列不含线性系统误差')
            end
            disp('                                            ')
            disp('使用小样本序校核法校核该测量列的周期性系统误差:')
            if xx1>xx2
               
                disp('该测量列不含有周期性系统误差')
            else
                disp('该测量列含有周期性系统误差')
            end
                 disp('按回车键继续……')
                zhu=input('')      
        case 8
            break;
               
  
        otherwise
            disp('你的输入不符合规则,请重新输入。')
                 disp('按回车键继续……')
                zhu=input('')           
    end
    end
    disp('确认退出程序? 0:否,继续计算下组数据 / 1:是,退出程序')
    flag=input('')
    clc
    if flag==1
        break
    end
       
end
               

                   
                   
               
 

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页