Показать сообщение отдельно
  #2  
Старый 28.01.2010, 15:10
riaman riaman вне форума
Прохожий
 
Регистрация: 28.01.2010
Сообщения: 4
Репутация: 10
По умолчанию

Вообще то не совсем понятно, где именно у тебя трудности. Приведу два несколько методов.
1. Тут можно считать "мгновенную" скорость изменения Vm, то есть изменение давления за шаг таймера (в конкретном случае за 2 сек.): Vm=delta_p/(Timer.Interval/1000) Па/сек.
2. А можно считать среднюю скорость Vs за какой-либо интервал времени. К примеру за 60 сек.: Vs=(p_60-p_0)/60. Но тут надо единственное сделать, так, чтоб данная операция выполнялась раз в 60 сек. Это надо в таймере поставить код наподобие этого:
inc(n);
if n=60/(Timer.Interval/1000) then begin
Vs=(p_60-p_0)/60;
n:=0;
end;

если шаг таймера равен 2 сек, то n=60/(Timer.Interval/1000) равносильно n=60/2=15.
Но этот метод не корректный, так как эта средняя скорость будет "кусочная" (дискретная) по 60 секунд, что не очень хорошо. Далее я предложу метод, который лучше данного.
3. Если же тебе надо найти среднюю скорось с момента начала работы, то тут можно пойти двумя путями:
1) запомнить значение давления в начале работы программы, а в таймере поставить код наподобие этого:
t:=t+(Timer.Interval/1000);
Vs=(p-p_0)/t;

2) считать в таймере среднее значение "мгновенной" скорости Vm (Vm см. выше):
inc(n);
Vs=Vm/n;

но этот метод тоже не очень хорошый, так как теоретически может наступить переполнение n и t(обнуление). Хотя может даже при типе Integer программе надо будет работать год без остановки)))
4. Поэтому предлогаю на самый интересный на мой взгляд вариант, решаюший проблему вычисления средней скорости за период. Каждый шаг таймера, надо сохраняешь новое значение давления в последний эллемент массива. Размер массива RM берешь исходя из периода T (в сек), за который который считаешь скорость и интервала таймера: RM=T/(Timer.Interval/1000). Предварительно надо выкинуть устаревшее значение, путем сдвига всех эллементов массива в лево (пример сдвига и записи нового значения в массив: до сдвига-1,2,3,4,5,6 после-2,3,4,5,6,0 после записи нового значения-2,3,4,5,6,7). Теперь считаешь разницу между последним и первым элементом массива и делешь на T. Описанная процедура делается каждый шаг таймера. Следует отметить не большой геммор при старте программы, так как элементы массива ещё не будут заполены. Но это можно решить тупо - подождать заполнения массива и не считать скорость, пока все элементы не заполнятся. Или же подумать и вначале считать скорость немного подругому. Этот метод может занимать много памяти из-зи хранения массива, а так же сдвиг элементов может занять определённое кол-во времени. Поэтому я думаю надо ставить шаг таймера 1 секунду, чтоб подстраховаться на затраты времени на вычисления (сдвиг и др.) и на вывод результатов. Пусть он при этом с тормозами выдаёт значение 1 раз в 1,5 сек, чем 1 раз в 2,5. Ну там походу подбирать надо. (В этом методе так же можно сохранять не давление, а мгновенные скорости и считать от них среднее Сумма(Vm)/MR . Но я не знаю, равносильны ли данные способы, захочешь, можешь проверить. Хотя я бы предпочёл сохранять значения давления, это точно правильно.)
Тут было бы не плохо добавить графики средней и мгновенной скорости. Если надо будет, я тебе могу помочь с графиками. Это реализует стандартный компонент дельфи. (Кстати, тогда в компоненте графиков можно хранить значения давления, а не массиве. Хотя это те же самые массивы))).
Ответить с цитированием