Неожиданно низкая ошибка для числового интегратора с некоторыми уравнениями движения - PullRequest
2 голосов
/ 26 мая 2020

У меня есть интегратор RKF7 (8), выходные данные которого я проверил с помощью нескольких простых тестовых функций. Однако, когда я использую его для интересующего меня уравнения движения, локальные ошибки усечения внезапно становятся очень маленькими. Для временного шага около 1e-1 все мои ошибки составляют около 1e-18 или 1e-19. Для простых тестовых функций (пока синус и экспонента) ошибки всегда разумны, ie 1e-7 или около того для одного и того же временного шага.

Единственная разница между простыми тестовыми функциями и проблема в том, что это огромный кусок кода, например, может быть, 1000 различных терминов, некоторые с относительно большими показателями (например, 9 или 10). Может ли это повлиять на точность? Следует ли мне изменить свой код, чтобы использовать long double s?

1 Ответ

0 голосов
/ 05 июня 2020

Очень интересный вопрос. Проблема, с которой вы столкнулись, может быть связана с проблемами (или ограничениями) арифметики с плавающей запятой c. Поскольку ваша функция содержит коэффициенты в широком числовом интервале, вполне вероятно, что у вас есть некоторая потеря точности в ваших вычислениях. Как правило, эти проблемы могут иметь следующий вид:

  • Переполнение
  • Незаполнение
  • Умножение и деление
  • Сложение чисел самой разной величины
  • Вычитание чисел одинаковой величины

Переполнение и потеря значимости происходит, когда числа, с которыми вы имеете дело, слишком велики или слишком малы по сравнению с машинной точностью, и я бы поспорил что это не то, что происходит в вашей системе. Тем не менее, необходимо учитывать, что операции умножения и деления могут привести к переполнению и потере значимости. С другой стороны, сложение чисел очень разных величин (или вычитание чисел одинаковых величин) может привести к серьезной потере точности из-за ошибок округления. Исходя из моего опыта решения задач оптимизации, связанных с большими и малыми числами, я бы сказал, что это могло бы быть разумным объяснением поведения вашего интегратора.

У меня есть два предложения для вас. Первый - это, конечно, увеличение точности ваших чисел до максимально возможной. Это может помочь или нет, в зависимости от того, насколько плохо ваша проблема. Второй - использовать лучший алгоритм для вычисления сумм в вашем численном методе. В отличие от наивного сложения всех чисел последовательно, вы можете использовать более продуманную стратегию, разделив суммы на частные суммы, эффективно уменьшив ошибки округления. Яркими примерами этих алгоритмов являются попарное суммирование и суммирование Кахана .

Я надеюсь, что этот ответ предлагает вам некоторые подсказки. Удачи!

...