Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.013 c
2-1158215420
Ola
2006-09-14 10:30
2006.10.01
Строки


3-1154357051
Anton22
2006-07-31 18:44
2006.10.01
mdb доступная в сети


15-1157691602
new_user1
2006-09-08 09:00
2006.10.01
Far...


4-1148476053
Raptoridzevv
2006-05-24 17:07
2006.10.01
мессадж бох - определить хендл


2-1158034025
Drowsy
2006-09-12 08:07
2006.10.01
Копирование строки таблицы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский