Вычисление производных (численное дифференцирование)
При вычислении производной функции, будем иметь в виду, что один из способов найти производную - это взять достаточно малые значения справа и слева на равном расстоянии от - точке, в которой мы хотим найти производную.
Таким образом, вычисляется производная в середине промежутка. По значениям f' можно таким же способом найти производную от f', т.е. f''. Можно выразить f'' непосредственно через f(x):
Для производной третьего порядка можно использовать следующую формулу: Возникают естественные вопросы, откуда происходят эти формулы и как оценивать точность вычисления производных по этим формулам?
Формулы являются результатом дифференцирования интерполяционных многочленов Ньютона и других. Сущность которых состоит в том, что заданная функция f(x) представляется в виде многочлена, который значительно проще дифференцировать, чем какие-либо другие функции, особенно трансцендентные или представляющие собой сложные выражения.
Оценка погрешности и точности вычисления не менее серьезный и сложный процесс, чем само приближенное вычисление. Так для оценки погрешности дифференцирования могут быть применены следующие формулы: где предполагается, что функция f(x) дифференцируемая n + 1 раз, а точка - некоторое промежуточное значение между x0 - точкой, в которой находится производная и точками (x0 - 2dx), (x0 - dx), (x0 + dx), (x0 + 2dx),... из заданного промежутка [a, b]. (2)
На практике f (n+1)(c) оценивать непросто, поэтому при малых dx приближенно полагают: и тогда получается следующая формула (3)
Мы будем пользоваться формулой (2), а впоследствии и формулой (3), в зависимости от конкретной задачи и тех сложностей, которые могут возникнуть при составлении программ. Используя эти формулы, составим функцию для вычисления первой производной. Точность вычисления eps задается пользователем, а первоначальная величина промежутка dx устанавливается 1, а затем, для уточнения вычисления - делится на 2. Впрочем, читатель может предложить другие способы изменения промежутка dx, когда значительно быстрее достигается вычисление производной с заданной степенью точности.
{ Вычисление 1-й производной и опред. точности ее вычислен.} { derivative - производная } Function derivat1(x0, eps : real) : real; var dx, dy, dy2 : real; begin dx := 1; repeat dx := dx/2; dy := fx(x0 + dx/2) - fx(x0 - dx/2); dy2 := fx(5*x0/4 + dx) - 2*fx(5*x0/4); dy2 := dy2 + fx(5*x0/4 - dx) until abs(dy2/(2*dx)) < eps; derivat1 := dy/dx end;
Здесь, для определения точности вычисления, используется вторая производная в точке dy2 := fx(5*x0/4 + dx) - 2*fx(5*x0/4) + fx(5*x0/4 - dx); Запись ее вычисления выполнена в две строки только из-за лучшей наглядности написания программы. Возможен и другой вариант написания функции с использованием формулы (3) для оценки точности вычисления.
Тогда функция запишется так: { Вычисление 1-й производной и опред. точности ее вычислен.} { derivative - производная } Function derivat1(x0, eps : real) : real; var dx, dy, dy2 : real; begin dx := 1; repeat dx := dx/2; dy := fx(x0 + dx/2) - fx(x0 - dx/2); dy2 := fx(5*x0/4 + dx) - 2*fx(5*x0/4); dy2 := dy2 + fx(5*x0/4 - dx) until abs((dy2*dy2*fx(x0))/(2*dx)) < eps; derivat1 := dy/dx end;