Поиск корня уравнения
Теперь мы подшутим
над функцией root, и если не получим от этого удовольствия, то хотя бы уясним себе, какие «подводные камни» могут нас ожидать.
Если в качестве первого приближения (опорной точки) принять не минус 50, а плюс 5 (пункт 5), то функция root выкинет «белый флаг»: сообщение «Can’t converge to a solution», отказываясь решать поставленную задачу, хотя плюс 5 намного ближе к корню, чем минус 50. Вот вам и первое приближение! Но это еще полбеды. Настоящая беда случается тогда, когда функция root (как, впрочем, и некоторые другие функции и операторы Mathcad) не отказывается решать поставленную задачу, выдавая при этом неверный результат (феномен медвежьей услуги).
Если функцию y(x) умножить на константу, например на 10-5, то ее корни останутся на старых местах. Но это утверждение в среде Mathcad не является истиной – см. пункт 6 рис. 3.1.
Не то беда, Авдей Флюгарин,
Что родом ты не русский барин,
Что на Парнасе ты цыган...
Беда, что скучен твой роман.
Не то беда, что ты, Mathcad, неправильно решил простейшую задачу: и более мощные специализированные пакеты, ориентированные только на решение алгебраических уравнений и систем, делают тут промах. Беда в том, что Mathcad в этом честно не признался, как это было в пункте 5 на рис. 3.1.
Философский смысл любой шутки заключается в том, что у шутника и у того, над кем подшучивают, разные понятия о природе вещей. У пользователя и у среды Mathcad разные понятия о том, что такое корень уравнения: человек считает, что корень – это то значение аргумента, при котором выражение равно нулю; функция же root «считает», что корень – это то значение аргумента, при котором значение выражения по модулю не превышает значения системной переменной TOL, которая по умолчанию равна 10-3. Отсюда и путаница в пункте 6 на рис. 3.1. Чтобы функция root там сработала правильно, необходимо переменной TOL присвоить новое значение (10-7, например), заменив им предопределенное. Можно поступить и по-другому – умножить в пункте 6 правую часть функции на 100000, убрав тем самым коэффициент 0.00001. Метод балластных (нормирующих) коэффициентов особенно эффективен при решении алгебраических систем (что уже было отмечено в этюде 1). Он позволяет уравнять все уравнения (прошу простить за тавтологию) по отношению к точности, с которой система решается через блок Given-Find. На нижнем графике рисунка 3.1 ось X «утолщена» до значения TOL (пунктир). Корень там, где кривая касается этой «толстой» оси.
В среде Mathcad 8 переменная TOL была дополнена еще одной системной переменной ¾ CTOL (tolerance of the constraints ¾ точность ограничений), которая также по умолчанию равна 10-3, но уже отвечает не за поиск корней и оптимумов, а за ограничения ¾ за уравнения и неравенства, записанные после ключевого слова Given.
С промахом, зафиксированным в пункте 5 рис. 3.1, можно разобраться после знакомства с вычислительными методами, заложенными в функцию root. В Руководстве пользователя Mathcad сказано, что функция root ищет корень выражения методом секущих, и дано его описание, которое автор перевел на язык BASIC.
' Поиск корня уравнения методом секущих
' Реализация на языке BASIC Mathcad-функции root
Def FnY(x) = 2 * X ^ 3 + 20 * x ^ 2 – 2 * x + 100 ' Анализируемая функция
TOL = 0.001 ‘ Точность поиска корня
‘ Начало процедуры поиска корня
Input "X нач. :=", X ‘ Начальное приближение
If Abs(FnY(X)) < TOL Then
root = X ‘ Начальное приближение и есть корень уравнения
Else ‘ Расчет второй опорной точки
If X = 0 Then h = TOL Else h = X * TOL
X0 = X : X1 = X + h
Do ‘ Цикл приближения к корню
root = X1 – FnY(X1) * (X1 – X0) / (FnY(X1) – FnY(X0))
X0 = X1: X1 = root ' Подготовка к следующему приближению
Loop Until Abs(FnY(X1)) <= TOL ‘ Условие завершения цикла
End If
"Y=0 при X="; root ‘ Вывод результата