Форум: "Начинающим";
Текущий архив: 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... Helpnull
null
← →
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