2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5 ... 7  След.
 
 Рекуррентная формула для синуса
Сообщение13.09.2011, 09:34 
Заблокирован


30/07/09

2208
Как-то на одном из форумов (сейчас не помню на каком) просили привести рекуррентную формулу для вычисления синуса. Я не ответил потому, что не был там зарегистрирован, а регистрироваться не захотел. Сейчас решил привести эту формулу здесь.
$\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 
Заслуженный участник


08/04/08
8435
Попробуйте оценить сложность Вашего алгоритма по сравнению с обычным вычислением угла по модулю $\pi$, а затем вычислением через ряд.

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 12:10 
Заблокирован


30/07/09

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 13:01 
Заслуженный участник


08/04/08
8435
anik в сообщении #482633 писал(а):
при непрерывном изменении угла

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

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

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

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 13:12 


01/07/08
792
Киев
Sonic86 в сообщении #482641 писал(а):
точнее при равномерном изменении угла.


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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 13:45 
Заблокирован


30/07/09

2208
Sonic86 в сообщении #482641 писал(а):
И еще про косинус угла забыли сказать.

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

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 14:19 
Заслуженный участник


08/04/08
8435
anik в сообщении #482647 писал(а):
Или Вы имеете в виду $K=2\cos\alpha$?

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

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


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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:20 
Заблокирован


30/07/09

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

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:29 
Аватара пользователя


11/08/11
997
anik
Я бы еще озаботился вопросом, как там будет обстоять дело с вычислительной погрешностью. Сдается мне, что там она будет на каждом шаге накапливаться линейно. То есть если синус дан нам с погрешностью одна тысячная, то на тысячном шаге погрешность будет примерно единица :D

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:35 


01/07/08
792
Киев
anik в сообщении #482647 писал(а):
Вообще угол может изменяться нелинейно от времени. Главное, чтобы за одну дискрету времени, угол не изменился бы более чем на одну дискрету угла.

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение13.09.2011, 16:48 
Заблокирован


30/07/09

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

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

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

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

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 13:27 


01/07/08
792
Киев
anik в сообщении #482680 писал(а):
Вот угловое ускорение здесь точно ни причём. Я ограничен максимальной угловой скоростью,


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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 15:18 
Заблокирован


30/07/09

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 16:28 
Модератор
Аватара пользователя


16/02/11
3642
Бурашево
anik в сообщении #482941 писал(а):
Вообще, эта проблема меня сейчас не шибко занимает. Эта формула мне известна уже давно. Просто я решил её обнародовать, может кому пригодится.

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

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение14.09.2011, 16:57 
Заблокирован


30/07/09

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 95 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group