2017-11-06 31 views
0

私はmatlabに初心者で、ピーク時に面積を計算することに問題があります。ピークを見つけるために使用するコードは次のとおりです。matlabでtrapzを使ってピーク下の面積を計算する方法は?

%% Peak flow analysis 2 (Figure 3) 
flowtable = finalCSVnew(:,[1,7:8]);           % create table containing DateAndTime, Durchflusslm, and SummeaktuellerTagm data 

peakflowEvent = flowtable{:,2} > aa ;          % determine the threshold of flow(m3/h) for peakflowEvent 

% use false as logical vector to determine transition. With function diff, 
% transitions from false (0) to true (1) will be 1 and transitions from true 
% to false will be -1. This will be 1 at the start of a dry period and -1 after the end 
peakTransitions = diff([false; peakflowEvent; false]);        
eventStarts = find(peakTransitions == 1); 
eventEnds = find(peakTransitions == -1) -1; 

% define the peak flow of each event through the flow data (peakflow) and 
% the time when peak flow is happened (peakflowtime) 
[peakflow, peakflowlocrel] = arrayfun(@(s, e) max(flowtable.Durchflusslm(s:e)), eventStarts, eventEnds); 
peakflowlocabs = peakflowlocrel + eventStarts - 1; 
peakflowtime=flowtable.DateAndTime(peakflowlocabs); 

% create result table containing start and end time for peak flow event, the duration 
% between start and end time, and peak flow 
peakflowanalysis2 = table(flowtable.DateAndTime(eventStarts), flowtable.DateAndTime(eventEnds), ... 
       flowtable.DateAndTime(eventEnds) - flowtable.DateAndTime(eventStarts), ... 
       peakflow, peakflowtime, ... 
       'VariableNames', {'Start', 'End', 'Duration','PeakFlow','PeakFlowTime'}); 

numPeakflow2 = height(peakflowanalysis2);         % calculate the number of max flow 

% plot flow and peak flow 
figure(3) 
plot(flowtable.DateAndTime,flowtable.Durchflusslm,flowtable.DateAndTime(peakflowlocabs),peakflow,'v','MarkerFaceColor','red',... 
    'MarkerSize',5) 
xlabel('Date and Time');             % define Date and Time as x-axis 
ylabel('Flow [m3/h]');              % define Flow as y-axis 
title('Peak Flow Events (2)');            % define the title of the plot 
legend('Flow','Peak Flow','Location','Northeast','Orientation','Vertical') 
grid on                  % show grid on plot 
datacursormode on               % enable to display data value interactively in the plot 

% clear temporary variables 
clearvars peakflowEvent peakTransitions eventStarts eventEnds peakflowlocrel peakflowlocabs peakflow peakflowtime 

2つのテーブルと1つの図が作成されます。ピークを含み、各イベントを表す図。ピークの数が=イベント figure の数は、テーブルには、元のデータが含まれています。彼らは、私は下の面積を計算する方法を知りたいのピーク peakflowanalysis2 error

を持っているところ flowtable 以下この表は、フィルタリングされたデータが含まれています各イベントのピーク(11イベント)であり、すべての合計ではありません。私はtrapz()について読んでいましたが、複数のピークに対してどのように適用するのか混乱しました。手伝っていただけませんか?ご助力ありがとうございます。

答えて

0

まず大きなデータセットをテーブルに格納しないでください。データセットは非常に遅いです。私は多くの水文学的データを扱い、常にデータの数値配列と時系列の数値配列(datenum)を使用します。

あなたの洪水のピークの各々の上にピーク使用trapzとループの下の領域を取得するには:あなたはflowdataのインデックスにあなたの開始と終了を変換する必要があり、前に

time_start=datenum(Peakflowanalysis.Start,'dd.mm.yyyy HH:MM:SS'); 
time_end=datenum(Peakflowanalysis.Ende,'dd.mm.yyyy HH:MM:SS'); 
time_array=datenum(flowtable.DateandTime,'dd.mm.yyyy HH:MM:SS'); 

for i=1:height(peakflow) 
ind1=find(time_array==time_start) 
ind2=find(time_array==time_end) 
peak_sum(i)=trapz(flowdata(Start(ind1):Ende(ind2)));% trapz method 
peak_sum(i,2)=sum(flowdata(Start(ind1):Ende(ind2)));%sum method 
end 

また、サムメソッドを使用してみてください。あなたのデータの時間分解能に応じて、あなたのtrapz結果と非常によく似ていることがわかります。

+0

返信いただきありがとうございますスクイジー。申し訳ありませんが、開始と終了をフローデータに変換することについてはまだ理解していません。それについてもっと説明していただけますか? –

+0

Trapzはベクトルを入力する必要があります。大きなベクトルが1つしかないので、各フラッドイベントの開始と終了のインデックスをプロビジョニングする必要があります。あなたは文字列として開始日と終了日しか得られていないようです。開始と終了が同じときにベクトル内のインデックスを見つける必要があります。それは文字列で動作しますが、datenを使用して文字列を数値データに変換する場合よりも遅くなります。 – Squeezie

+0

私のコードを編集しました。多分今はもっと明白です – Squeezie

関連する問題