2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3, 4, 5 ... 7  След.
 
 Рекуррентная формула для синуса
Сообщение13.09.2011, 09:34 
Как-то на одном из форумов (сейчас не помню на каком) просили привести рекуррентную формулу для вычисления синуса. Я не ответил потому, что не был там зарегистрирован, а регистрироваться не захотел. Сейчас решил привести эту формулу здесь.
$\sin0=0$

$\sin\alpha=\sin\alpha$

$\sin2\alpha=K\sin\alpha-0$

$\sin3\alpha=K\sin2\alpha-\sin\alpha$

$\sin4\alpha=K\sin3\alpha-\sin2\alpha$
..............
$\sin{n\alpha}=K\sin(n-1)\alpha-\sin(n-2)\alpha$
где $K=2\cos\alpha$
Начальные значения синуса и косинуса дискреты угла можно подсчитать на калькуляторе.

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

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 11:07 
Попробуйте оценить сложность Вашего алгоритма по сравнению с обычным вычислением угла по модулю $\pi$, а затем вычислением через ряд.

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 12:10 
Этот "алгоритм" не предназначен для однократного вычисления синуса конкретного угла, но он эффективен для последовательных вычислений синуса угла, при непрерывном изменении угла. Например, угол непрерывно изменяется увеличиваясь или уменьшаясь, с датчика угла поступает двоичный код угла с некоторой тактовой частотой, требуется вычислить синус текущего угла, если синусы двух предыдущих углов уже подсчитаны и известны.

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 13:01 
anik в сообщении #482633 писал(а):
при непрерывном изменении угла

точнее при равномерном изменении угла.

-- Вт сен 13, 2011 10:03:14 --

anik в сообщении #482633 писал(а):
требуется вычислить синус текущего угла, если синусы двух предыдущих углов уже подсчитаны и известны.

И еще про косинус угла забыли сказать.

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 13:12 
Sonic86 в сообщении #482641 писал(а):
точнее при равномерном изменении угла.


можно ещё добавить, только при равномерном. С уважением,

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 13:45 
Sonic86 в сообщении #482641 писал(а):
И еще про косинус угла забыли сказать.

Рекуррентную формулу для косинуса угла можно тоже вывести. Или Вы имеете в виду $K=2\cos\alpha$? Я уже говорил, что синус и косинус первой дискреты угла должны быть заранее заданы (от них зависит, на сколько дискрет будет поделён один период), и могут быть подсчитаны на калькуляторе.
hurtsy в сообщении #482642 писал(а):
точнее при равномерном изменении угла.

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

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 14:19 
anik в сообщении #482647 писал(а):
Или Вы имеете в виду $K=2\cos\alpha$?

Угу. Это я просто уточнил.
anik в сообщении #482647 писал(а):
Главное, чтобы за одну дискрету времени, угол не изменился бы более чем на одну дискрету угла.

в переводе на русский язык:
hurtsy в сообщении #482642 писал(а):
можно ещё добавить, только при равномерном. С уважением,


В общем, все понятно.

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:20 
Sonic86 в сообщении #482652 писал(а):
в переводе на русский язык:
hurtsy в сообщении #482642 писал(а):
можно ещё добавить, только при равномерном. С уважением,

Да нет, не "только при равномерном". Угол может измениться на дискрету угла за 6 дискрет времени (отсчётов), за 2 дискреты времени и т.п. Главное, чтобы за дискрету времени угол не изменился бы на две и более дискрет угла. Поэтому частоту (отсчётов) дискретизации по времени можно сделать в несколько раз больше, чем возможная максимальная угловая скорость в дискретах в секунду, тогда не будет пропусков дискрет угла при неравномерном вращении.

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:29 
Аватара пользователя
anik
Я бы еще озаботился вопросом, как там будет обстоять дело с вычислительной погрешностью. Сдается мне, что там она будет на каждом шаге накапливаться линейно. То есть если синус дан нам с погрешностью одна тысячная, то на тысячном шаге погрешность будет примерно единица :D

Надо дома посмотреть более точно, но первое впечатление таково...

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:35 
anik в сообщении #482647 писал(а):
Вообще угол может изменяться нелинейно от времени. Главное, чтобы за одну дискрету времени, угол не изменился бы более чем на одну дискрету угла.

То есть, Вы ограничиваете угловое ускорение. В борьбе с импульсами, придется тратиться на амортизацию(подвеску) :wink: . А если серьёзно, придется исследовать устойчивость Вашей рекурентной схемы, о чем пишет INGELRII. С уважением,

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:48 
INGELRII в сообщении #482675 писал(а):
Я бы еще озаботился вопросом, как там будет обстоять дело с вычислительной погрешностью.

Я заботился этим вопросом. Но в конкретном алгоритме я поступал так: всякий раз когда датчик угла показывал 0 дискрет угла, я обновлял вычисления запуская алгоритм с самого начала.
Кстати, эту формулу можно использовать для генерации гармоник в синтезаторах тембра звука. Там "уход" частоты на один период за тысячу периодов не столь существенен. Еще могу добавить, формула точная, поэтому погрешность частоты будет зависеть только от точности задания начальных значений синуса и косинуса дискреты угла, и от разрядности вычислителя.

-- Вт сен 13, 2011 20:56:48 --

hurtsy в сообщении #482678 писал(а):
То есть, Вы ограничиваете угловое ускорение.

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

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 13:27 
anik в сообщении #482680 писал(а):
Вот угловое ускорение здесь точно ни причём. Я ограничен максимальной угловой скоростью,


Разумеется, я никак не собираюсь ограничивать Ваше творчество.Тем не менее, вторая производная связана с ускорением, и используется для поиска экстремальных точек скорости. Мне кажется, Вы можете вместо рекурентности, использовать идеи из быстрого дискретного преобразования Фурье.Это информация для размышлений, а не директива для исполнения. С уважением,

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 15:18 
Вообще, эта проблема меня сейчас не шибко занимает. Эта формула мне известна уже давно. Просто я решил её обнародовать, может кому пригодится.

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 16:28 
Аватара пользователя
anik в сообщении #482941 писал(а):
Вообще, эта проблема меня сейчас не шибко занимает. Эта формула мне известна уже давно. Просто я решил её обнародовать, может кому пригодится.

А она уже обнародована на этом форуме: в сообщении #424696 (Там ваш $K=2\cos(\alpha)$ при малых шагах дискретизации угла заменён первыми двумя членами ряда). Сравните, если интересно. :mrgreen:

 
 
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 16:57 
Сравнил, стало интересно. Рекурсия действительно на границе устойчивости, если $k$ отличается от $2\cos\alpha$. Если точнее задать два первых значения, то проблем нет при любой степени дискретизации, причем в диапазоне многих периодов. Моя формула точная.

 
 
 [ Сообщений: 95 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group