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

(Примечание: это вики-сайт сообщества.)

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

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

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

При выборе способа различения в MATLAB следует учитывать несколько факторов:

  1. У вас есть символическая функция или набор точек?
  2. Ваша сетка расположена равномерно или неравномерно?
  3. Ваш домен периодический? Можете ли вы предположить периодические граничные условия?
  4. Какой уровень точности вы ищете? Вам нужно вычислить производные в пределах заданного допуска?
  5. Имеет ли значение для вас, что ваша производная оценивается в тех же точках, что и ваша функция?
  6. Вам нужно рассчитать несколько заказов деривативов?

Как лучше всего продолжить?


person jvriesem    schedule 06.04.2015    source источник
comment
Хорошая работа по созданию этого! Однако я подозреваю, что эта тема может быть слишком широкой для SO Q&A, поскольку лучший способ будет сильно зависеть от ситуации.   -  person knedlsepp    schedule 07.04.2015


Ответы (2)


Это всего лишь несколько быстрых и грязных предложений. Надеюсь, кто-нибудь найдет их полезными!

1. У вас есть символическая функция или набор точек?

  • Если у вас есть символьная функция, вы можете вычислить производную аналитически. (Скорее всего, вы бы сделали это, если бы это было так просто, и вы бы здесь не искали альтернативы.)
  • Если у вас есть символьная функция и вы не можете вычислить производную аналитически, вы всегда можете оценить функцию по набору точек и использовать другой метод, указанный на этой странице, для оценки производной.
  • В большинстве случаев у вас есть набор точек (xi, fi), и вам придется использовать один из следующих методов ...

2. Ваша сетка расположена равномерно или неравномерно?

  • Если ваша сетка расположена равномерно, вы, вероятно, захотите использовать схему конечных разностей (см. Любую из статей Википедии здесь или здесь), если вы не используете периодическую границу условия (см. ниже). Здесь хорошее введение в конечный разностные методы в контексте решения обыкновенных дифференциальных уравнений на сетке (особенно см. слайды 9-14). Эти методы, как правило, эффективны с точки зрения вычислений, просты в реализации, а ошибку метода можно просто оценить как ошибку усечения разложений Тейлора, использованных для ее получения.
  • Если ваша сетка неравномерно разнесена, вы все равно можете использовать схему конечных разностей, но выражения сложнее, а точность очень сильно зависит от того, насколько однородна ваша сетка. Если ваша сетка очень неоднородна, вам, вероятно, потребуется использовать трафареты больших размеров (большее количество соседних точек) для вычисления производной в данной точке. Люди часто строят интерполирующий полином (часто полином Лагранжа) и дифференцируют этот полином для вычисления производной. См., Например, этот вопрос StackExchange. Часто бывает трудно оценить ошибку с помощью этих методов (хотя некоторые пытались это сделать: здесь и здесь). Метод Форнберга часто очень полезен в этих случаях ....
  • Следует проявлять осторожность на границах вашего домена, потому что трафарет часто включает точки, которые находятся за пределами домена. Некоторые люди вводят «точки-призраки» или комбинируют граничные условия с производными разного порядка, чтобы устранить эти «точки-призраки» и упростить трафарет. Другой подход - использовать правосторонние или левосторонние методы конечных разностей.
  • Вот отличная "шпаргалка" конечно-разностные методы, в том числе центрированные, правые и левосторонние схемы низких порядков. Я храню распечатку этого документа рядом с моей рабочей станцией, потому что считаю его очень полезным.

3. Ваш домен периодический? Можете ли вы принять периодические граничные условия?

  • Если ваш домен периодический, вы можете вычислять производные с очень высокой точностью, используя спектральные методы Фурье. Этот метод несколько жертвует производительностью, чтобы получить высокую точность. Фактически, если вы используете N точек, ваша оценка производной будет примерно N ^ -го порядка точности. Для получения дополнительной информации см. (Например) эту WikiBook.
  • В методах Фурье часто используется алгоритм быстрого преобразования Фурье (БПФ) для достижения производительности примерно O (N log (N)), а не алгоритм O (N ^ 2), который может использовать наивно реализованное дискретное преобразование Фурье (ДПФ).
  • Если ваша функция и область не периодичны, вам не следует использовать спектральный метод Фурье. Если вы попытаетесь использовать его с функцией, которая не периодическая, вы получите большие ошибки и нежелательные явления "звонка".
  • Вычисление производных любого порядка требует 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-го порядка в этих точках зависят друг от друга. Это можно найти, комбинируя разложения Тейлора в соседних точках, как обычно, но сохраняя производные члены, а не сокращая их, и связывая их вместе с членами соседних точек. Эти уравнения можно решить с помощью линейной алгебры, чтобы получить не только первую производную, но и вторую (или более высокие порядки, если они настроены правильно). Я считаю, что это называется комбинированными конечно-разностными схемами, и они часто используются вместе с компактными конечно-разностными схемами, которые будут обсуждаться далее.
  • Компактные конечно-разностные схемы (ссылка). В этих схемах создается матрица плана и производные вычисляются во всех точках одновременно с помощью матричного решения. Их называют «компактными», потому что они обычно проектируются так, чтобы требовать меньшего количества точек трафарета, чем обычные конечно-разностные схемы сопоставимой точности. Поскольку они включают матричное уравнение, связывающее все точки вместе, некоторые компактные конечно-разностные схемы имеют «спектральное разрешение» (например, Статья Леле 1992 года - отлично!), что означает, что они имитируют спектральные схемы, зависящие от всех узловых значений и, из-за этого , они сохраняют точность на всех масштабах длины. Напротив, типичные методы конечных разностей точны только локально (производная в точке №13, например, обычно не зависит от значения функции в точке №200).
  • Текущая область исследований - как лучше всего найти несколько производных в компактном трафарете. Результаты таких исследований, комбинированные, компактные методы конечных разностей, являются мощными и широко применимыми, хотя многие исследователи склонны настраивать их для конкретных потребностей (производительность, точность, стабильность или конкретная область исследования, например как гидродинамика).

Готовые программы

  • Как описано выше, можно использовать функцию diff (ссылка к документации) для вычисления грубых производных между соседними элементами массива.
  • Подпрограмма MATLAB gradient (ссылка на документацию) - отличный вариант для многих целей. . Он реализует центральную разностную схему второго порядка. Он имеет преимущества вычисления производных в нескольких измерениях и поддержки произвольного шага сетки. (Спасибо @thewaywewalk за указание на это вопиющее упущение!)

  • Я использовал метод Форнберга (см. Выше), чтобы разработать небольшую процедуру (nderiv_fornberg) для вычисления конечных разностей в одном измерении для произвольных интервалов сетки. Мне легко пользоваться. Он использует двусторонние трафареты с 6 точками по границам и центрированный 5-точечный трафарет в интерьере. Он доступен в разделе обмена файлами MATLAB здесь.

Заключение

Область численного дифференцирования очень разнообразна. Для каждого из перечисленных выше методов существует множество вариантов со своими достоинствами и недостатками. Этот пост вряд ли является полным описанием числового дифференцирования.

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

Эту вики-страницу сообщества можно улучшить с помощью фрагментов кода и примеров, характерных для MATLAB.

person Community    schedule 06.04.2015
comment
Очень всеобъемлющий. +1. - person rayryeng; 06.04.2015
comment
Функция gradient отсутствует, на мой взгляд, один из лучших вариантов. - person thewaywewalk; 06.04.2015
comment
Я думаю, следует упомянуть об автоматическом различении (en.wikipedia.org/wiki/Automatic_differentiation ), поскольку он часто более точный и быстрый, чем другие методы. В Matlab нет способа сделать это, но в Интернете доступно множество решений для автоматического дифференцирования как в прямом, так и в обратном режиме. - person yhenon; 07.04.2015
comment
Спасибо, @ y300. Я слышал об AD, но никогда не исследовал его. Это определенно выглядит интересно и, вероятно, будет полезно некоторым читателям. Можете ли вы добавить это в вышеуказанный пост? - person jvriesem; 07.04.2015
comment
Привет, я тоже был бы счастлив, дайте мне день или около того, чтобы написать что-нибудь, это отличная техника, но не всегда простая для понимания людьми. - person yhenon; 07.04.2015
comment
Бонусные баллы, если вы можете предложить (или связать) определенные функции MATLAB, которые выполняют AD! :-) - person jvriesem; 07.04.2015
comment
На самом деле мне бы хотелось разделить этот ответ на два раздела (и соответственно обновить вопрос). В первом разделе описываются различные семейства методов с соответствующими преимуществами / недостатками. Второй раздел проведет пользователя через различные соображения, которые они могут пожелать иметь в виду, и укажет на методы, которые подходят для различных ситуаций. Мой ответ в настоящее время структурирован больше как второй раздел, но с фрагментами первого раздела, добавленными здесь и там. - person jvriesem; 07.04.2015
comment
Хм. Я не понимаю, что вы имеете в виду под использованием FDM для вычисления числовой производной. На мой взгляд, вам нужны числовые производные для FDM !? - person knedlsepp; 07.04.2015
comment
@knedlsepp: (Под FDM я понимаю, что вы имеете в виду методы конечных разностей.) Я представляю ситуацию, в которой есть одномерная сетка значений, определенная на сетке в этом измерении, и он хочет вычислить численно производная функции, которая произвела эти данные. В большинстве случаев у человека есть данные, но он не знает формы функции, но хочет получить производную от этой функции. По моему опыту, FDM обычно используются для оценки производной неизвестной функции на основе набора входных данных (fi, xi), где fi: = f (xi). Если это не отвечает на ваш вопрос, я не понимаю, что вы имеете в виду. - person jvriesem; 07.04.2015
comment
Да, это то, что я имел в виду, но я до сих пор не понимаю, как вы могли бы использовать это для вычисления производной. Если все, что у вас есть, это точки данных с соответствующими значениями функций, дифференцировать невозможно. Вы можете только угадать интерполирующую функцию с помощью какого-либо метода (например, локально с помощью полиномов или глобально с помощью спектрального метода или чего-то еще), а затем выполнить числовую производную для предполагаемой функции, но это означает, что нет правильной производной больше. Для меня концепция числовой производной требует, по крайней мере, функции, которую можно вычислить. - person knedlsepp; 07.04.2015
comment
Думаю, я понимаю, о чем вы говорите. Вы проводите различие между тем, что можно назвать аналитическими производными, оцениваемыми на заданной сетке (что вы считаете численным дифференцированием и которое требует знания дифференцируемой функции), и тем, что я бы назвал численной оценкой производных. (что не потребует точного знания производящей функции, а только значений функции в определенных точках). Это верно? - person jvriesem; 07.04.2015
comment
да. Я бы не стал рассматривать реконструкцию функции по точкам данных как часть числового дифференцирования . Поэтому для меня странно, что вы перечисляете FDM как метод получения численных производных, так как они методы, которые решают дифференциальные уравнения и должны использовать использование (очень конкретных) числовых производных. (Может быть, вы действительно хотели указать ссылку на this, и вот откуда у меня замешательство ...) - person knedlsepp; 07.04.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person jvriesem; 07.04.2015
comment
Первая ссылка на набор слайдов по методу конечных разностей неуместна, поскольку мы вообще не говорим о 2D-шаблонах для ODE. Тем не менее, ссылка на шпаргалку FDM полезна, потому что она включает в себя 1D-трафареты, о которых здесь идет речь. - person Evgeni Sergeev; 17.06.2015
comment
О восстановлении функции по точкам данных. Да, в такой схеме это происходит неявно. Неявное предположение состоит в том, что мы работаем с уникальной реконструкцией самой низкой частоты, то есть что все частотные компоненты выше частоты Найквиста равны нулю. (Это особенно хорошо относится к периодическим функциям, но может быть расширено и на непериодический случай в том же духе.) Можно взглянуть на эту интерполяцию, например, применение ДПФ для получения спектра, затем заполнение нулями (некоторые из них кратные N), а затем обратное ДПФ. - person Evgeni Sergeev; 17.06.2015
comment
@EvgeniSergeev: Я не уверен, какую ссылку вы считаете неуместной. (Это это? Если так, то здесь обсуждаются 1D-трафареты, а не 2D. То же самое и для некоторых других ссылок, которые я только что проверял.) Сообщите мне, и я буду рад изменить ссылку, если это не актуально. - person jvriesem; 23.06.2015
comment
@jvriesem Да, именно этот. Единственные подходящие слайды - с 12 по 14, все остальное посвящено другой теме. Что еще более важно, эта ссылка не охватывает использование более крупных 1D-трафаретов для получения более высокого порядка точности. - person Evgeni Sergeev; 25.06.2015
comment
@EvgeniSergeev: Я понимаю, что вы имеете в виду, говоря о 2D-трафаретах. Вы правы, что слайды 12–14 являются наиболее подходящими для этого вопроса SX, но я ожидаю, что другие материалы по-прежнему будут полезны для тех, кто, возможно, хочет решить зависящие от времени дифференциальные уравнения. Я отредактирую свой пост, чтобы уточнить. - person jvriesem; 26.06.2015

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

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

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

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

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

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

person Mahdi S. Hosseini    schedule 05.09.2017