zoukankan      html  css  js  c++  java
  • MATLAB之数据处理+公式拟合

    MATLAB之数据处理+公式拟合

    前言:由试验得到一组数据,对该组数据进行处理,作图分析,分析各变量的关系,期望得到拟合公式。

    试验数据背景

    本次试验有三个自变量:V、M、G,因变量为F,每组试验重复5次,试验目的是探寻F与三个自变量之间的关系,先定性后定量。
    数据采集格式如下:

    采集值与时间曲线如下:

    数据处理

    (1)判断有用数据,并取出存储
    有用的数据是指在采集值与时间曲线图中,因变量平稳时的取值。可截取平稳区间的数据,对其求平均值,并求方差判断其稳定性。

    (2)单个试验数据处理
    在单个试验中,关键问题是如何判断平稳区间。在经过对时间曲线图的认真分析后,确定如下的处理方法:
    step1:先将txt文件导入数组,并从数组中提取第三列数据(前两列为时间),计算数组的大小;

    step2:判断平稳区间的尾值final,将数组的最后一个数据与倒数第二个比较,看其距离是否足够大,如果足够大,则final即为该值,若不够大,继续用倒数第二个数据与倒数第三个数据进行比较,依次迭代,直到找出两个相邻数据距离足够大的位置,则能够找出final的位置。

    step3:判断平稳区间的初始位置,在step2中已经确定尾值final,经观察发现,尾值对应的因变量与所求的平均值相差不大,依次,依次比较final与(fina-1)对应的因变量的距离,判断是否足够大,如其足够大,则可确定初始位置start。为加快收敛速度,将步长改为5。且又,观察可知,每组数据至少有40个,故从(final-40)处开始比较。

    step4:确定平稳区间的位置后,从原始数据中提取出有用数据,计算平均值,均方差。

    function [m,s] = true_data( data )
    %计算平均值,均方差
    
    data = singal(:,3);         %提取对应的数据
    
    len = length(data) ;        %获取数组长度  
    n = len; 
    while ((n > 0) &(abs(data(n-1 ) - data(n )) < 0.3))
        n = n-1;
    end        
    final = n-3 ;               %确定末尾位置
    
    s = final - 40;               
    while((n > 0)&(abs(data( s ) - data(final)) < 0.05)) 
        s = s - 5;
    end  
    start = s + 10;               %确定初始位置
    
    value = data (start : final);     %提取可用数据
    m = mean(value);                  %计算平均值,均方差
    s = std(value);
    
    end
    

    (3)处理整个文件夹:每个文件夹中的数据,单一变量为grade(volume、magnetic相同),并且每组试验重复三次。命名规则为:第一个数字表示grade,第二个数字表示试验组数,即11.txt,12.txt,13.txt,14.txt,15.txt,21t.txt,22.txt、、、55.txt。利用循环语句,依次处理每个txt文件,将所有处理结果依序存入一个数组中。
    注意:如何按照文件名,依次读取文件内容? strcat函数配合load函数。可利用eval函数。

    V = '5%_' ; M =0; G = 5; group =5;         
    dataPro = cell(G,group);
    for yali = 1 : G
        for zushu = 1 : group
            filename = strcat(num2str(yali),num2str(zushu),'.txt');     %考虑eval函数
            temp = load(filename);
            [mean,sd] = singal_process(temp);
            dataPro{yali,zushu} = [mean,sd];                     % 存储数据    
        end 
    end
    

    (4)处理结果存储:将处理过后的数据(存放在dataPro中)存入execl表格,并将表格根据本组试验数据的特定信息命名存入当前文件夹: 使用xlswrite函数。

    filename = strcat(V,num2str(M),'H');
    numPro = cell2mat(dataPro);
    xlswrite(filename,numPro); 
    

    (5)误差分析:用误差棒注明所测量数据的不确定度的大小(仅参考平均值与均方差)。

    Average=numPro(:,1);                           %平均值
    Variance=numPro(:,2);                          %方差值
    Time=1:1:5; 
    errorbar(Time,Average,Variance,'k')            %函数调用格式 errorbar(A,B,X)
    xlabel('次数');ylabel('力/N');
    

    数据处理结果:

    作图分析

    主要分析M对F的影响:将相同V,G,不同M的三组组数据,将其从开始变化阶段到稳定阶段的图像进行对比分析。
    step1:根据数据处理中的方法,从txt文件中提取有效数据。数据处理的不同之处在于起始点是从数据非零位置,判断更加简单。

    function value = true_data( data )
    %由输入的原始数据(data),输出整理之后的有效数据(value)
    data = -data(:,3);                  %获取第三列数据,并将数据取正
    len = length(data) ;                  %获取数组长度  
    n = len; 
    
    while ((n >0) &&(abs(data(n-1 ) - data(n )) < 0.3))     
        n = n-1;
    end  
    final = n;
    if final >5
         final = final -5 ;           %确定尾点
    end
    
    s = 1;                           
    while((abs(data( s ) ) < 0.03)) 
        s = s + 1;
    end  
    start = s-5;                     %确定初始位置
    
    value = data(start:final);
    end
    

    step2:单条曲线选择画图程序,包括不同曲线的设置。

    function  line_plot( value,i )
    switch i
        case 1                     %第一条曲线   红色    
           plot(value,'-r','LineWidth',1.5);        
        case 2                      %第二条曲线   黑色
           plot(value,'-k','LineWidth',1.5);           
        case 3                     %第三条曲线   蓝色
           plot(value,'-b','LineWidth',1.5);                  
        otherwise   ; 
    end
    end
    

    step3: 将文件名写入num数组中,循环读取数据,画图

     num = [0 250 450];                     %文件名
    for i = 1 : 3
        filename = strcat(num2str(num(i)),'.txt');     
        temp = load(filename);
        value = true_data( temp ) ;          %提取数据
        line_plot( value,i );                %画图
        hold on  
    end 
    

    step4:图像后续处理,图像句柄的使用

    title('xxxxx');
    set(get(gca,'title'),'fontangle','normal','fontweight','normal','fontsize',16);
    xlabel('Time/s');
    set(gca,'xtick',[0:20:150]);
    set(get(gca,'xlabel'),'fontangle','normal','fontweight','bold','fontsize',15);
    ylabel('xxx/N');
    set(get(gca,'ylabel'),'fontangle','normal','fontweight','bold','fontsize',15);
    legend('no1','no2','no3','Location','southeast');
    set(legend,'FontSize',14,'FontWeight','normal','Box','off');
    

    作图结果:

    公式拟合(拟合效果不好,本问题未完成)

    依据试验处理所得的数据,分析自变量V、M、G与因变量为F之间的关系。
    拟合问题可用以下思路处理:
    matlab公式拟合函数:reglm,stepwise,nlinfit,regress,robustfit
    SPSS软件
    神经网络拟合(matlab工具箱或者其他软件,数据量要求较大)
    本次试验暂时只用regress函数做了简单的拟合,效果不好,后续有进展在进行补充。
    step1: 首先将各组数组整理到一个excel表格中,n行4列,每列依次为V,M,G,最后一列为因变量F
    step2:读取excel表格数据,用regress函数拟合公式
    step3:由拟合公式计算出期望数据,与真实数据作图比较

    clear;clc;
    xydata = xlsread('data1.xlsx');
     y = xydata(:, 4);         
     x1= xydata(:, 1);
     x2= xydata(:, 2);
     x3= xydata(:, 3);
     n=length(x1);
    X=[ones(n,1)  x1.^2  x1  x2.^2  x2  x3.^2  x3 ];    %不同的模型修改
    %regress函数各返回值意义:
    % b为变量系数,b(1)为常数项,b(2)依次为模型前面的各项系数;
    % bint回归系数的区间估计;
    % r为残差,越接近零越好>>>>就是误差abs(y - 估计值)
    % rint为置信区间
    %stats为检验回归模型的四个统计量:判定系数R^2,F统计量观测值,,,
    %检验的p的值(p值很小(P<0.001),说明拟合模型有效),误差方差的估计。
    [b,bint,r,rint,stats] = regress(y,X);
    %regress回归误差分析,做误差图像test为预测值
      testing4 = b(1) + b(2)*x1.^2+ b(3)*x1+ b(4)*x2.^2 ...
          + b(5)*x2  + b(6)*x3.^2  + b(7)*x3;
    t = 1 : 180;
    %图形解释:黑线表示原始数据,红线表示模型预测数据
    plot(t,y,'k',t,testing4,'r');
    

    拟合效果图:

  • 相关阅读:
    Arbitrage
    Big Event in HDU
    敌兵布阵
    Eddy's picture
    A Walk Through the Forest 最短路径+深搜
    Holding Bin-Laden Captive! 母函数
    Moving Tables 贪心
    Fire Net
    Number Sequence
    Find your present! map
  • 原文地址:https://www.cnblogs.com/HZL2017/p/6533221.html
Copyright © 2011-2022 走看看