Числовая производная и конечно-разностные коэффициенты: какое-либо обновление метода Форнберга?


11

Когда кто-то хочет вычислить числовые производные, метод, представленный Бенгтом Форнбергом здесь (и сообщенный здесь ), очень удобен (точен и прост в реализации). Как оригинальная статья 1988 года, я хотел бы знать, есть ли лучшая альтернатива сегодня (как (или почти) как простая и более точная)?


1
Трудно сказать, не зная, что вы хотите дифференцировать. Рассматривали ли вы автоматическое дифференцирование ?
Бисваджит Банерджи

@BiswajitBanerjee: для конечно-разностных коэффициентов автоматическое дифференцирование не применяется.
Джефф Оксберри

@ GeoffOxberry: я имел в виду реальную физическую проблему, то есть научную часть "вычислительной науки".
Бисваджит Банерджи

@Vincent: Вы пытаетесь дифференцировать функцию или таблицу? Если данные таблицы, шумят ли данные таблицы? Вы пытаетесь дискретизировать PDE?
user14717

Ответы:


9

обзор

Хороший вопрос. Имеется статья Р. Балтенспергера «Повышение точности метода матричного дифференцирования для произвольных точек коллокации». На мой взгляд, это не страшно, но в этом есть смысл (который уже был известен до появления в 2000 году): он подчеркивает важность точного представления того факта, что производная постоянной функции f(x)=1 должна быть нулевым (это верно в математическом смысле, но не обязательно в числовом представлении).

Легко видеть, что для этого необходимо, чтобы суммы строк n-й производной матрицы D(n) были равны нулю. Оно является общим для обеспечения этого ограничения путем регулировки диагонального элемента, то есть путем установки

(1)Djj(n):=i=1ijNDij.
Понятно, что эта функция не работает точно при работе на компьютере из-за ошибок округления в вычислениях с плавающей запятой. Что еще более удивительно, эти ошибки становятся еще более серьезными при использовании аналитических формул для производной матрицы (которые доступны для многих классических точек коллокации, например, Гаусса-Лобатто).

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

Численные тесты

Хорошим моментом является то, что процедура Форнберга, кажется, довольно хороша в этом отношении. На рисунке ниже я сравнил поведение точной, то есть аналитической матрицы первой производной и матрицы, полученной по алгоритму Форнберга, для различного числа коллокационных точек Чебышева-Лобатто.

Опять же, если верить утверждению в цитируемой статье, это означает, что алгоритм Форнберга даст более точные результаты для производной.

(2)f(x)=11+x2.
(3)En=maxi{0,,n}|f(xi)j=1nDijf(xj)|.
(4)D~jj=Djj(i=1nDji),for all j.

Вывод

В заключение, метод Форнберга представляется достаточно точным, в случае даже примерно на 3 порядка более точным, чем результаты аналитических формул. Это должно быть достаточно точным для большинства приложений. Более того, это замечательно, потому что Форнберг, кажется, явно не включает этот факт в свой метод (по крайней мере, нет упоминания в двух работах Форнберга).N=512

Другой порядок величины может быть получен для этого примера посредством прямого включения уравнения (4). Поскольку это довольно простой подход и применяется только один раз для каждой производной, я не вижу причин, чтобы не использовать его.

Метод из статьи Baltensperger, который использует более сложный подход для оценки суммы в уравнении (1) с целью уменьшения ошибок округления, дает примерно одинаковый порядок для ошибки. Так что, по крайней мере для этого примера, он примерно эквивалентен методу «Скорректированный Форнберг», описанному выше.


4

Предполагая, что вы пытаетесь дифференцировать численную реализацию непрерывной функции, существует большое количество методов:

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)(f(x+ih))h


1

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


Я бы не согласился с утверждением «смотреть на его алгоритм как на способ вычисления числовых производных не правильно». Как только вы оценили веса для точки , вы можете напрямую вычислить числовую производную любой функции через . wizf(x)f(z)=iwif(xi)
Давидхай

@davidhigh: Если вы читаете статьи Форнберга, они говорят о вычислении весов для конечно-разностных приближений, а не о вычислении самих приближений. Конечно, вы можете использовать алгоритм для вычисления производных, но имеет смысл вычислить весовые коэффициенты, сохранить их, а затем использовать их многократно для вычисления приближенных производных. В противном случае вы вычисляете веса повторно, когда в этом нет необходимости.
Брайан Затапатик

