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');
擬合效果圖: