Я вот сейчас ковыряюсь с астрономическими расчётами. Короче, там есть набор параметров для расчёта нутации. Называются "фундаментальные аргументы". Если кому интересно, можно посмотреть теорию в IERS Conventions 2010 года (TN №36), а реализацию в библиотеке SOFA. Так вот, эти фундаментальные аргументы вычисляются в виде разложения в степенные ряды (примерно 5-го порядка). И вот эти степенные ряды суммируются вовсе не по схеме Горнера, как можно было бы предполагать! Они суммируются таким образом, что каждое из слагаемых перед сложением обрезается при помощи fmod() на 2 пи, и после суммирования тоже.
На мой взгляд, самое естественное для расчёта центра масс множества бусинок - не пытаться свести задачу к одномерному случаю, а вычислять в двумерном случае на плоскости. Причём, после того, как координаты центра масс определены, посмотреть на расстояние от центра окружности - если он слишком близко, то даже не пытаться считать угол поворота, а вернуть признак, что толку от этого вращения не будет.
Безусловно, если все честно посчитать (цм в двумерном случае), то все получится. У nabbla1 был вопрос. Мол, нас интересует только приближенный ответ, но мы очень хотим упростить вычисления. Что будет, если считать среднее арифметическое от углов?
А там получается так. Предположим, мы угадали направление на ЦМ. И ведем отсчет углов именно от этого направления. Тогда, чтобы кольцо с бусинками уравновесилась, среднее арифметическое от СИНУСОВ углов должно быть нулевым.
Соответственно, если идти в другую сторону. Удалось выбрать отсчет углов так, что все углы малые => перешли от синусов к самим углам => все гарантированно получилось. А вот если углы большие - как повезет. Может повезти в случае симметрии (случай 2 бусинок, расхождение угла с синусом на одной бусинке может скомпенсировать расхождение угла с синусом на другой бусинке), а может и не повезти.
Мое отношение к заметке nabbla1 1) Упрощенные вычисления имеют право на жизнь. 2) Заменить синусы малых углов на сами углы - стандартная практика. Однако, тогда надо приложить некие усилия, чтобы углы, действительно, были малыми. 3) А вот "выносить мозг" рассуждениями об "аффинности" - это зря.
По последнему примеру: Бусинка с направлением на 5 градусов Бусинка с направлением на 24 градусов Бусинка с направлением на 355 градусов
отвечу здесь.
Я как раз говорю: теперь и такие углы меня вполне устроят, я не буду по чём зря оператора напрягать, чтобы он где нужно ноль выставлял. Находим первую разность: 24-5 = 19, делим на 3, получается 6 1/3. Находим вторую разность, 355-5 = 350, приводим к диапазону -180..+180, получается -10, делим на 3, получается -3 1/3.
Наконец, всё складываем: 5 + 6 1/3 - 3 1/3 = 8 градусов. Всё хорошо!
UPD. Да и в примере 2 всё хорошо. Тут уже вопрос в постановке задачи. Если свести к центру масс, то да, будет некоторая ошибка. Хотя в моей задаче и тут сойдётся без проблем.
Comments 7
Я вот сейчас ковыряюсь с астрономическими расчётами. Короче, там есть набор параметров для расчёта нутации. Называются "фундаментальные аргументы". Если кому интересно, можно посмотреть теорию в IERS Conventions 2010 года (TN №36), а реализацию в библиотеке SOFA. Так вот, эти фундаментальные аргументы вычисляются в виде разложения в степенные ряды (примерно 5-го порядка). И вот эти степенные ряды суммируются вовсе не по схеме Горнера, как можно было бы предполагать! Они суммируются таким образом, что каждое из слагаемых перед сложением обрезается при помощи fmod() на 2 пи, и после суммирования тоже.
На мой взгляд, самое естественное для расчёта центра масс множества бусинок - не пытаться свести задачу к одномерному случаю, а вычислять в двумерном случае на плоскости. Причём, после того, как координаты центра масс определены, посмотреть на расстояние от центра окружности - если он слишком близко, то даже не пытаться считать угол поворота, а вернуть признак, что толку от этого вращения не будет.
Reply
У nabbla1 был вопрос.
Мол, нас интересует только приближенный ответ, но мы очень хотим упростить вычисления. Что будет, если считать среднее арифметическое от углов?
А там получается так. Предположим, мы угадали направление на ЦМ. И ведем отсчет углов именно от этого направления. Тогда, чтобы кольцо с бусинками уравновесилась, среднее арифметическое от СИНУСОВ углов должно быть нулевым.
Соответственно, если идти в другую сторону. Удалось выбрать отсчет углов так, что все углы малые => перешли от синусов к самим углам => все гарантированно получилось. А вот если углы большие - как повезет. Может повезти в случае симметрии (случай 2 бусинок, расхождение угла с синусом на одной бусинке может скомпенсировать расхождение угла с синусом на другой бусинке), а может и не повезти.
Reply
Я читал у него.
Тенденция упрощать, она, конечно, понятна, но, что касается вычислений, зачастую получается, что "простота - хуже воровства".
Reply
1) Упрощенные вычисления имеют право на жизнь.
2) Заменить синусы малых углов на сами углы - стандартная практика. Однако, тогда надо приложить некие усилия, чтобы углы, действительно, были малыми.
3) А вот "выносить мозг" рассуждениями об "аффинности" - это зря.
Reply
Reply
По последнему примеру:
Бусинка с направлением на 5 градусов
Бусинка с направлением на 24 градусов
Бусинка с направлением на 355 градусов
отвечу здесь.
Я как раз говорю: теперь и такие углы меня вполне устроят, я не буду по чём зря оператора напрягать, чтобы он где нужно ноль выставлял. Находим первую разность: 24-5 = 19, делим на 3, получается 6 1/3.
Находим вторую разность, 355-5 = 350, приводим к диапазону -180..+180, получается -10, делим на 3, получается -3 1/3.
Наконец, всё складываем: 5 + 6 1/3 - 3 1/3 = 8 градусов. Всё хорошо!
UPD. Да и в примере 2 всё хорошо. Тут уже вопрос в постановке задачи. Если свести к центру масс, то да, будет некоторая ошибка. Хотя в моей задаче и тут сойдётся без проблем.
Reply
Reply
Leave a comment