Расчет наклона в доменах -ve, zero и + ve - PullRequest
1 голос
/ 21 мая 2009

Вообразите синусоидальную волну, колеблющуюся около нулевой линии. Моя задача - рассчитать наклон в нескольких случайных точках вдоль волны, используя довольно грубую шкалу оси X. (да, это имеет реальное применение)

Когда волна находится в + ve terrirtory (выше нулевой линии), наклон можно рассчитать из:

Slope = (y(n) / y(n-1)) - 1

Это приводит к тому, что v-образные склоны движутся вверх и -в вниз.

Проблема в том, что это нужно переключать, когда мы находимся на -ve территории, и тогда требуются еще два выражения, когда одно из значений равно нулю, всего четыре выражения, которые должны быть выбраны программно с условными операторами.

Я хотел бы найти ОДНО выражение, которое охватывает все четыре условия, поскольку оно находится в центре интенсивного алгоритма и подсчитывает количество кликов!

Я уверен, что это было бы тривиальным решением для математического гения, но этим усталым глазам это ускользает от меня ...

Добавлено:

«Синусоида» на самом деле является индикатором MACD, который выводится из (случайного) изменения цены финансовых рынков. пример будет здесь:

http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_average_conve

Наклон (например, жирной черной линии на нижнем графике) - это то, что мне нужно вычислить, определяемое просто как вверх или вниз (где заголовок вверх + ve)

Проблема в том, что как + ve, так и -ve наклон могут быть выше и ниже нуля. Расчет наклона также может выполняться с использованием приращений, которые пересекают нулевую линию и нулевую линию.

Было бы неплохо найти решение, которое не включает в себя тонну операторов IF ... как, например, смещение всех значений y на фиксированную величину, чтобы они стали + ve, а затем вычисление наклона в области + ve. Мне нужно было бы выбрать число, которое исторически, у никогда не было ниже, например пару порядков, например, (99), и тогда я мог бы выполнить расчет отклонения и одного наклона?

Ответы [ 4 ]

3 голосов
/ 21 мая 2009

что вы подразумеваете под синусоидой? Вы имеете в виду математически сгенерированный график y = a sin(bx) или плавную кривую, подогнанную к некоторым экспериментальным точкам с помощью сплайнов, которые просто напоминают синусоидальную волну в том, что она колеблется вокруг оси x? если первое, вы можете дифференцировать его математически и получить точный наклон в любой точке. если последнее, формула, которую вы ищете, это

slope(x) = (y(x-delta) - y(x+delta))/(2 * delta)

эксперимент с разными значениями дельты. здесь нет условий; Знаки числителя и знаменателя автоматически гарантируют, что вы получите правильный знак для склона.

2 голосов
/ 21 мая 2009

Склон просто

slope = y(n)-y(n-1)

Или, если у вас есть единицы на оси x, разделите это на один шаг по оси x (то есть x (n) -x (n-1)).

Эта формула является своего рода определением, и не имеет значения, на какой стороне оси X вы находитесь. (Я говорю «вроде как» здесь, поскольку наклон является пределом этого уравнения, так как вы выбираете ячейки очень близко друг к другу, поэтому это уравнение является приближенным, и могут использоваться другие приближения.)

Имейте в виду, что наклон шумных данных будет выглядеть еще более шумным.

Я подозреваю, что первые несколько параграфов страницы slope в Википедии помогут вам в этом.

0 голосов
/ 05 января 2011

Вам не нужен уклон; Вы можете сделать что-то вроде этого:

(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0) ) < 
iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2)

означает уменьшение. Еще возрастающий график при условии, что:

(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0) ) >0
0 голосов
/ 21 мая 2009

Если вы ищете наклон синусоиды, это делается с помощью стандартных функций исчисления.

Наклон линии f(x)=sin(x) равен f'(x)=cos(x).

Однако, основываясь на вашей формуле, я не совсем уверен, что вы ищете. Может быть, вам нужно это уточнить.

Но если вам нужен подход, показанный в вашем вопросе, я думаю, что ваше беспокойство по поводу производительности здесь неуместно. Чтобы сделать это вычисление как одно арифметическое выражение, вам нужно будет умножить на -1 в зависимости от того, находитесь ли вы выше или ниже оси x (и переходите ли вы по этой оси от f (n). -1) до f (n)).

Вероятно, это будет медленнее (или, по крайней мере, не быстрее), чем простая последовательность операторов if после того, как она будет скомпилирована для машинного языка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...