由试验得到一组数据(三个自变量,一个因变量),对该组数据进行处理,作图分析,分析各变量的关系,期望得到拟合公式。

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\');

拟合效果图:

版权声明:本文为HZL2017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/HZL2017/p/6533221.html