2014 dxdy logo

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

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




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


30/07/09

2208
ewert в сообщении #483742 писал(а):
$e^{i(k+1)h}=e^{ikh}e^{ih}=(\cos kh+i\sin kh)(\cos h+i\sin h)$ и т.д.

Это не то что бы проще, но не нужно помнить тригонометрию.
Извините, но я ничего не понял. Наверное, туповат.

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


11/05/08
32166
Д.т.:

$\cos(k+1)h+i\sin(k+1)h=\cos kh\cdot\cos h+i\sin kh\cdot\cos h+i\sin h\cdot\cos kh-\sin kh\cdot\sin h;$

$\begin{cases}\cos(k+1)h=c\cdot\cos kh-s\cdot\sin kh,\\ \sin(k+1)h=s\cdot\cos kh+\cdot\sin kh,\end{cases}$

(где, естественно, $c\equiv\cos h$ и $s\equiv\sin h$ вычисляются раз и навсегда, а дальше уже только арифметика). Только видите ли в чём дело: если речь о спектральном анализе, то программировать в синусах и косинусах просто неудобно -- гораздо естественнее реализовать всё это в комплексной арифметике.

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


11/08/11
1135
profrotter
Уже смотрел. Да, растет не сама погрешность, а множитель.

all
И все равно. Считал по формуле $\sin(\frac{\pi}{2})=1$, количество итераций $10000$, начальная точность $10$ знаков после запятой. На последнем получилось $0,9934535098$, что от единицы далековато. Причем на шаге с номером $9937$ "синус" начал уже убывать, а максимальное значение так и не достигло единицы. Че-то как-то...

Не знаю, может кому и нравятся формулы, которые десять верных знаков превращают в два после ${10}^{4}$ шагов. Но я бы взял в руки лопату и выкопал могилку для формулки. :oops:

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


30/07/09

2208
INGELRII в сообщении #484185 писал(а):
Не знаю, может кому и нравятся формулы, которые десять верных знаков превращают в два после ${10}^{4}$ шагов.
Я думал, что точность выражается не в количестве десятичных знаков после запятой, а в количестве значащих цифр. Может быть я ошибался?
Если за дискрету угла взять секунду, то шесть знаков после запятой для синуса будут нули, а для косинуса - 10 девяток. Какова при этом будет точность?

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


16/02/11
3788
Бурашево
Смотрим на разность.
По всем вычислениям:
Изображение

Последние пара периодов:
Изображение


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

-- Пн сен 19, 2011 17:43:43 --

Кстати, вот и сама программка http://depositfiles.com/files/6zrf4skgd

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


30/07/09

2208
Правильно, я так и поступал. Обновлял вычисления, когда датчик угла обнулялся.

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


16/02/11
3788
Бурашево
INGELRII в сообщении #484185 писал(а):
И все равно. Считал по формуле $\sin(\frac{\pi}{2})=1$, количество итераций $10000$, начальная точность $10$ знаков после запятой. На последнем получилось $0,9934535098$, что от единицы далековато. Причем на шаге с номером $9937$ "синус" начал уже убывать, а максимальное значение так и не достигло единицы. Че-то как-то...
Позвольте, но при угле $\frac {\pi} 2$ параметр $K=2\cos(\frac {\pi} 2)=0$ и рассматриваемая рекуррентная формула принимает вид: $y_n=-y_{n-2}$. Как вы умудрились получить в этом случае погрешность?! :mrgreen:

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


11/08/11
1135
profrotter
Да легко. Как следует из моего сообщения, число $\frac{\pi}{2}$ я разделил на ${10}^{4}$. Получил угол $\frac{\pi}{20000}$ (косинус от него не ноль, а довольно близок к единице), который и подставил в горячо обсуждаемую нами формулу. Сделал по ней ${10}^{4}$ итераций, и на последней получил "синус" от того числа, которое получается умножением $\frac{\pi}{20000}$ на ${10}^{4}$. Ошибка, повторюсь, получается уже в третьем знаке. Буду рад дать еще более подробные пояснения, коли в них возникнет нужда.

Как Вы понимаете, при этом я вообще ни на какие тысячные периоды не выходил. Вообще не сделал ни одного периода. Я путешествовал от нуля до пи-пополам. Синус вычислил от пи-пополам.

Тестовые задачи меня учили выбирать так, чтобы они удовлетворяли простому критерию. Не нужно смотреть, сколько там получается синус после миллиона периодов, ни к чему вся эта мегаломания. Если мы тестируем формулу, то для начала надо взять какой-нибудь примитивный случай. Скажем, все знают, что $\sin(\frac{\pi}{2})=1$. Вот и подберем значение угла и число итераций так, чтобы на финальном шаге получался синус от пи-пополам! Так я и сделал. И только в том случае, если формула показала себя достойно, мы начинаем по ней считать $\sin({10}^{800}\pi)$ ради прикола. А не в обратном порядке.

