Каков наилучший способ вычисления числовой производной в MATLAB?

(Примечание: предполагается, что это сообщество Wiki.)

Предположим, что у меня есть множество точек xi = {x0, x1, x2,... xn} и соответствующих значений функции fi = f (xi) = {f0, f1, f2,..., fn }, где f (x), вообще говоря, является неизвестной функцией. (В некоторых ситуациях мы могли бы знать f (x) раньше времени, но мы хотим сделать это в целом, поскольку мы часто не делаем знать f (x) заранее.) Какой хороший способ аппроксимировать производную f (x) в каждой точке xi? То есть, как я могу оценить значения dfi == d/dx fi == df (xi)/dx в каждой из точек xi?

К сожалению, у MATLAB нет очень хорошей универсальной, цифровой процедуры дифференцирования. Частично это связано с тем, что выбор хорошей рутины может быть затруднен!

Итак, какие существуют методы? Какие существуют процедуры? Как мы можем выбрать хорошую рутину для конкретной проблемы?

При выборе способа дифференциации в MATLAB существует несколько соображений:

  • Есть ли у вас символическая функция или набор точек?
  • Является ли ваша сетка равномерно или неравномерно распределенной?
  • Периодически ли ваш домен? Можете ли вы принять периодические граничные условия?
  • Какой уровень точности вы ищете? Вам нужно вычислить производные в рамках данного допуска?
  • Вам ли важно, чтобы ваша производная была оценена в тех же точках, что и ваша функция?
  • Вам нужно рассчитать несколько порядков производных?

Какой лучший способ для продолжения?

Ответы

Ответ 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 для вычисления различий между соседними элементами массива. Это можно использовать для вычисления приближенных производных по схеме прямого разложения (или прямой конечной разности) первого порядка, но оценки являются оценками низкого порядка. Как описано в документации MATLAB diff (ссылка), если вы введете массив длины 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.

Ответ 2

Я считаю, что к этим конкретным вопросам больше. Поэтому я подробно остановился на этом вопросе:

(4) Q: Какой уровень точности вы ищете? Вам нужно вычислить производные в пределах данного допуска?

A: Точность численного дифференцирования субъективна для применения интереса. Обычно, как это работает, если вы используете ND в прямой задаче, чтобы аппроксимировать производные для оценки функций из представляющего интерес сигнала, тогда вы должны знать о шумовых возмущениях. Обычно такие артефакты содержат высокочастотные компоненты и по определению дифференциатора эффект шума будет усиливаться в порядке величины $i\omega ^ n $. Таким образом, повышение точности дифференциатора (повышение точности полинома) не поможет вообще. В этом случае вы должны иметь возможность отменить эффект шума для дифференциации. Это можно сделать в порядке казни: сначала сгладить сигнал, а затем дифференцировать. Но лучший способ сделать это - использовать "Lowpass Differentiator". Хороший пример библиотеки MATLAB можно найти здесь.

Однако, если это не так, и вы используете ND в обратных задачах, таких как solvign PDE, то глобальная точность дифференциатора очень важна. В зависимости от того, какое подобие условия (BC) соответствует вашей проблеме, дизайн будет соответствующим образом адаптирован. Правило удара - увеличить известную численную точность - полнодиапазонный дифференциатор. Вам нужно создать производную матрицу, которая будет обслуживать подходящий BC. Вы можете найти исчерпывающие решения для таких проектов, используя приведенную выше ссылку.

(5) Имеет ли значение для вас, что ваша производная оценивается в тех же точках, что и ваша функция? A: Да абсолютно. Оценка ND в одних и тех же точках сетки называется "централизованной" и от точек "ступенчатых" схем. Обратите внимание, что при использовании нечетного порядка производных централизованное ND будет отклонять точность частотной характеристики дифференциатора. Поэтому, если вы используете такой дизайн в обратных задачах, это нарушит ваше приближение. Кроме того, обратное относится к случаю четного порядка дифференциации, используемого в шахматном порядке. Вы можете найти исчерпывающее объяснение по этому вопросу, используя ссылку выше.

(6) Вам нужно рассчитать несколько порядков производных? Это полностью зависит от вашего приложения. Вы можете ссылаться на ту же самую ссылку, которую я предоставил, и позаботиться о нескольких конструкциях производных.