2014 dxdy logo

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

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




 
 Вычисление синуса
Сообщение17.12.2009, 23:56 
Нужно вычислить sin(x) достаточно точно. x - может быть любым. Как я понимаю для этого нужно разложить его в ряд. Возникает вопрос в какой ряд и в окрестности какой точки его надо разложить, чтобы можно было с заданной точностью вычислить sin от любого аргумента? Или я ошибаюсь и нужен другой способ?

 
 
 
 Re: Вычисление синуса
Сообщение18.12.2009, 00:04 
Аватара пользователя
Синус обычно вычисляется путём нажатия на кнопку "синус".
А человечки, которые сидят в калькуляторе позади этой кнопки, используют CORDIC (см. http://en.wikipedia.org/wiki/CORDIC)

 
 
 
 Re: Вычисление синуса
Сообщение18.12.2009, 01:29 
Если нужен результат, то математические пакеты считают его с любой точностью, хоть десять тысяч знаков.

А если нужно имеено программу написать, не слишком сложную, то в компиляторах еще используется такой метод. Для вычисления тригонометрических функций достаточно вычислить синус на отрезке $[0,\pi/4]$. Остальное по формулам тригонометрии, только надо еще уметь вычислять корень, что можно делать с помощью метода Ньютона. На $[0,\pi/4]$ для вычисления с точностью типа $10^{-15}$ оказывается достаточно многочлена наилучшего приближения 12 степени. А для многочленов есть схема Горнера, так что получается достаточно быстро - тактов за 300. Вместо наилучшего приближения можно использовать многочлен Тейлора в нуле - легко прикинуть, сколько членов нужно взять для нужной точности.

 
 
 
 Re: Вычисление синуса
Сообщение18.12.2009, 10:55 
Gafield в сообщении #272620 писал(а):
Для вычисления тригонометрических функций достаточно вычислить синус на отрезке $[0,\pi/4]$. Остальное по формулам тригонометрии, только надо еще уметь вычислять корень, что можно делать с помощью метода Ньютона.

Не очень понятно, зачем Ньютона -- проще засадить ещё один такой же многочлен.

Gafield в сообщении #272620 писал(а):
А для многочленов есть схема Горнера,

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

 
 
 
 Re: Вычисление синуса
Сообщение18.12.2009, 16:11 
ewert в сообщении #272680 писал(а):
Не очень понятно, зачем Ньютона -- проще засадить ещё один такой же многочлен.

Если точность требуется та же, то да. Кто его знает, что значит "достаточно точно" в постановке задачи :) А метод Ньютона сверхсходящийся.
Цитата:
Вряд ли есть -- погрешности будут накапливаться. Надо использовать разложение того многочлена по чебышёвским.

Насколько я помню, реализовывалось все как раз просто умножением. И как считать чебышевские? К тому же непонятно, сколько накопится погрешности за 12 умножений иксов из $[0,\pi/4]$ на небольшие коэффициенты. Мне не кажется, что много. И вопрос этот проверяется непостредственно, если есть значения синуса с достаточно большим количеством верных знаков. Вполне возможно, что те, кто пишут компиляторы, считают погрешность эмпирически: взяли многочлен 11й степени - не хватает, взяли 12й...

 
 
 
 Re: Вычисление синуса
Сообщение18.12.2009, 16:45 
Gafield в сообщении #272759 писал(а):
И как считать чебышевские?

Рекуррентно. Это почти так же эффективно (по скорости), как и Горнер. Но -- существенно точнее.

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

 
 
 
 Re: Вычисление синуса
Сообщение18.12.2009, 22:36 
Можно по-порядку и по-подробнее. Во-первых почему до pi/4? не очень понятно, во-вторых откуда корень и что за многочлены?

 
 
 
 Re: Вычисление синуса
Сообщение19.12.2009, 16:04 
Потому что при $x\in[\pi/4,\pi/2]$ $\sin x=\cos(\pi/2-x)=\sqrt{1-\sin^2(\pi/2-x)}$. Зная четвертинку синусоиды, можно нарисовать ее всю :)
Какие многочлены? И какая вообще постанока задачи?

 
 
 
 Re: Вычисление синуса
Сообщение19.12.2009, 18:13 
Аватара пользователя
Gafield в сообщении #272620 писал(а):
Для вычисления тригонометрических функций достаточно вычислить синус на отрезке $[0,\pi/4]$.

Только ещё $\pi$ нужно уметь с большой точностью считать.

 
 
 
 Re: Вычисление синуса
Сообщение19.12.2009, 18:57 
Профессор Снэйп в сообщении #273042 писал(а):
Только ещё $\pi$ нужно уметь с большой точностью считать.

не нужно -- она константа, и в программу с необходимой (и достаточной) точностью она уже зашита

 
 
 [ Сообщений: 10 ] 


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