Как можно решить нелинейное уравнение в mathcad

Zoloto585CPA

Как можно решить нелинейное уравнение в mathcad

БлогNot. Методы решения нелинейных уравнений в MathCAD

Методы решения нелинейных уравнений в MathCAD

Реализуем для некоторого уравнения 4 наиболее популярных численных метода для решения нелинейных уравнений. При этом мы стремимся именно запрограммировать методы, а не воспользоваться встроенным инструментом Given. Find или функциями root , polyroot . Об этих способах решения почитайте, например, здесь.

Определим функцию уравнения f(x)=0 как функцию пользователя, интервал поиска решения зададим переменными a и b . Найти этот интервал можно, например, табличным или графическим методом:

Уравнение и интервал поиска решения
Уравнение и интервал поиска решения

Логика метода дихотомии (возможно, более правильные названия — метод бисекции, метод половинного деления) довольно проста: если на концах выбранного интервала [a,b] знаки функции совпадают (произведение f(a)*f(b)>0 ), то вернуть результат "недопустимый интервал" (вернём в этом случае ответ "бесконечность"), в противном случае до тех пор, пока длина интервала не станет меньше заданной погрешности ε , будем находить середину текущего интервала c=(a+b)/2 , считать в ней значение функции и проверять, какую из половин отрезка [a,c] или [c,b] нужно отбросить для выполнения следующего шага — а именно, ту, в которой знак f(c) совпадает со знаком функции на левой или правой границе интервала (в листинге — проверка f(a)*f(c)>0 ). Для большей точности вернём середину "последнего" интервала [a,b] , меньшего ε :

Метод дихотомии в MathCAD
Метод дихотомии в MathCAD

В методе простой итерации исходное уравнение f(x)=0 представляется в эквивалентном виде φ(x)=x (что, вообще говоря, можно сделать бесконечным числом способов), а затем шаг метода выполняется по формуле xk+1 = φ(xk) , пока не будет достигнута заданная точность |xk+1-xk|<ε . Если выбрать φ(x)=x-c*f(x) , то константу c целесообразнее всего искать методом релаксации, для которого c=2/(M+m) , где M — максимальное из значений первой производной на концах отрезка или в находящихся на нём точках перегиба функции (точках, где f»(x)=0 ), а m — минимальное из таких значений. Вот соответствующий расчёт в MathCAD:

Метод простой итерации (релаксации) в MathCAD
Метод простой итерации (релаксации) в MathCAD

Если заданной сходимости нет в течение 10000 шагов, в подпрограмме предусмотрен аварийный выход.

Численный метод Ньютона решения нелинейного уравнения основан на формуле вида xk+1 = xk-f(xk)/f'(xk) , обеспечивающей наилучшую сходимость, но требующей дополнительного вычисления производной на каждом шаге. Так как производные для MathCAD — не проблема, можно всё сделать "в лоб":

Метод Ньютона для решения нелинейного уравнения в MathCAD
Метод Ньютона для решения нелинейного уравнения в MathCAD

