Используя trapz, чтобы найти область под кривой - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь использовать trapz , чтобы найти область под кривой.

Мои данные x представляют дату и время, а мои данные y представляют ускорение как f(x),Показания акселерометра имеют вид SI.

Пример данных в пределах x (ЧЧ: мм: сс.ССС):

'01:06:48.330'
'01:06:48.352'
'01:06:48.374'

Пример данных в пределах y (значение акселерометра * 9.81):

8.73750256159470
8.59619296907904
8.63520263017352

Когда я ввожу следующую команду (используя весь массив данных):

velocity = trapz(x,y);

Я получаю массив продолжительности, который выглядит следующим образом:

velocity = 
    duration
    00:00:13

Я не совсем уверен, что понимаю, что означает 00:00:13.Когда я рассчитываю скорость, я ожидаю увидеть что-то вроде 9,81 м / с или 5 м / с.Я неправильно использую функцию или мне нужно преобразовать массив длительностей в объект другого типа?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Причина, по которой вы ожидаете m/s выходной сигнал от интегрирования ускорения, заключается просто в том, что вы делаете определенный расчет, включающий (m/s^2)*s, то есть ось y * ось x.

Давайте рассмотрим простой пример, где мы сначала конвертируем в секунды, а затем интегрируем.

x = datetime( {'00:00', '00:01', '00:02'}, 'inputformat', 'HH:mm' ); % Time
y = [1 2 4]; % Acceleration (m/s^2)

x_elapsed_seconds = datenum(x-min(x))*24*60*60; % Datenum returns days, convert to secs

z = trapz( x_elapsed_seconds, y ); % Velocity = 270 m/s

Мы можем проверить, что для этого примера 270 м / с верны, потому что в расчете просто 2 трапеции:

  1. Трапеция от 1m/s^2 до 2m/s^2 длительностью 1 мин = 60 сек: 60*(1+2)/2 = 60*1.5 = 90 m/s
  2. Трапеция от 2m/s^2 до 4m/s^2 длительностью 1 мин = 60 сек .: 60*(2+4)/2 = 60*3 = 180 m/s

Суммируем области трапеции для результата: 90 + 180 = 270 как и ожидалось. Вот почему всегда лучше использовать простой пример для проверки перед использованием реальных данных.

0 голосов
/ 18 мая 2018

Даты обычно сложны в MATLAB.Я бы преобразовал его в секунды, прежде чем делать какие-либо интегралы.Вот пример решения.

x=['01:06:48.330'; '01:06:48.352'; '01:06:48.374'];
datetime(x,'Format','HH:mm:ss.SSS');
secvec = datevec(x);
secvec = 3600*secvec(:,4)+60*secvec(:,5)+secvec(:,6); % times measured in seconds

y = [8.73750256159470; 8.59619296907904; 8.63520263017352]; % accelerations in m/s^2
trapz(secvec,y)
>> ans = 0.380216002428058 % Gained velocity, measured in m/s
...