Очень интересный вопрос. Проблема, с которой вы столкнулись, может быть связана с проблемами (или ограничениями) арифметики с плавающей запятой c. Поскольку ваша функция содержит коэффициенты в широком числовом интервале, вполне вероятно, что у вас есть некоторая потеря точности в ваших вычислениях. Как правило, эти проблемы могут иметь следующий вид:
- Переполнение
- Незаполнение
- Умножение и деление
- Сложение чисел самой разной величины
- Вычитание чисел одинаковой величины
Переполнение и потеря значимости происходит, когда числа, с которыми вы имеете дело, слишком велики или слишком малы по сравнению с машинной точностью, и я бы поспорил что это не то, что происходит в вашей системе. Тем не менее, необходимо учитывать, что операции умножения и деления могут привести к переполнению и потере значимости. С другой стороны, сложение чисел очень разных величин (или вычитание чисел одинаковых величин) может привести к серьезной потере точности из-за ошибок округления. Исходя из моего опыта решения задач оптимизации, связанных с большими и малыми числами, я бы сказал, что это могло бы быть разумным объяснением поведения вашего интегратора.
У меня есть два предложения для вас. Первый - это, конечно, увеличение точности ваших чисел до максимально возможной. Это может помочь или нет, в зависимости от того, насколько плохо ваша проблема. Второй - использовать лучший алгоритм для вычисления сумм в вашем численном методе. В отличие от наивного сложения всех чисел последовательно, вы можете использовать более продуманную стратегию, разделив суммы на частные суммы, эффективно уменьшив ошибки округления. Яркими примерами этих алгоритмов являются попарное суммирование и суммирование Кахана .
Я надеюсь, что этот ответ предлагает вам некоторые подсказки. Удачи!