3.2.2. Об алгоритме дифференцирования



Для численного дифференцирования Mathcad применяет довольно сложный алгоритм, вычисляющий производную с колоссальной точностью до 7— 8-го знака после запятой. Погрешность дифференцирования не зависит от констант TOL или CTOL, в противоположность большинству остальных численных методов, а определяется непосредственно алгоритмом. Этот алгоритм (метод Риддера) описан во встроенной справочной системе Mathcad, доступной через меню Help (Справка). Мы не будем здесь его описывать, однако остановимся на важных аспектах численного определения производной функции f (х) на более простом примере. Несмотря на то, что простейшая разностная формула сильно отличается от метода Риддера, он все-таки поможет нам разобраться в некоторых вопросах, т. к. основан на базовом принципе численного дифференцирования, а именно на вычислении производной через значения функции f (х) в нескольких точках, расположенных на близком расстоянии друг от друга.

Исходя из определения производной функции, можно констатировать, что

Основная проблема численного определения производной (как в этой простейшей формуле, так и в более сложных алгоритмах, в том числе Риддера) связана как раз с процедурой выбора значения Д, которая является далеко не очевидной. На первый взгляд может показаться, что следует выбирать очень малые Д, чтобы соблюсти желаемую точность, однако это не совсем так. Чтобы лучше разобраться в сути проблемы, используем Mathcad-программу, приведенную в листинге 3.6, которая рассчитывает (в зависимости от шага Д) погрешность разностной формулы (3.1). График полученной зависимости изображен на рис. 3.5, причем для его обеих осей выбран логарифмический масштаб, а сама производная (ради примера), согласно листингу 3.6, считается в одной точке х=1.

Листинг 3.6. Расчет зависимости точности разностной формулы от шага
 



Рис. 3.5. График точности формулы (3.1) в зависимости от шага дельта (продолжение листинга 3.6)


Если увеличение ошибки на правом конце графика является совершенно очевидным, поскольку, согласно формуле (3.1), чем больше А, тем больше погрешность, то рост ошибки при очень малых Д может, на первый взгляд, показаться неожиданным. Однако все дело в том, что, применяя разностную формулу, мы неявно полагали, что умеем точно вычислять значения функции f (х) в любой точке. Между тем, любые компьютерные вычисления сопряжены с неустранимыми погрешностями, в частности, обусловленными дискретным представлением чисел. Поэтому в реальности мы можем вычислить значение f (х) лишь с некоторой погрешностью 8, обусловленной (по крайней мере) заведомым округлением чисел при расчетах на компьютере.

В результате, при очень малом шаге разностные формулы означают вычитание друг из друга близких чисел. В этом случае ошибки вычисления функции f (х) становятся доминирующими и приводят к существенному росту суммарной погрешности вычисления разностной производной. Отсюда как раз и следует тот вывод, что значение шага следует выбирать "не очень малым", иначе ошибки вычисления f (х) неминуемо сделают результат дифференцирования неправильным. Глядя на рис. 3.5, легко сообразить, что в данном случае следует выбирать промежуточные значения Д, которые обеспечат минимальную (или почти минимальную) погрешность.

Следует подчеркнуть, что в зависимости от характера дифференцируемой функции диапазон приемлемых значений Л будет различным. Поэтому в каждом конкретном случае требуется совершать дополнительные шаги, тестирующие верность выбора шага для численного дифференцирования. Такая процедура, кстати говоря, заложена в адаптивном алгоритме дифференцирования, примененном в Mathcad, что делает его весьма надежным для численного расчета производной.

С учетом сказанного выше, с дифференцированием в Mathcad обычно не возникает сложных проблем. Исключение составляют функции, которые дифференцируются в окрестности сингулярной точки; например, для функции f (х)=1/х это будут точки вблизи х=0. При попытке найти ее производную при х=0 (рис. 3.6) будет выдано сообщение об одной из ошибок деления на ноль "Can't divide by zero" (Деление на ноль невозможно) или "Found a singularity while evaluating this expression. You may be dividing by zero" (Найдена сингулярность при вычислении этого выражения. Возможно, вы делите на ноль).



Рис. 3.6. Если производная функции в данной точке не существует, выдается сообщение об ошибке


Если попробовать численно определить производную очень близко к нулю, например, при х=10-100, то, несмотря на существование производной, может появиться сообщение об ошибке "Can't converge to a solution" (Невозможно найти решение). Новые версии Mathcad (начиная с 11-й) справляются с указанной трудностью, поскольку в них даже для численного дифференцирования сначала задействуется символьный процессор, поставляющий аналитическое решение, подстановка в которое аргумента дифференцирования дает верный результат. Встретившись с одной из упомянутых ошибок, присмотритесь внимательнее к дифференцируемой функции и убедитесь, что вы не имеете дело с точкой сингулярности.