anik
Я брал первые десять значащих цифр. То есть ненулевых. Согласен насчет косинуса. там получается слишком маловато не-девяток в конце. Хорошо, пересчитаю заново. Возьму точность не десять, а двадцать значащих цифр. Этого будет достаточно?

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


16/02/11
3788
Бурашево
INGELRII, не могли бы вы привести программный код?

-- Вт сен 20, 2011 13:03:37 --

У меня в описанном вами случае получается совсем другое:
Изображение

Всё выглядит так, как будто бы вычислительная процедура вообще теряет устойчивость. Это и не удивительно: ссылку на отдельную тему, где рассматриваются вопросы вычисления синуса я уже в этой теме давал, там же и указал на взможность применения данной формулы для расчётов, проблемах устойчивости при малых шагах дискретизации, написал о ограничениях и достигаемой точности.
Собственно, не понятно почему вы спешите хоронить форумулу, а не хотите задуматься о границах её применения? Почему не учитываете сообщения ewert и Евгения Машерова? Речь идёт о формировании сигналов при цифровой обработке. Там важнее скорость вычислений, а точность порядка $10^{-3}$ является вполне приемлимой (конечно в зависимости от конкретно решаемой задачи) и уж конечно является нелепым синтезировать гармонический сигнал, дискретизируя его с шагом $\frac {\pi} {20000}$. Гармонический сигнал можно восстановить, когда шаг дискретизации не более $\frac {\pi} 2$. На практике шаг дискретизации должен выбираться в несколько (5-10) раз меньше.

-- Вт сен 20, 2011 13:20:57 --

Смотрим расчёт синуса при шаге дискретизации $0,1$ с точностью double:
Изображение

То же с округлением до 4 знаков:
Изображение

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


16/02/11
3788
Бурашево
К сожалению не смог отредактировать - в послдеднем сообщение картинка для точности float.

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


30/07/09

2208
INGELRII в сообщении #484406 писал(а):
Возьму точность не десять, а двадцать значащих цифр. Этого будет достаточно?
Если вы возьмёте двадцать десятичных знаков после запятой, то для косинуса это будет 13 значащих цифр, а для синуса 17 значащих цифр. (Здесь речь идёт о начальных значениях функций дискреты угла). Этого более чем достаточно для большинства практических потребностей.

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


16/02/11
3788
Бурашево
Тема пережила этап своего активного обсуждения и скоро найдёт себе достойное место в архивах форума. Пока этого окончательно не произошло я хотел немного рассказать об одном методе построения рекуррентных формул для различных функций.
Искомую линейную рекуррентную формулу запишем в виде: $$y_n=\sum\limits_{k=0}^{K}a_k x_{n-k}+\sum\limits_{m=1}^{M}b_m y_{n-m}\eqno (1)$$ Построение формулы заключается в подборе таких коэффициентов $\{a_n\}$ и $\{b_m\}$ и такой дискретной последовательности $x_n$, что результат расчёта будет давать отсчёты некоторой заданной функции $y_n=f(nT)$, $T$ - период дискретизации.
В общем случае такая задача может иметь большое количество решений, а само нахождение их плохо поддаётся формализации. Рассмотрим частный случай, когда $$x_n=\delta_n=\begin{cases}1,&n=0\\0,&n\neq 0\end{cases} \eqno (2)$$ Заметим, что в рассматриваемом случае следующие равенства дают начальные условия для искомой рекуррентной формулы: $$y_0=a_0$$ $$y_1=a_1+b_1 y_0$$ $$y_2=a_2+b_1 y_1+b_2 y_0$$ $$y_3=a_3+b_1 y_2+b_2 y_1+b_3 y_0$$ $$\cdots$$ $$y_K=a_K+b_1 y_{K-1}+b_2 y_{K-2}+\cdots +b_K y_0\eqno (3)$$ А вместо (1) можно записать $$y_n=\sum\limits_{m=1}^{M}b_m y_{n-m}, &n>K\eqno(4)$$ Вернёмся к (1) и возмём Z - преобразование от обеих частей равенства и, с учётом свойства временного запаздывания и того, что $x_n\leftrightarrow 1$, получим: $$Y(z)=\frac {\sum\limits_{k=0}^{K}a_k z^{-k}} {1-\sum\limits_{m=1}^{M}b_m z^{-m}}\eqno (5)$$ Теперь пострение рекуррентного соотношения можно предствить в виде следующей последовательности этапов:
1. Осуществляем дискретизацию $f(t)$ и получаем последовательность $y_n=f(nT)$;
2. Находим Z - преобразование полученной последовательности и приводим к виду (5);
3. Находим коэффициенты $\{a_n\}$ и $\{b_m\}$;
4. Подставляем коэффициенты либо в (1) с последовательностью (2), либо в (4) с начальными условиями (3).
Смотрим примеры:
1. Экспоненциальный импульс $f(t)=\sigma(t)e^{-\alpha t}$, дискретизируем $y_n=\sigma(nT)e^{-\alpha nT}$. В таблице Z - преобразований находим $Y(z)=\frac 1 {1-e^{-\alpha T}z^{-1}}$, откуда $a_0=1,b_1=e^{-\alpha T}$. Рекуррентные формулы: $$y_n=\delta_n+e^{-\alpha T} y_{n-1}$$ или $$y_n=e^{-\alpha T} y_{n-1}, &n>0$$ с начальным условием $y_0=1$.
2. Экспоненциальный радиоимпульс $$f(t)=\sigma(t) e^{-\alpha t} \sin(\omega_0 t)$$ $$y_n=\sigma(nT) e^{-\alpha nT} \sin(\omega_0 nT)$$ $$Y(z)=\frac {e^{-\alpha T}\sin(\omega_0 T)z^{-1}} {1-2e^{-\alpha T}\cos(\omega_0 T)z^{-1}+e^{-2\alpha T}z^{-2}}$$ $$a_0=0,a_1=e^{-\alpha T}\sin(\omega_0 T),b_1=2e^{-\alpha T}\cos(\omega_0 T),b_2=-e^{-2\alpha T}$$ Рекуррентные формулы: $$y_n=e^{-\alpha T}\sin(\omega_0 T)\delta_{n-1}+2e^{-\alpha T}\cos(\omega_0 T)y_{n-1}-e^{-2\alpha T}y_{n-2}$$ или $$y_n=2e^{-\alpha T}\cos(\omega_0 T)y_{n-1}-e^{-2\alpha T}y_{n-2},&n>1$$ с начальными условиями $$y_0=0,y_1=e^{-\alpha T}\sin(\omega_0 T)$$ В частном случае при $\alpha=0$ получим формулы для синуса: $$y_n=\sin(\omega_0 T)\delta_{n-1}+2\cos(\omega_0 T)y_{n-1}-y_{n-2}$$ или $$y_n=2\cos(\omega_0 T)y_{n-1}-y_{n-2},&n>1$$ с начальными условиями $$y_0=0,y_1=\sin(\omega_0 T)$$

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


