Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Как найти пики в массиве?   Найти похожие ветки 

 
Lem   (2006-09-08 11:45) [0]

Добрый день! Помогите пожалуйста с поиском максимумов в массиве:
time[i]:array of doble;
ch1[i]: array of doble;
 Мне надо находить пики значений в ch1[i] и запоминать значения  time[i] при этих пиках. Но прикол в том,что пики ch1[i] разные по величине, но выше 3 (Диапазон значений 0-5,12), и максимальное значение может быть при мноргих i. С виду всё просто, но уменя не складываються вложенные циклы. Пример значений ch1[i]:1.1;1.5;1.3;2.5;2.4;3;2.9;3.8;
4.2;4.5;4.5;4.5;4.5;3.2;2.5;1.1;1.5;3.3;4.8;5.1;5.1;4.8;4.7;5;4.6;4.5;4.1;3.5;2. 8;1.2... Helpnullnull


 
Kolan ©   (2006-09-08 11:52) [1]

Внятно сформулируй когда точка считаеться пиком.


 
Сергей М. ©   (2006-09-08 11:56) [2]

Экстремумы ("пики") ф-ции находятся по смене знака 1-й производной.


 
StriderMan ©   (2006-09-08 12:01) [3]

Решал такую задачу в дипломе.
Действительно, подход [2]


 
Джо ©   (2006-09-08 12:05) [4]

Сергей М., StriderMan.
Дык, это функцию сначала найти нужно. :)


 
Думкин ©   (2006-09-08 12:05) [5]

1. Пок атолько поток сознания. Ясность надо.

2. > Сергей М. ©   (08.09.06 11:56) [2] Дайте понятие производной для функции определенной на множестве с дискретной топологией.


 
Наиль ©   (2006-09-08 12:06) [6]

Нет необходимости использовать вложеные циклы.
Вводишь переменую N
Проходишь по массиву (1 раз)
и если ch1[i] больше левого и правого соседа и больше 3х, то
Resultat[n]:=time[i]
ResIndex[n]:=i;
inc(n);

Изначально длину массивов Resultat и ResIndex устанавливаешь равной длине ch1. А потом укорачиваешь до N.
Приблизительно так.


 
Сергей М. ©   (2006-09-08 12:19) [7]

Если я правильно понял вопрос, то для не слишком большого массива ch1 (но состоящего не менее чем из 3-х элементов, при менее 3-х элементов понятие "пик" теряет смысл):


var
 DeltaSign, TmpDeltaSign: TValueSign;
 time[i]:array of doble;
 ch1[i]: array of doble;

..

 DeltaSign := Sign(ch1[1] - ch1[0]);
 for i:= 2 to Length(ch1)-1 do begin
   TmpDeltaSign := Sign(ch1[i] - ch[i-1]);
   if DeltaSign <> TmpDeltaSign then
     begin
       if TmpDeltaSign <> 0 then
          SetLength(lime, Length(Time)+1);
       Time[Length(Time)-1] := ch1[i];
       DeltaSign := TempDeltaSign;
     end;
 end;



> Думкин ©   (08.09.06 12:05) [5]


> Дайте понятие производной для функции определенной на множестве
> с дискретной топологией


Тоже самое определение, что и для любой другой непрерывной ф-ции (не важно как заданной - таблично как у автора или аналитически).

Производная - она и в Африке производная)


 
Думкин ©   (2006-09-08 12:21) [8]

> Сергей М. ©   (08.09.06 12:19) [7]
> Тоже самое определение, что и для любой другой непрерывной
> ф-ции (не важно как заданной - таблично как у автора или
> аналитически).
>
> Производная - она и в Африке производная)

Так дайте мне определение производной для таблично заданой функции. Умоляю.


 
Думкин ©   (2006-09-08 12:23) [9]

Впрочем можете не продолжать. Вы упомянули про любые непрерывные функции - этого достаточно.
1. Вы должны показать, что эта функция - непрерывна.
2. Не все непрерывные функции имеют производные. Есть даже функции непрерывные, которые не имеют производных ни в одной точке.


 
StriderMan ©   (2006-09-08 12:27) [10]


> Думкин ©   (08.09.06 12:23) [9]

задача чисто практическая, и к топологии отношение имеет весьма опосредованное, т.к. что не надо блистать знанием высшей математики, все равно не оценят.

а практическое решение дано в [6]. С некими оговорками это будет работать вполне сносно.


 
Думкин ©   (2006-09-08 12:32) [11]

> StriderMan ©   (08.09.06 12:27) [10]

Извините, но речь шла о производных и вы потвердили это.
Производные знаете ли тоже для практики.
Я прошу не елозить пло полу - а показать мне производные.

