Численное решение уравнений в MathCAD

Численное решение уравнений в MathCAD

Все задачи, с которыми вам приходилось сталкиваться в школе или изучать в университете, решались символьно. То есть вы тем или иным образом преобразовывали и упрощали выражения, использовали какие-то стандартные формулы и методы, умножали, делили, сокращали — и в результате приходили к какому-то аналитически несложному результату. Так, например, при решении квадратного уравнения вы использовали формулы Виета; пытаясь найти корни кубического уравнения, вы разлагали выражение на линейные множители (или, в крайнем случае, использовали формулу Кардано), для бикубических уравнений прибегали к замене. В общем, для того, чтобы решить даже очень несложное нелинейное уравнение, от вас требовалось знание великого множества разнообразных формул и подходов. Но, увы, как бы вы хорошо ни ориентировались во всех этих методах и подходах, зачастую это мало вам помогало, так как использование большинства из них крайне трудоемко и подходит для решения очень немногих (специально подобранных) уравнений. На практике же, как правило, приходится работать с уравнениями, включающими разнородные функции (что, как правило, автоматически означает невозможность символьного решения) или с очень неудобными коэффициентами. Справиться со многими из них привычным преобразованием или заменами никак не получится. Что же делать?

Естественно, если вам попадется такое "нерешаемое" уравнение, вы попытаетесь просто подобрать корни. Для этого вы будете подставлять какие-то значения переменной (выбор которых, скорее всего, в основном будет определяться вашей интуицией) в надежде на то, что какое-то из них обратит уравнение в нуль. К сожалению, и такой способ весьма малоэффективен на практике: подставив десяток-другой значений, вы почти наверняка предпочтете удовлетвориться мыслью о том, что данное уравнение не имеет решений вовсе, чем продолжать эту чрезвычайно неинтересную работу.

Но если у вас есть компьютер с системой MathCAD, то никаких проблем с поиском решения не будет вне зависимости от сложности уравнения. Конечно, аналитическое решение компьютер вряд ли найдет даже для очень простых уравнений (в этом пока человек значительно превосходит машину), но зато ввиду колоссальной по сравнению с человеческой скоростью обработки данных очень эффективными становятся так называемые численные методы.

В основе всех численных методов решения уравнений лежит принцип подбора. Но, в отличие от подбора возможных корней человеком, в численных методах этот процесс является строго направленным. Основным понятием численных методов является итерация. Итерация — это буквально повторение, то есть все численные методы построены на принципе повторения одного и того же действия или последовательности действий, результатом которых является большее или меньшее приближение некоторого рабочего значения переменной к корню. Поэтому численные методы решения уравнений называются еще итерационными. Число необходимых итераций определяется скоростью сходимости алгоритма (эффективностью). Эффективность различных численных алгоритмов может различаться весьма значительно, но это не значит, что всегда стоит избирать из них наиболее быстрый: чем выше скорость сходимости к решению, тем, как правило, чувствительность алгоритма к различного рода трудностям (многочисленным экстремумам, разрывам или недифференцируемости в некоторых точках) выше. Поэтому очень важно иметь представление (хотя бы самое поверхностное) о том, какие принципы лежат в основе работы той или иной функции: это поможет выбрать наиболее подходящий в рамках данной задачи алгоритм и тем самым избежать лишних ошибок и проблем.

Немного о выборе типа алгоритма. В общем случае, конечно, гораздо лучше получить решение в результате символьных преобразований, так как при этом можно найти сразу все корни (при использовании встроенных функций MathCAD — только один), причем без какой-либо погрешности. Но, увы, аналитическое решение имеет относительно небольшое количество задач, а символьный процессор MathCAD сможет справиться вообще с мизерным процентом уравнений. Так что применение численных методов — это печальная необходимость. Но особо огорчаться по этому поводу не стоит: все недостатки численных алгоритмов MathCAD можно легко преодолеть.

