MathCAD — это просто! Часть 3. Уравнения Продолжение
Итак, в прошлый раз мы с вами узнали, что MathCAD умеет давать пользователю результаты решения уравнений в двух принципиально разных формах: аналитической и численной. И посмотрев на то, что аналитическое решение уравнений третьей и четвертой степеней не просто громоздкое, а очень громоздкое, пришли к выводу, что проще и полезнее (для собственного душевного равновесия) будет решать такие уравнения не в общем виде, а численно. В этот раз мы с вами поговорим еще немного об уравнениях.
Графическое решение
Одним из удобных и наглядных способов решения уравнений является графический. Графическим он называется потому, что при использовании такого способа решение уравнения f(x) = 0 представляется в виде графика функции f(x), пересечения которого с осью абсцисс (X) и будут решениями начального уравнения. Конечно, особенно точным такой способ решения назвать сложно, но он может пригодиться для задания начального приближения, необходимого для полноценной работы функции root, которая поможет найти корни более точно. Для начала рассмотрим простенькое квадратное уравнение 2x2 — 7x — 17 = 0. Левую часть уравнения нужно записать в виде функции, т.е. нужно сделать запись f(x) := 2x2 — 7x — 17. Напомню, что оператор присваивания (:=) записывается с клавиатуры при помощи простого двоеточия, т.е. для латинской раскладки клавиатуры это будет Shift+;, а для русской — Shift+6. Далее нужно задать диапазон построения графика. Для этого для переменной x записываем x := -10..10. Здесь нужно использовать специальный разделитель, применяемый в MathCAD'е для записи интервалов — обычное написание двух символов "." подряд не поможет. Это разделитель можно найти на панели матричных вычислений (кнопка "m..n") или записать с помощью нажатия на клавиатуре точки с запятой. Итак, все нужное для построения графика мы с вами подготовили. Теперь дело за малым — добавить на рабочее поле собственно график. Для этого на панели "Graph" выберите "X-Y Plot" (самая первая из всех кнопок на панели), и тогда у вас на экране появится область построения графика. Для того, чтобы график в ней построился, нужно в центре под осью абсцисс написать имя нашей переменной (в данном случае им будет, конечно же, x), а по центру рядом с осью ординат — имя нашей функции (то есть f(x)).
Что ж, график у нас теперь есть. Как же определить, какая именно точка соответствует решению нашего уравнения? С этим поможет трассировка. Щелкните по получившемуся графику правой кнопкой мыши и выберите Trace. У вас на графике появится этакий "прицел", который можно будет передвигать мышкой, и окно, в котором будут отображаться координаты точки, находящейся в середине прицела (см. скриншоты). Прицел этот можно, кстати, двигать и при помощи клавиатурных стрелочек, но все равно в любом случае передвигаться он будет исключительно и только вдоль кривой, отображающей ход нашей функции, нули которой мы и ищем. Думаю, основную идею вы уже уловили: передвигая крестик-"прицел" вдоль кривой, можно в окне трассировки увидеть точку, Y-координата которой будет равна нулю.
Здесь, правда, может возникнуть небольшая проблема. В нашем уравнении, например, корень получился не целым, а трассировать функцию по X мы можем только с шагом, равным единице. Конечно, для того, чтобы локализовать корень для последующего применения функции root, в нашем случае достаточно и такой точности: достаточно найти интервал, на котором функция будет менять свой знак (то есть ее значение будет меняться с положительного на отрицательное или, напротив, с отрицательного на положительное). Но для других уравнений может случиться такое, что на единичном интервале может лежать и несколько решений — действительно, почему бы и нет, ведь даже для квадратных уравнений несложно придумать случай, когда такое может случиться. Какой из этого может быть выход? Самый простой и очевидный — уменьшить шаг трассировки по оси X, чтобы можно было более точно искать нулевые точки по оси Y. Сделать это в MathCAD очень просто. Помните, как мы задавали диапазон для нашей переменной x? Давайте кое-что поменяем и запишем его следующим образом: x := -10,-9.9..10. Теперь уже шаг трассировки у нас будет не единица, а одна десятая (0,1). Для того, чтобы уменьшить его еще в десять раз, нужно записать x := -10,-9.99..10. Общий принцип здесь вполне очевиден: мы записываем следующую точку диапазона следом за первой и, таким образом, указываем шаг, с которым MathCAD будет строить (а в итоге — и трассировать) наш график. Для более наглядного отображения данных имеет смысл добавить на график координатную сетку. Сделать это можно, если кликнуть по графику дважды, а затем в появившемся окне (см. скриншот) установить флажки напротив пунктов Grid Lines в категориях X Axis и Y Axis. Первый флажок устанавливает координатные линии для оси X, а второй, соответственно, для оси Y. Единственное, что также рекомендую — так это сразу поменять и цвет линий координатной сетки, кликнув по квадратикам рядом с этими пунктами — по умолчанию он задан кислотно-зеленым, что не очень удобно для глаз. Хотя это уже, конечно, дело вкуса.
Мы с вами еще вернемся к графикам, и, я так думаю, даже и не раз, но на сегодня о них, пожалуй, уже достаточно. Давайте обсудим лучше еще некоторые особенности использования функции root.
Контроль точности решения уравнений с помощью функции root
Практически любой численный метод решения уравнений и систем уравнений является приближенным. Счастливым исключением из этого правила являются, пожалуй, только некоторые матричные методы решения систем линейных уравнений. Ну и решения простых линейных, квадратных и кубических уравнений тоже являются точными — правда, их редко относят к численным, потому что здесь фактически для расчета численных значений корней используются аналитические формулы. С функцией root все несколько иначе: она умеет решать любые (ну, или практически любые) по своему виду уравнения, но зато выдает приближенные значения их решений. Поскольку нередко нужно знать решение уравнения с какой-то четко заданной точностью, будет весьма полезным узнать, как эту точность в MathCAD'е можно контролировать. Оказывается, это совсем не сложно, и даже, более того, я бы сказал, совсем просто. В системе MathCAD существует специальная переменная, служащая как раз таки для контроля точности численных решений. Называется эта переменная TOL, и такое название происходит от английского слова tolerance, которое "Мультилекс" перевел как "допустимое отклонение от стандартного размера". В нашем случае это как раз и означает точность. Для того, чтобы пояснить суть этого параметра, следует немного углубиться во "внутреннюю кухню" MathCAD'а. Не бойтесь, я не буду рассказывать подробно об алгоритмах и писать какие-то формулы. Но если вам это неинтересно, можно просто пропустить следующий абзац.
Дело в том, что методы, применяемые MathCAD'ом при численном решении уравнений, являются итерационными. Что это значит? Это значит, что все эти методы используют для получения значения x цикл, в котором каждое следующее значение решения вычисляется по предыдущему, но с большей точностью. Циклы бывают разными, как и начальные значения переменной x, и в теории численных методов выводятся формулы, показывающие, при каких условиях возможно получение приближенного решения — а ведь даже это возможно далеко не всегда. Когда цикл имеет нормальный ход, то есть с каждой последующей итерацией (выполнением вычислений в рамках одного шага цикла) значение приближенного решения получается более точным, то есть более близким к реальному решению, чем на предыдущей итерации, говорят, что итерации сходятся (иногда добавляют, что они сходятся к точному значению решения). Для того, чтобы определять, когда же значение, получаемое в результате итерационных вычислений, нас наконец-то устроит, и используется переменная TOL. Для простоты восприятия можно сказать, что, когда разница между текущим и предыдущим значением переменной в рамках цикла становится меньше, чем TOL, то ее дальнейшее вычисление (то есть и сам цикл) прекращаются. Таким вот нехитрым образом TOL и служит для контроля точности вычислений. Впрочем, это совсем не гарантирует, что точка, вычисленная таким образом, будет лежать близко к реальному корню — вполне может оказаться и так, что указанная разность вычисленных значений будет меньше, чем TOL, и довольно далеко от точки, являющейся реальным решением заданного уравнения. Но с этим, к сожалению, ничего поделать нельзя — алгоритм, вложенный создателями MathCAD'а в свой продукт, на самом деле не так уж и плох, если правильно подбирать начальное приближение и TOL. Для этого рекомендуется перед началом непосредственных вычислений значений корня уравнения f(x) = 0 строить график его левой части (так, как мы это делали выше), а после получения собственно значения — проверять его с помощью подстановки в исходное уравнение.
Изменять переменную TOL можно выбрав в главном меню MathCAD'а пункт Tools, далее выбрав Worksheet Options, а потом — вкладку Built-in Variables (см. соответствующий скриншот). Там вы без труда найдете надпись "Convergence Tolerance (TOL)" и соответствующее значение, равное по умолчанию 0,001, или 10-3. Поменять значение TOL можно прямо в документе, записав, например: TOL := 0,0001. Нужно только помнить, что тогда менять TOL нужно до вызова функции root. Ну и, конечно, не стоит сильно увлекаться уменьшением TOL, потому что в ряде случаев это может затруднить процесс поиска решения и привести к тому, что оно вообще не будет найдено. Кроме того, надо отметить, что чем меньше TOL, тем больше времени потребуется MathCAD'у на вычисление решения. Делать TOL в случае использования root меньше, чем 10-13, обычно и вовсе не имеет смысла, потому что погрешности расчета функций exp, sin, log и других (это все трансцендентные функции) находятся примерно на этом уровне, и более точное значение получить будет попросту технически невозможно. Вообще же теоретически предельным для TOL является значение 10-16, но добиться такой точности, как правило, реально невозможно. Да и редко когда нужно, к счастью.
SF, spaceflyer@tut.by
Графическое решение
Одним из удобных и наглядных способов решения уравнений является графический. Графическим он называется потому, что при использовании такого способа решение уравнения f(x) = 0 представляется в виде графика функции f(x), пересечения которого с осью абсцисс (X) и будут решениями начального уравнения. Конечно, особенно точным такой способ решения назвать сложно, но он может пригодиться для задания начального приближения, необходимого для полноценной работы функции root, которая поможет найти корни более точно. Для начала рассмотрим простенькое квадратное уравнение 2x2 — 7x — 17 = 0. Левую часть уравнения нужно записать в виде функции, т.е. нужно сделать запись f(x) := 2x2 — 7x — 17. Напомню, что оператор присваивания (:=) записывается с клавиатуры при помощи простого двоеточия, т.е. для латинской раскладки клавиатуры это будет Shift+;, а для русской — Shift+6. Далее нужно задать диапазон построения графика. Для этого для переменной x записываем x := -10..10. Здесь нужно использовать специальный разделитель, применяемый в MathCAD'е для записи интервалов — обычное написание двух символов "." подряд не поможет. Это разделитель можно найти на панели матричных вычислений (кнопка "m..n") или записать с помощью нажатия на клавиатуре точки с запятой. Итак, все нужное для построения графика мы с вами подготовили. Теперь дело за малым — добавить на рабочее поле собственно график. Для этого на панели "Graph" выберите "X-Y Plot" (самая первая из всех кнопок на панели), и тогда у вас на экране появится область построения графика. Для того, чтобы график в ней построился, нужно в центре под осью абсцисс написать имя нашей переменной (в данном случае им будет, конечно же, x), а по центру рядом с осью ординат — имя нашей функции (то есть f(x)).
Что ж, график у нас теперь есть. Как же определить, какая именно точка соответствует решению нашего уравнения? С этим поможет трассировка. Щелкните по получившемуся графику правой кнопкой мыши и выберите Trace. У вас на графике появится этакий "прицел", который можно будет передвигать мышкой, и окно, в котором будут отображаться координаты точки, находящейся в середине прицела (см. скриншоты). Прицел этот можно, кстати, двигать и при помощи клавиатурных стрелочек, но все равно в любом случае передвигаться он будет исключительно и только вдоль кривой, отображающей ход нашей функции, нули которой мы и ищем. Думаю, основную идею вы уже уловили: передвигая крестик-"прицел" вдоль кривой, можно в окне трассировки увидеть точку, Y-координата которой будет равна нулю.
Здесь, правда, может возникнуть небольшая проблема. В нашем уравнении, например, корень получился не целым, а трассировать функцию по X мы можем только с шагом, равным единице. Конечно, для того, чтобы локализовать корень для последующего применения функции root, в нашем случае достаточно и такой точности: достаточно найти интервал, на котором функция будет менять свой знак (то есть ее значение будет меняться с положительного на отрицательное или, напротив, с отрицательного на положительное). Но для других уравнений может случиться такое, что на единичном интервале может лежать и несколько решений — действительно, почему бы и нет, ведь даже для квадратных уравнений несложно придумать случай, когда такое может случиться. Какой из этого может быть выход? Самый простой и очевидный — уменьшить шаг трассировки по оси X, чтобы можно было более точно искать нулевые точки по оси Y. Сделать это в MathCAD очень просто. Помните, как мы задавали диапазон для нашей переменной x? Давайте кое-что поменяем и запишем его следующим образом: x := -10,-9.9..10. Теперь уже шаг трассировки у нас будет не единица, а одна десятая (0,1). Для того, чтобы уменьшить его еще в десять раз, нужно записать x := -10,-9.99..10. Общий принцип здесь вполне очевиден: мы записываем следующую точку диапазона следом за первой и, таким образом, указываем шаг, с которым MathCAD будет строить (а в итоге — и трассировать) наш график. Для более наглядного отображения данных имеет смысл добавить на график координатную сетку. Сделать это можно, если кликнуть по графику дважды, а затем в появившемся окне (см. скриншот) установить флажки напротив пунктов Grid Lines в категориях X Axis и Y Axis. Первый флажок устанавливает координатные линии для оси X, а второй, соответственно, для оси Y. Единственное, что также рекомендую — так это сразу поменять и цвет линий координатной сетки, кликнув по квадратикам рядом с этими пунктами — по умолчанию он задан кислотно-зеленым, что не очень удобно для глаз. Хотя это уже, конечно, дело вкуса.
Мы с вами еще вернемся к графикам, и, я так думаю, даже и не раз, но на сегодня о них, пожалуй, уже достаточно. Давайте обсудим лучше еще некоторые особенности использования функции root.
Контроль точности решения уравнений с помощью функции root
Практически любой численный метод решения уравнений и систем уравнений является приближенным. Счастливым исключением из этого правила являются, пожалуй, только некоторые матричные методы решения систем линейных уравнений. Ну и решения простых линейных, квадратных и кубических уравнений тоже являются точными — правда, их редко относят к численным, потому что здесь фактически для расчета численных значений корней используются аналитические формулы. С функцией root все несколько иначе: она умеет решать любые (ну, или практически любые) по своему виду уравнения, но зато выдает приближенные значения их решений. Поскольку нередко нужно знать решение уравнения с какой-то четко заданной точностью, будет весьма полезным узнать, как эту точность в MathCAD'е можно контролировать. Оказывается, это совсем не сложно, и даже, более того, я бы сказал, совсем просто. В системе MathCAD существует специальная переменная, служащая как раз таки для контроля точности численных решений. Называется эта переменная TOL, и такое название происходит от английского слова tolerance, которое "Мультилекс" перевел как "допустимое отклонение от стандартного размера". В нашем случае это как раз и означает точность. Для того, чтобы пояснить суть этого параметра, следует немного углубиться во "внутреннюю кухню" MathCAD'а. Не бойтесь, я не буду рассказывать подробно об алгоритмах и писать какие-то формулы. Но если вам это неинтересно, можно просто пропустить следующий абзац.
Дело в том, что методы, применяемые MathCAD'ом при численном решении уравнений, являются итерационными. Что это значит? Это значит, что все эти методы используют для получения значения x цикл, в котором каждое следующее значение решения вычисляется по предыдущему, но с большей точностью. Циклы бывают разными, как и начальные значения переменной x, и в теории численных методов выводятся формулы, показывающие, при каких условиях возможно получение приближенного решения — а ведь даже это возможно далеко не всегда. Когда цикл имеет нормальный ход, то есть с каждой последующей итерацией (выполнением вычислений в рамках одного шага цикла) значение приближенного решения получается более точным, то есть более близким к реальному решению, чем на предыдущей итерации, говорят, что итерации сходятся (иногда добавляют, что они сходятся к точному значению решения). Для того, чтобы определять, когда же значение, получаемое в результате итерационных вычислений, нас наконец-то устроит, и используется переменная TOL. Для простоты восприятия можно сказать, что, когда разница между текущим и предыдущим значением переменной в рамках цикла становится меньше, чем TOL, то ее дальнейшее вычисление (то есть и сам цикл) прекращаются. Таким вот нехитрым образом TOL и служит для контроля точности вычислений. Впрочем, это совсем не гарантирует, что точка, вычисленная таким образом, будет лежать близко к реальному корню — вполне может оказаться и так, что указанная разность вычисленных значений будет меньше, чем TOL, и довольно далеко от точки, являющейся реальным решением заданного уравнения. Но с этим, к сожалению, ничего поделать нельзя — алгоритм, вложенный создателями MathCAD'а в свой продукт, на самом деле не так уж и плох, если правильно подбирать начальное приближение и TOL. Для этого рекомендуется перед началом непосредственных вычислений значений корня уравнения f(x) = 0 строить график его левой части (так, как мы это делали выше), а после получения собственно значения — проверять его с помощью подстановки в исходное уравнение.
Изменять переменную TOL можно выбрав в главном меню MathCAD'а пункт Tools, далее выбрав Worksheet Options, а потом — вкладку Built-in Variables (см. соответствующий скриншот). Там вы без труда найдете надпись "Convergence Tolerance (TOL)" и соответствующее значение, равное по умолчанию 0,001, или 10-3. Поменять значение TOL можно прямо в документе, записав, например: TOL := 0,0001. Нужно только помнить, что тогда менять TOL нужно до вызова функции root. Ну и, конечно, не стоит сильно увлекаться уменьшением TOL, потому что в ряде случаев это может затруднить процесс поиска решения и привести к тому, что оно вообще не будет найдено. Кроме того, надо отметить, что чем меньше TOL, тем больше времени потребуется MathCAD'у на вычисление решения. Делать TOL в случае использования root меньше, чем 10-13, обычно и вовсе не имеет смысла, потому что погрешности расчета функций exp, sin, log и других (это все трансцендентные функции) находятся примерно на этом уровне, и более точное значение получить будет попросту технически невозможно. Вообще же теоретически предельным для TOL является значение 10-16, но добиться такой точности, как правило, реально невозможно. Да и редко когда нужно, к счастью.
SF, spaceflyer@tut.by
Компьютерная газета. Статья была опубликована в номере 15 за 2008 год в рубрике soft