Кто чего оценит - мне по барабану, я хочу увидеть производные. И как вы решали такую же задачу с ИХ помощью. Пока я увидел решение БЕЗ ИХ помощи.

Хотя свести можно - но так и надо показать как. Я вижу как. Но это все-таки другая уже функция - на другом множестве.
Практическая. не люблю технарей. 6(


 
Сергей М. ©   (2006-09-08 12:33) [12]


> Думкин ©   (08.09.06 12:21) [8]


"И тут Остапа понесло .." (С)


 
Думкин ©   (2006-09-08 12:33) [13]

При этом так  и не было дано определение пика и в чем были затруднения с вложенными циклами. А посему даже практической задачи пока не озвучено.


 
StriderMan ©   (2006-09-08 12:37) [14]


> Думкин ©   (08.09.06 12:32) [11]

саму производную вычислять не надо, нужно только изменение знака. а знак производной поменяется грубо говоря при смене "возрастания" значения ф-ции на убывание, и наоборот.

dY/dX < 0 меняется на dY/dX > 0. на табличной функции это посчитать можно.


 
Думкин ©   (2006-09-08 12:39) [15]

> StriderMan ©   (08.09.06 12:37) [14]

Засчитано. :) Но это же смешно. :)


 
Думкин ©   (2006-09-08 12:43) [16]

А считать не надо, потому что и нельзя. Надо просто исходить из понятия возрастает/убывает - это уже для любых функций на множествах с линейным порядком определено, что и видим.
Но понятия пика так и не увидел. В чем проблемы автора - так и не понял.


 
StriderMan ©   (2006-09-08 12:43) [17]


> Думкин ©   (08.09.06 12:39) [15]
> Засчитано. :) Но это же смешно. :)

а мы, технари, вообще веселый народ :)

на практике как ни странно работает.

таким методом я находил максимумы в интерференционной картины по данным, полученным при проходе датчика вдоль оси симметрии этой самой картины. максимальная ошибка получилась около 3%


 
Думкин ©   (2006-09-08 12:46) [18]

> StriderMan ©   (08.09.06 12:43) [17]

Метод или шметод - я не спорю. Безусловно работает - а иначе как?
Или вы о том что находили пики в непрерывном имея дискретные данные? И поэтому ошибка?
Ведь если под пиками понимать ваши пики - то в приведенной задаче с ошибкой 0% они находятся.


 
StriderMan ©   (2006-09-08 12:49) [19]


> Думкин ©   (08.09.06 12:46) [18]

.дискретные данные, функция непрерывна. а погрешность накопилась из ошибок измерения и ошибки дискретизации


 
Думкин ©   (2006-09-08 12:55) [20]

> StriderMan ©   (08.09.06 12:49) [19]

С этого и надо начинать. :)

А у автора скорее всего проще - лаба или зачет. С прошлого года.


 
Сергей М. ©   (2006-09-08 12:58) [21]


> Надо просто исходить из понятия возрастает/убывает


Из него и исходим)
Давай уже дурака валять не будем, ок ?)

В массиве - ломаная линия, пользуем геометр.смысл производной в безусловном утверждении, что приращение аргумента постоянно и равно 1, в дискретизации, как понимаем, - бесконечно малое значение, "стремящееся к нулю".

Продолжать ? Или закончим дурацкую дискуссию ?)
Предлагаю закончить)


 
StriderMan ©   (2006-09-08 12:59) [22]


> Думкин ©   (08.09.06 12:55) [20]
> А у автора скорее всего проще - лаба или зачет. С прошлого
> года.

наверняка. тока наше решение врят-ли поможет, решать наверное полагается так, как рассказывали на занятиях. с использованием штатных средств из Численных Методов.


 
Думкин ©   (2006-09-08 13:08) [23]

> Сергей М. ©   (08.09.06 12:58) [21]

Не будем. Но это все-таки иное, - не производная.
закончил.


 
Lem   (2006-09-12 12:56) [24]

Уважвемые мастера, проблема в том,что эти массивы могут быть огромной длинны (данные с АЦП) ,пик - это максимальное значение  дискретной кривой, которая получается при обрезании значений меньше 3, лучше покажу:

              ****   -пик                                               ***              *
        ...  .       .                     ******                      .      .            .  .
   .   .   .            . .             ..            ..  ..               .        .          .    .
 ..  ..                     ..        .                 ..  .     **    .           .     .  .     .
3___________________.___._______________.__._.__.________.__._ .___
.                                . .                            . .    .                 ...
Производная в данной задаче будет равна нулю и в пиках и в локальных экстремумах. Пик может иметь и одно значение (последнее значение) - как тут можно найти производную? Я сам технарь, в программировании не силён, но пришлось елемент моего маразма привожу, может хоть идею поймёте,или подскажите что-то лучше.  