Видно, что сходимость метода — на 2 порядка выше (погрешность найденного решения

Наконец, существует метод хорд, в котором кривая f(x) заменяется прямой линией (хордой), стягивающей точки (a, f(a)) и (b, f(b)) . Формула этого метода зависит от знака выражения f(a)*f»(a) , то есть, имеет два варианта:
Если f(a)*f»(a)>0 , то x0=b , xk+1=a-(f(a)(xk-a))/(f(xk)-f(a))
Если f(a)*f»(a)<0 , то x0=a , xk+1=xk-(f(xk)*(b-xk))/(f(b)-f(xk))

Вот примерная реализация на MathCAD, как и в предыдущих двух случаях, контролируется максимальное число итераций, равное 10000:

Метод хорд решения нелинейного уравнения в MathCAD
Метод хорд решения нелинейного уравнения в MathCAD

Видно, что сходимость метода оказалась в нашем случае не столь высока.

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

MathCAD — это просто! Часть 5. Системы нелинейных уравнений

Добрый день, уважаемые читатели и читательницы, мы с вами продолжаем грызть гранит науки. Делаем мы это с целью — напомню, если кто вдруг успел позабыть — овладеть замечательным математическим пакетом под названием MathCAD. И в прошлый раз мы с вами закончили на решении систем линейных алгебраических уравнений, для простоты также обозначаемых как СЛАУ. Что ж, линейные уравнения — это, конечно же, спору нет, замечательно. Однако на них, к величайшему сожалению многих поколений школьников и студентов, математические задачи далеко не заканчиваются, а даже, я бы сказал, напротив. То есть СЛАУ — это только частный случай систем уравнений, которые могут в обыкновенной вычислительной практике оказаться совсем даже и не линейными, а, напротив, нелинейными (да, именно так их и называют математики). Системы нелинейных уравнений без использования MathCAD или какого-либо другого математического пакета решать обычно не просто трудно, а очень трудно, но в MathCAD подход к ним не слишком отличается от подхода к СЛАУ — в этом вы сейчас получите возможность убедиться лично.

В общем-то, основные аспекты аналитического решения систем уравнений мы с вами уже, по большому счету, обсудили. Когда это мы так лихо успели? А вот именно тогда, когда обсуждали аналитическое решение систем линейных уравнений с помощью оператора solve. Оказывается, все те же методы вполне применимы для решения систем нелинейных уравнений. Тем не менее, чтобы вы лучше их усвоили, повторю еще раз кратко алгоритм их решения с помощью MathCAD’а и приведу небольшой пример решения подобной системы. Давайте попробуем решить следующую систему уравнений: ex + y + z(xyz)1/2 = 0
(x + y+ z)1/2 = c
x +y + cz = 0

Система выглядит несложной, но для того, чтобы решить ее без использования MathCAD’а, даже очень хорошему математику потребуется не такое уж малое количество времени. Естественно, MathCAD с этой системой справится в два счета. Для ее решения создайте матрицу размером 3 на 1 (3 строки, 1 столбец), в которую и поместите уравнения нашей системы. Напомню, что для того, чтобы MathCAD распознавал уравнения как уравнения, знак "равно" нужно нажимать, удерживая клавишу Ctrl. После того, как система будет введена в виде матрицы, найдите на панели Symbolic оператор solve — мы им уже неоднократно пользовались для решения и простых уравнений, и СЛАУ, так что вы, по идее, уже должны были запомнить, где именно он находится. После оператора через запятые укажите переменные, которые входят в нашу систему уравнений — это пусть будут для начала x, y и z. Поскольку при вводе solve с панели Symbolic MathCAD сам добавляет нужную стрелочку для аналитического решения нашей с вами системы уравнений, то больше ничего, в общем-то, делать не нужно — дальше MathCAD будет решать систему. Сколько это времени у него займет, зависит, конечно же, от мощности вашего компьютера, ну и от самой системы. Нашу систему он решит быстро, а вот если поизвращаться и написать какую-нибудь систему тригонометрических и логарифмических уравнений, да еще и с комплексными переменными (о них мы потом еще поговорим отдельно), то решать такое MathCAD может на слабых компьютерах и не один час.

Для чистоты эксперимента поменяем переменные: пусть теперь произвольной константой в нашей системе будет не c, а z. В этом случае нас ожидает совершенно другое, куда как более громоздкое, решение этой самой системы.

Как видите, аналитическое решение систем нелинейных уравнений с помощью MathCAD’а — вещь несложная, только, к сожалению, возможная далеко не всегда. Как обычно, на помощь символьному процессору MathCAD, который опускает в бессилии руки перед сложными системами, спешат численные методы. Вот здесь уже начинаются различия с системами линейных уравнений.

Численное решение нелинейных систем

В целом алгоритм решения систем нелинейных уравнений в MathCAD для пользователя мало чем отличается от него же для СЛАУ. Мы точно так же задаем начальные приближения, пишем "Given", записываем под этим словом наши уравнения и запрягаем функцию Find, которая должна вывести эти самые уравнения на чистую воду. Все точно так же, как тогда, когда мы решали СЛАУ.

Почему же я так пугал вас буквально двумя абзацами выше, говоря о том, что решать системы нелинейных уравнений намного сложнее, чем СЛАУ? Дело в том, что в случае нелинейных уравнений намного сложнее подобрать такие начальные значения, чтобы численное решение сходилось к реальным значениям корней уравнений. Честно говоря, со СЛАУ тоже не всегда все так просто, как я в прошлый раз сказал, однако в крайнем случае можно заставить MathCAD решить СЛАУ аналитически, а затем просто подставить конкретное численное значение какого-нибудь коэффициента. С нелинейными системами такой прием, что называется, "не покатит". Именно поэтому для получения максимального точного решения многих из таких систем придется озадачиться такими вещами, как задание начальных значений для наших переменных.

Первый способ, который я вам предложу, сразу предупреждаю, для людей неленивых. Заключается он в банальном подборе значений переменных собственными руками. То есть для начала берем начальные значения "с потолка" и решаем систему с помощью Find’а. Подставляем значения, выданные этой функцией, в исходные уравнения и смотрим, насколько они похожи на истинные решения. Если уравнения обращаются при подстановке в верные равенства, то все хорошо: либо система была простой, либо в вас дремлет талант подбирателя корней уравнений. Но если равенством после подстановки и близко не пахнет, то придется попотеть. Нужно начать изменять значения начальных приближений для каждой переменной и смотреть, как это отразится на близости выражений, получившихся после подстановки решений в уравнения, к равенствам. Таким нехитрым методом можно за не столь долгое время, как может сначала показаться, добиться хорошего приближения начальных значений к реальным решениям. И, несмотря на явный садомазохистский характер данного метода, он имеет то неоспоримое преимущество, что действует железно на любые системы и любые переменные — было бы терпение.

Zoloto585CPA

Второй метод, который я хочу предложить, этим достоинством не обладает, но зато и не требует от пользователя столь деятельного участия в решении. Думаю, вы сами сможете сформулировать главный его недостаток, если я скажу, что с этим методом мы уже сталкивались, и заключается он в построении графиков для уравнений, входящих в систему. Да, главный недостаток — это сложность в применении к системам уравнений, содержащим более трех переменных. Сложно, сами понимаете, изобразить на мониторе компьютера 25-мерное пространство для отображения решений системы с 25-ю переменными. Но для тех систем, которые содержат две или три переменные, построить график мы вполне сможем. Однако для этого сначала нужно научиться строить графики уравнений.

Построение графиков параметрических кривых

Наиболее простым способом построения графика уравнения в MathCAD’е является параметризация входящих в него переменных друг через друга или через какую-то третью переменную. Что это означает? Поясню на примере. Например, у нас есть уравнение окружности x2 + y2 = 5. Если вы попытаетесь записать функцию f(x, y) = x2 + y2 — 5, а потом построить ее график от x или от y, то вас ожидает разочарование. То, что в итоге выдаст на экран MathCAD, будет так же мало похоже на окружность, как сам MathCAD — на пасьянс "Косынка". Придется придумывать что-то другое. Например, можно подобрать такие функции переменной t, которые, будучи возведенными в квадрат, в сумме тоже дадут пять. Естественно, такими функциями будут тригонометрические — синус и косинус от переменной t, помноженные на корень из пяти. Если мы выразим таким образом x и y через t, то мы параметризуем наше уравнение и уже сможем успешно построить график x(t) от y(t) или же y(t) от x(t) — впрочем, в данном случае в силу симметричности это будет уже не столь важно.

Для того, чтобы решить систему уравнений, нужно просто подобным образом параметризовать и второе уравнение. Вполне возможно, что, как и в нашем примере, оно вполне подойдет для того, чтобы банально выразить x через y или наоборот, после чего построение графика окажется особенно простым (см. соответствующий скриншот). Для нахождения начальных приближений достаточно воспользоваться уже знакомой нам с вами трассировкой — само собой, решением будет точка пересечения двух кривых на уравнении. Для того, чтобы получить более точное значение решения, чем предлагает нам трассировка, нужно, конечно же, подставить полученные с ее помощью координаты точки пересечения графиков в численное решение системы перед Given’ом. Последний скриншот иллюстрирует, что графики мы с вами построили правильно, и с его помощью действительно намного легче искать решение системы двух исходных уравнений. А легче хотя бы уже просто потому, что видно, какого количества корней мы вправе ожидать от нашей системы.

Но работа с трехмерными графиками в MathCAD’е не так проста, как с двумерными, поскольку и сама по себе поверхность — более сложный объект, чем кривая. С поверхностями можно ожидать немалого количества не самого приятного рода сюрпризов, так что лучше о них поговорить более подробно. Этим мы с вами и займемся в следующей статье из цикла о MathCAD’е.

SF, spaceflyer&#64;tut.by

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

Как можно решить нелинейное уравнение в mathcad

Примеры решения нелинейных алгебраических уравнений

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

1. Метод деления отрезка пополам не имеет итерационной формулы, что приводит к наиболее сложному программному коду. Достоинство метода в том, что он безусловно сходится, если на заданном участке есть хотя бы один корень. Программный блок, реализующий метод деления отрезка пополам для поиска корня на интервале [a0, b0], может иметь вид:

2. Метод Ньютона (касательных) предполагает вычисление производной. Если левая часть решаемого уравнения задана аналитически функцией f (x), то производную можно вычислить средствами Mathcad, например:


Тогда программный код, реализующий метод Ньютона (касательных), может иметь вид:

3. В методе секущих проводится не касательная к функции f (x), а секущая через две точки до пересечения с осью абсцисс, поэтому требуется задание двух начальных приближений к корню:

4. Вариант простейшего программного кода, реализующего метод простой итерации с параметром:

5. Использование встроенной функции root для поиска приближенного значения корня уравнения f (x) = 0 предполагает оформление вычисления f (x) в виде функции, задание некоторого приближения и вызов стандартной функции root .

Параметры root – функция, вычисляющая f (x), и начальное приближение x. В качестве дополнительных параметров можно указать границы диапазона, в котором определяется корень.

6. Компактно оформить поиск решения уравнения можно, используя ключевое слово solve (вычислить) из панели "Символика". Solve имеет два поля–заполнителя:

В левом поле помещается выражение (в нашем случае функция f (x)), а в правом – имя аргумента, значение которого необходимо найти.

7. Не следует забывать о возможности приближенного решения алгебраических уравнений и систем с помощью функции Find .

Для численного решения задается некоторое начальное приближение для корня; решаемое уравнение в произвольной форме с использованием символа "равно" (Ctrl/=) помещается в блок Given , а затем вызывается функция Find для поиска корня.

Zoloto585CPA

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *