Когда кто-то хочет вычислить числовые производные, метод, представленный Бенгтом Форнбергом здесь (и сообщенный здесь ), очень удобен (точен и прост в реализации). Как оригинальная статья 1988 года, я хотел бы знать, есть ли лучшая альтернатива сегодня (как (или почти) как простая и более точная)?
finite-difference
precision
Винсент
источник
источник
Ответы:
обзор
Хороший вопрос. Имеется статья Р. Балтенспергера «Повышение точности метода матричного дифференцирования для произвольных точек коллокации». На мой взгляд, это не страшно, но в этом есть смысл (который уже был известен до появления в 2000 году): он подчеркивает важность точного представления того факта, что производная постоянной функцииf(x)=1 должна быть нулевым (это верно в математическом смысле, но не обязательно в числовом представлении).
Легко видеть, что для этого необходимо, чтобы суммы строк n-й производной матрицыD(n) были равны нулю. Оно является общим для обеспечения этого ограничения путем регулировки диагонального элемента, то есть путем установки D(n)jj:=−∑i=1i≠jNDij.(1) Понятно, что эта функция не работает точно при работе на компьютере из-за ошибок округления в вычислениях с плавающей запятой. Что еще более удивительно, эти ошибки становятся еще более серьезными при использовании аналитических формул для производной матрицы (которые доступны для многих классических точек коллокации, например, Гаусса-Лобатто).
Теперь в статье (и ссылках в ней) говорится, что ошибка производной находится в порядке отклонения суммы строк от нуля. Поэтому цель состоит в том, чтобы сделать их как можно меньшими по численности.
Численные тесты
Хорошим моментом является то, что процедура Форнберга, кажется, довольно хороша в этом отношении. На рисунке ниже я сравнил поведение точной, то есть аналитической матрицы первой производной и матрицы, полученной по алгоритму Форнберга, для различного числа коллокационных точек Чебышева-Лобатто.
Опять же, если верить утверждению в цитируемой статье, это означает, что алгоритм Форнберга даст более точные результаты для производной.
Вывод
В заключение, метод Форнберга представляется достаточно точным, в случае даже примерно на 3 порядка более точным, чем результаты аналитических формул. Это должно быть достаточно точным для большинства приложений. Более того, это замечательно, потому что Форнберг, кажется, явно не включает этот факт в свой метод (по крайней мере, нет упоминания в двух работах Форнберга).N=512
Другой порядок величины может быть получен для этого примера посредством прямого включения уравнения (4). Поскольку это довольно простой подход и применяется только один раз для каждой производной, я не вижу причин, чтобы не использовать его.
Метод из статьи Baltensperger, который использует более сложный подход для оценки суммы в уравнении (1) с целью уменьшения ошибок округления, дает примерно одинаковый порядок для ошибки. Так что, по крайней мере для этого примера, он примерно эквивалентен методу «Скорректированный Форнберг», описанному выше.
источник
Предполагая, что вы пытаетесь дифференцировать численную реализацию непрерывной функции, существует большое количество методов:
1) Автоматическая дифференциация. Самый точный и общий метод. Больно кодировать, требуя перегрузки операторов и зависимого от аргумента поиска. Возлагает бремя на пользователя, чтобы понять эти концепции. Также борется со съемными особенностями, такими как дифференцирование sinc при .x=0
2) Чебышевское преобразование. Спроецируйте свою функцию на промежуток полиномов Чебышева и дифференцируйте повторение трех членов. Супер быстрая, очень точная. Но требует, чтобы у вас была компактно поддерживаемая область интересов; вне выбранной области повторение трех членов нестабильно.[a,b]
3) Конечное различие. Недооцененный в 1D; см. Советы и хитрости Ника Хайама в «Численных вычислениях» . Идея состоит в том, что если вы уравновешиваете ошибку усечения и ошибку округления, вам не нужно выбирать размер шага; это может быть выбрано автоматически. В Boost эта идея используется для восстановления (по умолчанию) 6/7 правильных цифр для типа. (Higham только показывает идею для более простого случая 1/2 правильных цифр, но идея легко расширяется.) Коэффициенты взяты из равноотстоящей таблицы Форнберга, но размер шага выбран в предположении, что функция может быть оценена до 1ULP точность. Недостатком является то, что для восстановления половины цифр типа требуется 2 оценки функций, для восстановления 3/4 - 3/4 и т. Д. В 1D неплохая сделка. В более высоких измерениях это катастрофично.
4) Комплексная производная шага. Используйте . Возьмите чтобы быть округлением единицы, и это восстановит почти каждый правильный бит. Тем не менее, это своего рода обман, потому что в целом сложнее реализовать функцию в сложной плоскости, чем передать код ее реальной производной. Все еще классная идея и полезная в определенных обстоятельствах.f′(x)≈I(f(x+ih)) h
источник
Я не знаю никого, кто улучшил алгоритм Форнберга (см. Также его более свежую статью ). Кроме того, мне кажется, что рассматривать его алгоритм как способ вычисления числовых производных не правильно. Все, что он сделал, - это вывел эффективный алгоритм для вычисления весов для методов конечных разностей. Преимущество его метода в том, что он дает вам веса для всех производных вплоть до желаемой производной за один раз.
источник
Более простая схема
В дополнение к моему другому ответу, который больше касается расширения метода Форнберга, я рассмотрю здесь вопрос для более простых альтернатив.
Для этого я набросал альтернативную схему, которая дает производные коэффициенты лагранжевой интерполяции более непосредственно. Его реализация требует всего несколько строк кода, работает для произвольных сеток и, согласно моим первым экспериментам, является такой же точной, как и у Форнберга.
Основой реализации является производная мнимого шага где переменная в порядке машинной точности. Известно, что производная с мнимым шагом стабильно производит значения производной и не страдает от численной нестабильности реализации с конечной разностью с .f′(x) = 1hIm(f(x+ih)), h h→0
Вторым компонентом является интерполяционный полином Лагранжа на сетке оцененный одной из барицентрических форм, например, где Чтобы использовать производную с комплексным шагом, нужно убедиться, что эти формулы также работают для комплексного аргументы . Кроме того, для заданной функции F (X) и вектором коэффициентов , обозначим интерполяционный многочлен через наLi(x) {x1,…,xN} Li(z) = ⎧⎩⎨⎪⎪1 μiz−xk∑kμkz−xkif z=xiotherwise. μi=1∏k≠i(xi−xk) z fi=f(xi) (x1,fi) P(x;f)=∑i=1NfiLi(x).
Алгоритм
Алгоритм набросан в следующем. Он имеет те же входные и выходные параметры, что и в Fornberg, но гораздо проще.
Входные данные:
инициализация
Алгоритм
Пока :o<ord
Вычислить по производной комплексного шага для все и . Здесь обозначает ую строку .D(o+1)ik=CSD(P(xk;D(o)i)) CSD i k
D(o)i i D(o)
Установить o = o + 1;
Решите, что выводить :
Вектор конечно-разностных коэффициентов в точке , где . Это то, что делает Форнберг.d(ord) z di=P(z;D(ord)i)
Интерполяционная функция к производному порядка . Для этого вам нужно ввести функцию соотв. значения функции в алгоритму.p(ord)(x)=∑Ni=1f(xi)P(x;D(ord)i) f(ord)(x) ord fi xi
Мета-функция которая возвращает интерполяционную функцию варианта 2., но для произвольной функции которая должна быть интерполирована в точках сетки.diff(int ord,function g) g
Лично мне больше всего нравится вариант 3.
Анализ алгоритма
Как и у Форнберга, этот алгоритм является . Я опубликую более эмпирические результаты, касающиеся точности, стабильности и т. Д., Если найду время.O(ord⋅N2)
источник
Для повышения точности численного дифференцирования сделайте следующее:
1) Выберите ваш любимый высокоточный «стандартный» метод, основанный на некотором размере шага h .
2) Вычислить значение производной по методу, выбранному в 1) много раз с разными, но разумными размерами шагов h . Каждый раз вы можете выбрать h в качестве случайного числа из интервала (0,5 * H / 10, 1,5 * H / 10), где H - подходящий размер шага для используемого вами метода.
3) Усреднить результаты.
Ваш результат может получить 2-3 порядка абсолютной погрешности по отношению к. не усредненный результат.
https://arxiv.org/abs/1706.10219
источник