30/07/09

2208
profrotter, ну Вы молодец!
Я эту формулу нашёл выпендриваясь с микрокалькулятором, когда они ещё только начали появляться в СССР, чисто случайно. Вы вывели её из общей теории. Этот метод достоин того,чтобы его изучить.
Ещё раз, большое Вам спасибо!

 Профиль  
                  
 
 Re: Рекуррентная формула для синуса
Сообщение26.09.2011, 16:55 
Заслуженный участник
Аватара пользователя


11/03/08
9970
Москва
Это было бы ещё замечательнее, если бы не было бы в любом учебнике по цифровым фильтрам...

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


16/02/11
3788
Бурашево
anik в сообщении #486526 писал(а):
profrotter, ну Вы молодец!
Я эту формулу нашёл выпендриваясь с микрокалькулятором, когда они ещё только начали появляться в СССР, чисто случайно. Вы вывели её из общей теории. Этот метод достоин того,чтобы его изучить.
Ещё раз, большое Вам спасибо!
Это я чтобы вы больше не доказывали в мучениях новых рекуррентных формул, а при необходимости строили их. :mrgreen:
Евгений Машеров в сообщении #486602 писал(а):
Это было бы ещё замечательнее, если бы не было бы в любом учебнике по цифровым фильтрам...
Совершенно с вами согласен: именно от цифровых фильтров я и отталкивался. По сути это задача синтеза рекурсивного цифрового фильтра по аналоговому фильтру-прототипу методом инвариантной импульсной характеристики. Затем подаём на вход цифрового фильтра единичный отсчёт и получаем что требовалось. Однако, во-первых в теме никто не упомянул о связи рекуррентных формул и теории линейных дискретных систем (я показал автору вывод формулы путём решения уравнения, которое свалилось будто бы с потолка, вы вместе с ewert дали доказательство через комплексные числа - в обоих случаях формализованный путь к получению формул не был указан), во-вторых в учебниках есть материал по разностным уравнениям, Z-преобразованию, цифровым фильтрам, но нигде не формализована последовательность этапов получения именно форумул для расчёта значений функций (если я тут не прав, то прошу подсказать мне учебник, где излагается "рецепт", похожий на мой :mrgreen: ), в-третьих я ориентировался на то, что большинство участников темы (в частности автор, который признался, что не знаком с разностными уравнениями) не знакомы с цифровыми фильтрами, потому пытался изложить материал не прибегая к понятию цифрового фильтра, импульсной характеристики и тп. Собственно, я и не претендовал на какую-либо уникальность и новизну - так и написал, что "хочу рассказать...". :mrgreen:

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

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



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

Сейчас этот форум просматривают: YandexBot [bot]


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

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