Эффективный алгоритм определения диапазона [a, b] синусоидальной волны с интервалом - PullRequest
0 голосов
/ 25 декабря 2010

У меня есть синусоида, параметры которой я могу определить (они вводятся пользователем).Это имеет вид y = a * sin (m * x + t)

Я хотел бы знать, знает ли кто-нибудь эффективный алгоритм для определения диапазона y для данного интервала, который идет от [0, x] (x снова является другим входом)

Например:

для y = sin (x) (то есть a = 1, t = 0, m = 1) для интервала[0, 4] Я бы хотел вывод, например, [1, -0,756802]

Пожалуйста, имейте в виду, что m и t могут быть любыми.Таким образом, кривая y не обязательно должна начинаться (или заканчиваться) в 0 (или 1).Это может начаться где угодно.

Кроме того, обратите внимание, что x будет дискретным.

Любые идеи?

PS: Я буду использовать python для реализации алгоритма.

Ответы [ 3 ]

2 голосов
/ 25 декабря 2010

Поскольку функция y(x) = a*sin(m*x + t) непрерывна, максимум будет либо на одном из концов интервала, либо на максимуме внутреннего интервала, в этом случае dy/dx будет равен нулю.

Итак:
1. Найдите значения y (x) в конце интервала.
2. Узнайте, если dy / dx == a * m cos (mx + t) имеют ноль (и) в интервале, выясните значения y (x) в нуле (ах).
3. Выберите точку, где y(x) имеют максимальное значение

2 голосов
/ 25 декабря 2010

Если у вас больше одного периода, то результат просто +/- a.

Менее чем за один период вы можете оценить y в начальной / конечной точках, а затем найти любые максимумы между началом /конечные точки путем решения для y' = 0, то есть cos(m*x + t) = 0.

0 голосов
/ 26 декабря 2010

Все ответы более или менее одинаковы. Спасибо, ребята =)

Я думаю, я бы пошел с чем-то вроде следующего (обратите внимание, что я переименовываю переменную, которую я назвал "x" в "конец". У меня была эта "x" в начале, которая обозначала конец моего интервала на X-ось):

1) Оцените y по 0 и «end», используйте блок if, чтобы присвоить два значения правильным ПРЕДВАРИТЕЛЬНЫМ «min» и «max» диапазона

2) Оценить количество эволюций: "evolNr" = (m * end) / 2Pi. Если evolNr> 1, вернуть [-a, a]

3) Если evolNr <1: сначала найдите корень производной, который находится по адресу «firstRoot» = (1 / 2m) * Pi - фаза + q * 1 / m * Pi, где q = ceil (m / Pi * ((1 / 2m) * Pi - фаза)) --- это дает мне первый корень в некоторой позиции x> 0. С тех пор я знаю, что все остальные крайности находятся в пределах firstRoot и "end", у нас есть новый корень каждые 1 / м * Пи.

В коде: for (a = firstRoot; a 0 - максимум, обновите «max», в противном случае обновите «min»}

возврат [мин, макс]

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