Для численного поиска решений алгебраических уравнений с одним неизвестным в MathCAD существует специальная встроенная функция root (корень). Функция эта может использоваться с различными начальными условиями, при этом реализуются разные численные алгоритмы. Так, если определена только одна точка приближения к корню, поиск решений будет осуществляться так называемым методом секущих. Если же задан интервал, на котором предположительно локализовано решение, то поиск его будет осуществлен с применением метода деления пополам (или метода Больцано).

Если необходимо найти корень некоторого уравнения, причем известен интервал, в котором находится корень, проще всего использовать функцию root с 4 аргументами: root(f(x), x, a, b), где f ( x ) — функция, определяющая уравнение, x — переменная, a и b — границы интервала локализации. Обязательным условием является то, что значения функции на концах интервала должны быть противоположных знаков.

Попробуем протестировать функцию root и для этого найдем корни какого-нибудь уравнения, точное решение которого очевидно. К примеру, возьмем уравнение



все корни которого имеют вид p × N/4 (N=1, 2, ...). Попробуем найти первое положительное решение. Очевидно, что таковым будет x=p /4 (что очень хорошо видно на графике).



Посмотрим, однако, найдет ли этот корень функция root. Интервал локализации определим от 0 до p /3:



MathCAD не подвел на этот раз: решение найдено в точности. Попробуем решить это уравнение с другим интервалом локализации:



Полученный результат отличается от первого решения, хотя корень х =0.25 (находится в данном интервале. Все дело в том, что в этом же промежутке находится еще 4 корня, и заранее предсказать, какой именно из них будет выдан в качестве ответа, совершенно невозможно. Поэтому следует ввести еще одно ограничение для применения функции root в рассматриваемой интерпретации: на промежутке должен быть локализован только один корень. В тех случаях, когда определить границы такой локализации невозможно, следует применять функцию root с одной точкой приближения (то есть перейти от метода Больцано к методу секущих). Хотя практически всегда определить нужный промежуток можно и чисто визуально, предварительно задав график. Вообще, строить график всегда желательно, когда вы используете численные методы: это самый надежный способ избежать ошибок и не потерять корни. Другой вопрос, что в случае систем уравнений это может помочь очень мало (так как сделать какие-то более или менее точные выводы по двум пересекающимся поверхностям совершенно невозможно).

Очень важной характеристикой решения является его точность. В MathCAD можно регулировать величину погрешности решения, изменяя значение специальной системной переменной TOL (от английского tolerance — точность). Строго говоря, TOL — это параметр, определяющий условие прекращения итераций. То есть цикл численного алгоритма остановит свою работу и выдаст последнее значение x, если f ( x ) примет значение, меньшее, чем TOL. Изменить величину этой встроенной переменной можно либо при помощи команды Math/Options/Built-in variables/TOL (Математические/Опции/Системные переменные/TOL), либо выполнив соответствующее присваивание непосредственно слева или сверху функции численного решения. Посмотрим, как влияет изменение величины TOL (по умолчанию равной 10 -3 ) на точность поиска корня. Пусть дана следующая функция:



Для того чтобы определить существование у нее нулей, а также, при их наличии, приблизительные границы интервала локализации корней, построим график:



Один корень вполне очевиден — это 0. Посмотрим, однако, сможет ли найти его функция root. Попробуем провести такой расчет при различных значениях TOL:







Для такой невысокой точности результат получился на удивление неплохим (значение функции в точке, определенной как корень, на 3 порядка меньше TOL — условия остановки цикла алгоритма). Но все равно 0.066 — это довольно далеко от настоящего значения корня. А то, что значение f ( x ) в этой точке весьма близко к нулю, совсем неудивительно: это связано с особенностью поведения функции в окрестности 0, где она буквально "скользит" по оси X .

Увеличим точность:







При уменьшении TOL на три порядка приблизительно во столько же порядков увеличилась и точность решения (что вполне закономерно). Новое значение корня может удовлетворить большинству требований к точности, возникающих на практике. Но все же мы попытаемся получить максимально точное решение. Для этого еще более уменьшим значение TOL:







Значение корня уже крайне близко к нулю. Попробуем задать высшую точность, возможную в MathCAD (TOL=10 -15 ):







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

Более 30 раз пришлось повторить операцию с этим инструментом, пока наконец кривая перестала сливаться с осью X ! В результате получился следующий график:



Теперь совсем несложно понять причину возникших трудностей: просто кривая в окрестности 0 слишком близко подходит к оси X . А, как вы помните, корень считается найденным, когда значение функции в некоторой точке меньше TOL. В случае же рассматриваемой функции для стандартной точности (10 -3 ) такие точки появятся на относительно большом расстоянии от точки решения. Поэтому результат получается неверным. Но, с другой стороны, утверждать, что решение в рассмотренных выше случаях находилось ошибочное, совершенно некорректно. Ведь по условию в точке корня значение функции должно быть меньше TOL. Для большинства численных методов это основное, а в случае метода бисекции (схожий с ним алгоритм лежит в основе работы функции root с четырьмя аргументами) — единственное условие определения некоторой точки x как корня. Условие же это при всех значениях точности было выполнено, причем TOL и f ( x ) отличались на несколько порядков. Просто, строго говоря, получаемые значения корней следует округлять до порядка, равного порядку продекларированной точности (ведь значение функции не может быть точнее входных данных). Если бы мы это сделали, то во всех случаях, в том числе и при TOL=10 -1, ответ получился бы верным (хотя, надо признать, в случае TOL=10 -1 это было бы, скорее, счастливое совпадение).

Из всего вышесказанного можно сделать вывод: нахождение корня функцией root совсем не означает его действительного существования. Очень даже возможна такая ситуация, когда кривая функции очень близко подходит к оси Х, но при этом не пересекает ее. Если же установленный уровень точности окажется больше того расстояния, на которое она приближается к оси, то точку, в которой это сближение происходит, MathCAD определит как корень.

Что же делать, чтобы избежать таких ошибок? Во-первых, всегда строить график. В системе MathCAD это делается предельно быстро и просто, а неприятностей позволяет избежать очень многих. Во-вторых, если вы видите, что график как бы скользит по оси Х (очень неясная ситуация: возможно и пересечение в 2-х точках, и касание в одной, и отсутствие общих точек вообще), попробуйте увеличить точность по максимуму: в большинстве случаев этого бывает вполне достаточно. И в-третьих, если сомнения все равно остаются, используйте инструмент ZOOM в области предполагаемого расположения корня. Пожалуй, способ этот самый надежный: ведь увеличение можно производить практически до бесконечности.

Найти решение уравнения в MathCAD можно применяя другую форму встроенной функции root, имеющую только 2 аргумента (имя функции и переменной). При использовании этого варианта выше или правее самой функции root следует задать начальное приближение для x:







Определить величину начального приближения можно либо чисто интуитивно, либо (лучше) построив график.

Вы можете задать резонный вопрос: если существует весьма верный и простой метод бисекции, зачем использовать другие, менее надежные (как будет показано далее) методы? Тут все дело вот в чем: во-первых, не всегда существованию корня сопутствует интервал с различными по знаку значениями функции в точках его границ (есть возможность простого касания); во-вторых, метод бисекции не очень удобно использовать при программном поиске всех корней уравнения сканированием некоторой широкой области; в-третьих, ввиду того, что построенные при помощи компьютерных программ графики отражают вид функции довольно искаженно, определение при их помощи интервала локализации корня нельзя считать абсолютно надежным.

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

Дмитрий Гурский, Юрий Стрельченко, dot@omen.ru


Компьютерная газета. Статья была опубликована в номере 07 за 2003 год в рубрике soft :: текст

©1997-2024 Компьютерная газета