Как получить более точную отмену

Aug 21 2020

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

Я решаю пару уравнений, которые не связаны явно , но их соответствующие неизвестные переменные, скажем,$x$ и $y$ должно удовлетворять дифференциальному уравнению:

$\dot x = x + y,$

где точки обозначают производную по независимой переменной, скажем $t$.

Уравнение для $x$ имеет второй порядок, поэтому получается $x$ и $\dot x$отсюда, и можно проверить, последовательно ли выполняется приведенное выше уравнение. Однако (см. Прилагаемый график) оказывается, что независимо от того, какой метод интеграции я использую из SciPy (те, которые уже реализованы), указанное выше равенство перестает выполняться в какой-то момент. Это связано с тем, что$x$ и $y$ компенсируют друг друга с очень высокой точностью, которая, кажется, не достигается ни одним из методов, предоставляемых SciPy (я проверил это, взяв каждый метод и максимально снизив абсолютный и относительный допуск. На прилагаемом графике используется метод DOP853, который, как предполагается, будет очень полезен, когда требуются очень низкие допуски).

Мой вопрос в том, знаете ли вы какой-либо способ повысить точность, чтобы отмена стала более точной (я бы хотел, чтобы уравнение было удобно удовлетворено на всем протяжении всего расчета). Единственные параметры, которые я изменил до сих пор, - это относительные и абсолютные допуски (и, конечно же, различные методы, имеющиеся в нашем распоряжении). Есть ли какой-либо параметр, который мне не хватает и который может быть полезен для этого?

Ответы

5 ChrisRackauckas Aug 21 2020 at 10:51

Я не уверен, что это возможно с библиотеками Python, поскольку они используют Fortran под капотом и это не может быть легко перекомпилировано, но JIT-компиляция Julia DifferentialEquations.jl специализирует решатели на основе числовых типов, которые вы ей даете. Вот демонстрация некоторых странных типов, таких как рациональные числа, MPFR BigFloats и ArbFloats (на основе библиотеки Arb) .

Вы можете увидеть это в действии на графиках сходимости Фигина, которые демонстрируют точность метода 14-го порядка для$10^{-50}$через BigFloats . В Julia с BigFloats или ArbFloats вы можете setprecisionизменить точность числовых типов, чтобы получить нужную вам точность.

Хотя методы Julia очень быстры по сравнению с SciPy (порядка полутора величин) , и даже несмотря на то, что они компилируются для специализации на типах ввода, поэтому для случая высокой точности создается специальный код оптимизации, арифметика высокой точности по-прежнему довольно дорога. и вы должны иметь это в виду. Специализация интегратора для этого диапазона высокой точности будет довольно важной. Обратите внимание, что если вы хотите это сделать, я бы, вероятно, порекомендовал Vern9один из методов многопоточной экстраполяции, например ExtrapolationMidpointDeuflhard(они будут многопоточными между fвызовами, что будет более важно по мере уменьшения толерантности), или, может быть, новый симплектический интегратор 16-го порядкаIRKGL16 .

Кроме того, если вам нужна проверенная арифметика, вы можете использовать TaylorIntegration.jl для методов Тейлора высокого порядка с границами точности с плавающей запятой для решения.