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\');
拟合效果图: