Численное дифференцирование#
Постановка задачи для 1-ой производной#
Пусть таблично задана некоторая функция \(u(x)\):
Как раз в такой форме задана любая функция в компьютере (массив «иксов» и массив «игреков»). Отметим, что разбиение по «иксам» может быть как равномерным, так и неравномерным - всё зависит от конкретной табдично заданной функции.
Хотим вычислить её производную в каждой точке \(x_j\). Вспомним определение из матанализа:
Но ведь на компьютере \(\Delta x\) не может стремится к нулю, т.к. функция по сути дискретная, - придётся считать приближённо, с помощью аппроксимации производной путём использования конечно-разностных схем. Некоторые примеры:
a) \(u_j^{(1)}=\cfrac{u_j-u_{j-1}}{x_j-x_{j-1}}=\cfrac{u_j-u_{j-1}}{h}\)
b) \(u_j^{(1)}=\cfrac{u_{j+1}-u_j}{x_{j+1}-x_j}=\cfrac{u_{j+1}-u_j}{h}\)
c) \(u_j^{(1)}=\cfrac{u_{j+1} - u_{j-1}}{x_{j+1}-x_{j-1}}=\cfrac{u_{j+1}-u_{j-1}}{2 h}\)
Подчеркнём разницу между обозначениями \(u'\) и \(u^{(1)}\). \(u'\) - это истинная (математическая) производная, а \(u^{(1)}\) - это лишь аппроксимация (наше приблежение).
Порядок аппроксимации#
Чем же отличаются данные схемы? Оказывается, точностью. Но сначала вспомним про ряд Тейлора с остаточным членом в форме Лагранжа и Пеано:
Подставляя это разложение в наши примеры, посмотрим на их «точность»:
a) \(u_j^{(1)}=\cfrac{u_j-u_{j-1}}{x_j-x_{j-1}}=\cfrac{u_j-u_{j-1}}{h}\)
\( u_{j-1}=u\left(x_{j-1}\right)=u(x_j - h)=u_j-h u_j^{\prime}+\frac{h^2}{2} u_j^{\prime \prime}-\frac{h^3}{6} u_j^{\prime \prime \prime}+O\left(h^4\right) \)
\(u_j^{(1)}=\cfrac{u_j-u_{j-1}}{h}=\cfrac{u_j-(u_j-h u_j^{\prime}+\frac{h^2}{2} u_j^{\prime \prime}-\frac{h^3}{6} u_j^{\prime \prime \prime}+O\left(h^4\right))}{h} = u_j^{\prime}-\frac{h u_j^{\prime \prime}}{2}+\frac{h^2}{6} u_j^{\prime \prime \prime} +o(h^3) \approx u_j^{\prime}+O(h)\)
Видим, что при \(h \rightarrow 0\) наша аппроксимация стремится к истинной производной. В данном случае эта разностная схема имеет 1-ый порядок аппроксимации, т.к. ошибка пропорциональна первой степени \(h\).
b) \(u_j^{(1)}=\cfrac{u_{j+1}-u_j}{x_{j+1}-x_j}=\cfrac{u_{j+1}-u_j}{h}\)
\( u_{j+1}=u\left(x_{j+1}\right)=u(x_j + h)=u_j+h u_j^{\prime}+\frac{h^2}{2} u_j^{\prime \prime}+\frac{h^3}{6} u_j^{\prime \prime \prime}+O\left(h^4\right) \)
\(u_j^{(1)}=\cfrac{u_{j+1}-u_j}{h}=\cfrac{(u_j+h u_j^{\prime}+\frac{h^2}{2} u_j^{\prime \prime}+\frac{h^3}{6} u_j^{\prime \prime \prime}+O\left(h^4\right)) - u_j}{h} = u_j^{\prime}+\frac{h u_j^{\prime \prime}}{2}+\frac{h^2}{6} u_j^{\prime \prime \prime} +O(h^3) \approx u_j^{\prime}+O(h)\)
Опять получился 1-ый порядок аппроксимации.
c) \(u_j^{(1)}=\cfrac{u_{j+1} - u_{j-1}}{x_{j+1}-x_{j-1}}=\cfrac{u_{j+1}-u_{j-1}}{2 h}\)
\( u_{j+1}=u\left(x_{j+1}\right)=u(x_j + h)=u_j+h u_j^{\prime}+\frac{h^2}{2} u_j^{\prime \prime}+\frac{h^3}{6} u_j^{\prime \prime \prime}+O\left(h^4\right) \)
\( u_{j-1}=u\left(x_{j-1}\right)=u(x_j - h)=u_j-h u_j^{\prime}+\frac{h^2}{2} u_j^{\prime \prime}-\frac{h^3}{6} u_j^{\prime \prime \prime}+O\left(h^4\right) \)
\(u_j^{(1)}=\frac{u_{j+1}-u_{j-1}}{2h}=u_j^{\prime}+\frac{h^2}{6} u_j^{\prime \prime \prime}+o(h^2)=u_j^{\prime}+O(h^2)\)
Получился 2-ой порядок аппроксимации - то есть эта разностная аппроксимация на порядок точнее двух предыдущих. К примеру, без учёта констант перед \(h\), если в a) и b) ошибка была бы \(10^{-3}\), то в с) на том же наборе данных мы бы имели ошибку \(10^{-6}\).
Итого мы поняли, что задачу приближённого нахождения производной (аппроксимации производной) можно решать с помощью конечно-разностных схем. Разные схемы могут иметь разную точность. Обобщим задачу на случай производной произвольной степени.
Постановка задачи для k-ой производной#
Пусть таблично задана некоторая функция \(u(x)\):
Хотим приближенно найти производную \(k\)-го порядка в точке \(x_*\). Будем искать решение в виде конечно-разностной схемы:
Здесь \(\alpha_j\) - некоторые числовые коэффициенты, которые определяют вид конечно-разностной схемы. Как же их найти?
Алгоритм составления разностной схемы
Фиксировать \(l\) и \(m\) исходя из п.3 ниже.
Разложить \(u\left(x_*+\Delta x_j\right)\) в ряд Тейлора в точке \(x_*\). Привести множители перед производными.
Составить систему линейных уравнений на \(\alpha_j\) исходя из
зануления скобок перед производными порядка меньше k
равенства скобки единице перед искомой k-ой производной
занулению скобок перед некоторым количеством производных порядка выше k для увеличения точности.
Решить эту систему аналитически \(\rightarrow\) найти \(\alpha_j\) \(\rightarrow\) схема задана.
Если же в нашей функции нет фиксированного шага по «искам» \(h\), то меняется лишь изначальная формула, откуда \(h\) пропадает из знаменателя, и остаётся только числитель. В остальном алгоритм такой-же. Более подробно см. лекцию С1.
Вообще, все эти задачи для различных \(k, l, m\) давно решены за нас. Достаточно загуглить «конечно-разностные схемы». На википедии есть большой список схем на все случаи жизни.
k-ая производная функции нескольких переменных#
В целом «дух», алгоритм и понятие порядка аппроксимации абсолютно такие же как и в предыдущих пунктах, только теперь необходимо рассматривать различные шаги \(h_1, h_2, ...\) по разным осям. Также в рядах Тейлора появятся перекрестные слагаемые. За более подробным описанием см. лекцию С1.