Ответ 1
Это лишь некоторые быстрые и грязные предложения. Надеюсь, кто-то найдет их полезными!
1. У вас есть символическая функция или набор точек?
- Если у вас есть символическая функция, вы можете вычислить производную аналитически. (Скорее всего, вы бы сделали это, если бы это было так просто, и вы бы не искали альтернативы.)
- Если у вас есть символическая функция и вы не можете вычислить производную аналитически, вы всегда можете оценить функцию на множестве точек и использовать другой метод, указанный на этой странице, для оценки производной.
- В большинстве случаев у вас есть набор точек (xi, fi) и вам придется использовать один из следующих методов....
2. Ваша сетка равномерно или неравномерно распределена?
- Если ваша сетка равномерно распределена, вы, вероятно, захотите использовать схему с разностными разностями (см. любую из статей Wikipedia здесь или здесь), если вы не используете периодические граничные условия (см. ниже). Здесь - достойное введение в методы конечных разностей в контексте решения обыкновенных дифференциальных уравнений на сетке (см. особенно слайды 9-14). Эти методы обычно эффективны с точки зрения вычислений, просто реализуются, и ошибка метода может быть просто оценена как ошибка усечения разложений Тейлора, используемых для ее получения.
- Если ваша сетка неравномерно распределена, вы все равно можете использовать конечную разностную схему, но выражения сложнее, и точность очень сильно зависит от того, насколько однородна ваша сетка. Если ваша сетка очень неоднородна, вам, вероятно, придется использовать большие размеры шаблонов (более близкие точки) для вычисления производной в данной точке. Люди часто создают интерполяционный многочлен (часто полином Лагранжа) и дифференцируем этот многочлен для вычисления производной. См. Например, this Вопрос StackExchange. Часто бывает сложно оценить ошибку с помощью этих методов (хотя некоторые из них попытались сделать это: здесь и здесь). Метод Fornberg часто очень полезен в этих случаях....
- Следует соблюдать осторожность на границах вашего домена, поскольку трафарет часто включает точки, находящиеся за пределами домена. Некоторые люди вводят "точки призрак" или объединяют граничные условия с производными разных порядков, чтобы устранить эти "точки призраков" и упростить трафарет. Другим подходом является использование правых или левосторонних методов конечных разностей.
- Вот отличный отрыв "чит-листа" методов конечных разностей, включая центрированные, правые и левые схемы низких порядков. Я сохраняю распечатку этого рядом с моей рабочей станцией, потому что считаю ее такой полезной.
3. Периодически ли ваш домен? Можете ли вы принять периодические граничные условия?
- Если ваш домен является периодическим, вы можете вычислить производные с точностью до очень высокого порядка с использованием спектральных методов Фурье. Этот метод приносит в жертву производительность, чтобы получить высокую точность. Фактически, если вы используете N точек, ваша оценка производной приблизительно точна N-го порядка. Для получения дополнительной информации см. (Например) этот WikiBook.
- Методы Фурье часто используют алгоритм быстрого преобразования Фурье (FFT) для достижения примерно O (N log (N)) производительности, а не алгоритма O (N ^ 2), что наивно реализованное дискретное преобразование Фурье (DFT) может использовать.
- Если ваша функция и домен не являются периодическими, вам не следует использовать спектральный метод Фурье. Если вы попытаетесь использовать его с функцией, которая не является периодической, вы получите большие ошибки и нежелательные явления "звонка".
- Вычислительные производные любого порядка требуют 1) преобразования из сетчатого пространства в спектральное пространство (O (N log (N))), 2) умножение коэффициентов Фурье на их спектральные волновые числа (O (N)) и 2) обратное преобразование из спектрального пространства в пространство сетки (снова O (N log (N))).
- Следует проявлять осторожность при умножении коэффициентов Фурье на их спектральные волновые числа. Кажется, что каждая реализация алгоритма БПФ имеет свой собственный порядок спектральных режимов и параметров нормализации. См., Например, ответ на этот вопрос на Math StackExchange, для заметок об этом в MATLAB.
4. Какой уровень точности вы ищете? Вам нужно вычислить производные в пределах данного допуска?
- Для многих целей может быть достаточно разностной схемы 1-го или 2-го порядка. Для более высокой точности вы можете использовать расширения Тейлора более высокого порядка, снижая более высокие порядки.
- Если вам нужно вычислить производные в рамках данного допуска, вы можете посмотреть вокруг схемы высокого порядка, в которой есть необходимая вам ошибка.
- Часто лучший способ уменьшить ошибку - это сокращение межстрочного интервала в схеме с разностной разницей, но это не всегда возможно.
- Имейте в виду, что схемы конечных разностей более высокого порядка почти всегда требуют больших размеров трафаретов (больше соседних точек). Это может вызвать проблемы на границах. (См. Обсуждение выше о точках призраков.)
5. Вам важно, чтобы ваша производная была оценена в тех же точках, что и ваша функция?
- MATLAB предоставляет функцию
diff
для вычисления различий между соседними элементами массива. Это можно использовать для вычисления приближенных производных по схеме прямого разложения (или прямой конечной разности) первого порядка, но оценки являются оценками низкого порядка. Как описано в документации MATLABdiff
(ссылка), если вы введете массив длины N, он вернет массив длины N -1. Когда вы оцениваете производные, используя этот метод в N точках, вы будете иметь оценки производной в N-1 точках. (Обратите внимание, что это можно использовать на неравных сетках, если они отсортированы в порядке возрастания.) - В большинстве случаев мы хотим, чтобы производная была оценена во всех точках, что означает, что мы хотим использовать что-то помимо метода
diff
.
6. Вам нужно рассчитать несколько порядков производных?
- Можно установить систему уравнений, в которой значения функции точки сетки и производные 1-го и 2-го порядка в этих точках зависят друг от друга. Это можно найти, комбинируя разложения Тейлора в соседних точках, как обычно, но сохраняя производные термины, а не отменя их, и связывая их вместе с соседними точками. Эти уравнения могут быть решены с помощью линейной алгебры, чтобы дать не только первую производную, но и вторую (или более высокие порядки, если они установлены правильно). Я считаю, что они называются комбинированными конечно-разностными схемами, и их часто используют в сочетании с компактными конечно-разностными схемами, которые будут обсуждаться далее.
- Компактные конечные разностные схемы (ссылка). В этих схемах создается матрица проектирования и вычисляется производные во всех точках одновременно через матрицу. Они называются "компактными", потому что они обычно предназначены для того, чтобы требовать меньше точек трафарета, чем обычные конечные разностные схемы сопоставимой точности. Поскольку они включают в себя матричное уравнение, связывающее все точки вместе, некоторые компактные разностные схемы называются "спектрально-разрешимыми" (например, Lele 1992 paper - отлично!), что означает, что они имитируют спектральные схемы в зависимости от всех узловых значений и, следовательно, сохраняют точность во всех масштабах длины. Напротив, типичные методы с конечной разницностью являются только локально точными (например, производная в точке 13, как правило, не зависит от значения функции в точке № 200).
- Текущая область исследований - это то, как лучше всего решить несколько производных в компактном трафарете. Результаты таких исследований, комбинированные, компактные конечно-разностные методы, являются мощными и широко применимыми, хотя многие исследователи склонны настраивать их для особых потребностей (производительность, точность, стабильность или конкретную область исследований, таких как динамика жидкости).
Готов к работе
- Как описано выше, можно использовать функцию
diff
(ссылкак документации) для вычисления грубых производных между соседними элементами массива. -
Процедура MATLAB
gradient
(ссылка к документации) - отличный вариант для многих целей. Он реализует центральную разностную схему второго порядка. Он имеет преимущества вычисления производных в разных размерах и поддержки произвольного интервала сетки. (Спасибо @thewaywewalk за то, что он указал на это вопиющее упущение!) -
Я использовал метод Форнберга (см. выше) для разработки небольшой подпрограммы (
nderiv_fornberg
) для вычисления конечных разностей в одном измерении для произвольных интервалов сетки. Я нахожу его простым в использовании. Он использует сторонние трафареты 6 точек на границах и центрированный 5-точечный трафарет в интерьере. Он доступен на MATLAB File Exchange здесь.
Заключение
Поле численного дифференцирования очень разнообразно. Для каждого метода, указанного выше, существует множество вариантов с их собственным набором преимуществ и недостатков. Этот пост вряд ли является полным обращением с численным дифференцированием.
Каждое приложение отличается. Надеюсь, этот пост дает заинтересованному читателю организованный список соображений и ресурсов для выбора метода, который соответствует их собственным потребностям.
Эта вики сообщества может быть улучшена с помощью фрагментов кода и примеров, характерных для MATLAB.