i,k,j                      :integer;
a,Ch1,t    :array of double;

for i:=0 to n-1 do begin
          if Ch1[i]>3 then begin
            inc(j);
            a[i]:=Ch1[i];
          end else
          begin
            if j<>0 then begin
              for k:=i-j to i do begin
                 if a[k-1]<a[k] then t[k]:=a[k] else t[k]:=0;
              end;
            end;
            a[i]:=0;
            j:=0;
          end;



 
Думкин ©   (2006-09-12 13:27) [25]

> Lem   (12.09.06 12:56) [24]

Про производную не надо начинать. Это увод в сторону. Нет тут производных. Из всех сплайнов выбран линейный и на нем нечто строится.

Ищем максимум в массиве, но запоминаем его только в том случае, если мах значение еще и больше порога.

Max := a[0];
MaxI := 0;
for i:=1 to Pred(length(a)) do begin
if (a[i+1]>Max) and (a[i+1]>3) then begin
 MaxI := i+1;
 Max := a[i+1];
end;
end;

if Max < 3 then ShowMessage("фигвам")
else ShowMessage(Format("Пик %f достигнут например в точке %d",[Max,MaxI]));


 
Думкин ©   (2006-09-12 13:29) [26]

Использованы строггие неравенства - что не верно. Надо чтобы одно из них было нестрогим - какое - решать вам.


 
Думкин ©   (2006-09-12 13:31) [27]


> for i:=1 to Pred(length(a)) do begin
> if (a[i+1]>Max) and (a[i+1]>3) then begin


так верно:

for i:=1 to Pred(length(a)) do begin
if (a[i]>Max) and (a[i]>3) then begin
 MaxI := i;
 Max := a[i];


 
Сергей М. ©   (2006-09-12 13:36) [28]


> Lem   (12.09.06 12:56) [24]


Перед поиском "пиков" удали повторяющиеся значения, тогда алгоритм в [7] будет применим.


 
Сергей М. ©   (2006-09-12 13:47) [29]


> проблема в том,что эти массивы могут быть огромной длинны
> (данные с АЦП)


Зачем же поток оцифрованных данных писать в бешеного размера массив ?
Или тебя не интересует их риэлтайм-обработка ?


 
Сергей М. ©   (2006-09-12 14:03) [30]

И, кстати, в связи с чем возникла задача определения значений "пиков" в потоке оцифрованных данных ?


 
Lem   (2006-09-13 10:46) [31]

Проблема измерения пиков возникла поскольку ch1 - сигнал от датчиков, a time и в Африке time. Всё сводиться к измерению частоты вращения. А что кассается риэлтайм-обработки - было бы очени круто, но не хватило таланта программирования (по образованию я автомобилист), так как для данной задачи хватает  частота дискретизации времени 50 кГц, то в результате было принято решение в качестве АЦП попробывать использовать самое простое и дешёвое - звуковая карта (а главное везде есть). Что окончательно выйдет не совсем понятно, но то что сигнал от датчиков регистрируется чётко это факт.
  Огромное всем спасибо !!!   null


 
Сергей М. ©   (2006-09-13 11:00) [32]


> Всё сводиться к измерению частоты вращения


Тогда ты не в ту сторону движешься.
Тебе не пики нужно искать, а спектр анализировать ..


> так как для данной задачи хватает  частота дискретизации
> времени 50 кГц, то в результате было принято решение в качестве
> АЦП попробывать использовать самое простое и дешёвое - звуковая
> карта


А какова макс.возможная скорость вращения ?


 
Lem   (2006-09-14 10:22) [33]

Анализировать спектр не совсем правильно, измеряется частота как на входе, так и на выходе и сравниваютяся между собой. Максимаьлные обороты до 400 об/мин.


 
Сергей М. ©   (2006-09-14 11:55) [34]


> Анализировать спектр не совсем правильно


Это почему же ?
Как раз и правильно, коль скоро у тебя куча гармоник, судя по рисунку ..


> Максимаьлные обороты до 400 об/мин.


Не всякая аудиокарта (тем более из разряда ширпотреба) сможет обеспечить 48-килогерцовую оцифровку. А тебе нужно как раз не менее 48кгц, а еще лучше 96кгц



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.046 c
2-1158065122
p314
2006-09-12 16:45
2006.10.01
Двойное объявление классов


15-1157662081
Offtoper
2006-09-08 00:48
2006.10.01
Просто оффтоп


2-1157716372
Galiaf
2006-09-08 15:52
2006.10.01
присвоение данных из ф-ции


2-1157735163
Juri
2006-09-08 21:06
2006.10.01
Отправить E-Mail


1-1156155326
anton773
2006-08-21 14:15
2006.10.01
PrintDocument и PrintprevievDialog