1

Более простая схема

В дополнение к моему другому ответу, который больше касается расширения метода Форнберга, я рассмотрю здесь вопрос для более простых альтернатив.

Для этого я набросал альтернативную схему, которая дает производные коэффициенты лагранжевой интерполяции более непосредственно. Его реализация требует всего несколько строк кода, работает для произвольных сеток и, согласно моим первым экспериментам, является такой же точной, как и у Форнберга.

Основой реализации является производная мнимого шага где переменная в порядке машинной точности. Известно, что производная с мнимым шагом стабильно производит значения производной и не страдает от численной нестабильности реализации с конечной разностью с .

f(x) = 1hIm(f(x+ih)),
hh0

Вторым компонентом является интерполяционный полином Лагранжа на сетке оцененный одной из барицентрических форм, например, где Чтобы использовать производную с комплексным шагом, нужно убедиться, что эти формулы также работают для комплексного аргументы . Кроме того, для заданной функции F (X) и вектором коэффициентов , обозначим интерполяционный многочлен через на Li(x){x1,,xN}

Li(z) = {1if z=xi μizxkkμkzxkotherwise.
μi=1ki(xixk)zfi=f(xi)(x1,fi)
P(x;f)=i=1NfiLi(x).


Алгоритм

Алгоритм набросан в следующем. Он имеет те же входные и выходные параметры, что и в Fornberg, но гораздо проще.

Входные данные:

  • x : сетка с N различными точками сетки
  • ord : производный порядок
  • z: точка, в которой производная должна быть оценена
  • Возможно: функция или ее функциональные значения в точках сетки (требуется только для выходного варианта 2.)f(x)fi

инициализация

  • Инициализируйте полиномы Лагранжа помощью барицентрической интерполяции.L
  • Инициализировать массив из -матриц , дляN×ND(o)o=0,,ord
  • Установите , то есть единичная матрица измеренияD(0):=INN×N
  • Установитеo:=0

Алгоритм

Пока :o<ord

  • Вычислить по производной комплексного шага для все и . Здесь обозначает ую строку .Dik(o+1)=CSD(P(xk;Di(o)))CSDik
    Di(o)iD(o)

  • Установить o = o + 1;

Решите, что выводить :

  1. Вектор конечно-разностных коэффициентов в точке , где . Это то, что делает Форнберг.d(ord)zdi=P(z;Di(ord))

  2. Интерполяционная функция к производному порядка . Для этого вам нужно ввести функцию соотв. значения функции в алгоритму.p(ord)(x)=i=1Nf(xi)P(x;Di(ord))f(ord)(x)ordfixi

  3. Мета-функция которая возвращает интерполяционную функцию варианта 2., но для произвольной функции которая должна быть интерполирована в точках сетки.diff(int ord,function g)g

Лично мне больше всего нравится вариант 3.


Анализ алгоритма

Как и у Форнберга, этот алгоритм является . Я опубликую более эмпирические результаты, касающиеся точности, стабильности и т. Д., Если найду время.O(ordN2)


0

Для повышения точности численного дифференцирования сделайте следующее:

1) Выберите ваш любимый высокоточный «стандартный» метод, основанный на некотором размере шага h .

2) Вычислить значение производной по методу, выбранному в 1) много раз с разными, но разумными размерами шагов h . Каждый раз вы можете выбрать h в качестве случайного числа из интервала (0,5 * H / 10, 1,5 * H / 10), где H - подходящий размер шага для используемого вами метода.

3) Усреднить результаты.

Ваш результат может получить 2-3 порядка абсолютной погрешности по отношению к. не усредненный результат.

https://arxiv.org/abs/1706.10219


3
Добро пожаловать в SciComp.SE! Этот ответ будет еще лучше, если вы кратко изложите метод.
Кристиан

2
Также ваше имя пользователя предполагает, что вы написали эту статью. Пожалуйста, ознакомьтесь с нашими правилами саморекламы и соответствующим образом отредактируйте свой пост.
Wrzlprmft

Я искренне считаю, что отрицательное голосование несправедливо, если мой ответ действительно указывает на правильный ответ.
Ф. Джатпил

1
Я тоже ... так что возьми мой +1 ... :-)
Дэвид Хай
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.