Иллюстрированный самоучитель по Mathematica
Уравнения и системы уравнений
Решение уравнений
Многие математические
задачи сводятся к решению в общем случае нелинейных уравнений вида f(x) =
0 или f(x) = expr.
В системе
Mathematica они обозначаются как eqns (от слова equations — уравнения). Разумеется,
могут решаться и системы, состоящие из ряда таких уравнений.
Для решения
уравнений (как одиночных, так и систем) в численном и символьном виде Mathematica
имеет функцию Solve:
-
Solve [eqns, vars]
— предпринимает попытку решить уравнение или систему уравнений eqns относительно
переменных vars;
-
Solve [eqns, vars,
elims] — пытается решать уравнения eqns по переменным
vars, исключая переменные elims.
Входные параметры
этой функции могут быть представлены списками или записаны выражениями через
объединительный знак«&&». В eqns в качестве знака равенства
используется знак «= =». Примеры применения функции Solve представлены
на рис. 4.12.
Рис.
4.12.
Примеры решения уравнений
Обратите
внимание на то, что в определенных ситуациях система подсказывает тонкости решения,
выдавая предупреждающие сообщения. Если такие ситуации не являются ошибками,
препятствующими решению, то полученное решение выводится в ячейку вывода.
Решение систем нелинейных уравнений в символьном виде
Приведенные
на рис. 4.13 примеры показывают решение систем нелинейных уравнений с помощью
функции Solve.
Достаточно
характерен пример с применением функции N. Если убрать в нем функцию
N, то будет
получен чрезвычайно громоздкий, хотя и точный результат (проверьте это сами,
поскольку размеры результата делают нецелесообразным его приведение в книге).
Функция N осуществляет выполнение всех промежуточных вычислений, благодаря чему
результат получается вполне обозримым и представленным в комплексных числах.
В последнем
примере рис. 4.13 получен набор из пяти пар корней, определенных через функцию
Root. Эта функция, в свою очередь, означает вычисление корней полиномиального
уравнения пятой степени. Данный пример, как и ранее приводимые решения кубического
уравнения, является наглядной иллюстрацией того, что простота нелинейных уравнений
порой оказывается весьма обманчивой, а их решение порой приводит к весьма громоздким
и сложным результатам. Тем не менее, возможность решения отдельных нелинейных
уравнений и их систем в символьном виде трудно переоценить. К сожалению, далеко
не все уравнения имеют такие решения — многие можно решать только в численном
виде.
Рис.
4.13.
Примеры решения систем нелинейных уравнений
Не следует
полагать, что Mathematica всегда выдает верное решение систем нелинейных
уравнений. На самом деле решение иногда бывает ошибочным. Поэтому в большинстве
случаев стоит оформлять решение таким образом, чтобы обеспечить его проверку.
Для этого рекомендуется отдельно задать систему уравнений и результат решения.
Тогда проверка легко осуществляется с помощью подстановки. Два примера решения
систем уравнений с проверкой решений показаны на рис. 4.14.
В первом
примере решение кажется очевидным (равенства выполняются, например, при х=2
и у=3). Однако здесь Mathematica дает сразу три пары решений, и все они оказываются
верны, поскольку после подстановки проверка всех равенств возвращает
True.
А вот во
втором примере проверка дала не совсем обычный результат, что связано с наличием
в решении неопределенной переменной а. В таких случаях стоит попробовать упростить
решение с помощью функции Simplify, что и показано на рис. 4.14.
Рис.
4.14.
Примеры решения уравнений с проверкой
Опции функции Solve
С функцией
Solve можно использовать ряд опций. Их можно вывести командой Options
[Solve].
Ниже описано их назначение:
-
InverseFunctions —
указывает, следует ли использовать обратные функции;
-
MakeRules — указывает,
должен ли результат быть представлен как объект
AlgebraicRulesData;
-
Method — устанавливает
алгоритм, используемый для вычисления результата (возможны методы 1, 2 и 3);
-
Mode — задает характер
решения уравнения (возможны Generic, Modular и
Rational);
-
Sort — устанавливает,
нужна ли сортировка результатов;
-
Verif ySolutions —
устанавливает, следует ли проводить проверку полученных решений и удаление
посторонних решений;
-
WorkingPrecision —
устанавливает число цифр промежуточных вычислений (по умолчанию
Infinity).
На рис. 4.15
приведены примеры применения функции Solve с опцией
Inverse-Functions.
Обратите
внимание на то, что последняя система уравнений при отсутствии опции InverseFunctions
решается с предупреждением. Она вообще не решается, если эта опция задана как
False, и гладко решается при InverseFunctions
->
True.
Рис.
4.15.
Примеры решения уравнений с опцией InverseFunction
То, насколько
может влиять на решение опция Method, наглядно показывают примеры, представленные
на рис. 4.16.
Рис.
4.16.
Примеры решения уравнений разными методами
Множество
примеров решения систем нелинейных уравнений в символьном виде можно найти в
справочной системе Mathematica.
Численное решение уравнений
Многие нелинейные
уравнения и системы нелинейных уравнений в принципе не имеют аналитических решений.
Однако их решение вполне возможно численными методами. Для численного решения
систем нелинейных уравнений используется функция
NSolve:
-
NSolve [eqns, vars]
— пытается численно решить одно уравнение или систему уравнений eqns относительно
переменных vars;
-
NSolve [eqns, vars,
elims] — пытается численно решить уравнения eqns относительно
vars, исключая
переменные elims.
С этой функцией
используется единственная опция WorkingPrecision, задающая число верных цифр
результата — по умолчанию 16. На рис. 4.17 представлены примеры использования
функции NSolve для численного решения уравнений.
Риc.
4.17.
Примеры численного решения уравнений
Результаты
решения с помощью функции NSolve также рекомендуется проверять с помощью подстановки,
например, так:
е=2*х^2
+ 5*х- 15 == х^3
-15 + 5х + 2х2
==х3
r=NSolve[e,x]
{{х->-2.4734},
{х->2.2367-1.03038i},
{х->2.2367
+ 1.03038i}}
е/.r
{True, True,
True}
Нетрудно
заметить, что в данном случае решение верно.
Поиск корней уравнений
Для вычисления
корней полиномиальных уравнений используется функция
Roots:
Roots[lhs==rhs,
var]
На рис. 4.18
представлены примеры применения функции
Roots.
Рис.
4.18.
Примеры использования функции Roots
Формат выдачи
результатов для функции Roots отличается от такового для функции
Solve. Поэтому
проверку решения подстановкой надо выполнять как в следующем примере:
e
= x^2+3x==2
Зх + х2
== 2
N[Roots[e, x]]
х == -3.56155
| | х == 0.561553
r= {ToRules[%]}
{{х^-3.56155},
{х^ 0.561553}}
е/. r
{True, True}
Для преобразования
результата вычислений в список решений (подобный решениям, получаемым с помощью
функции Solve) здесь использована функция
ToRules.
При затруднениях
в решении уравнений с помощью функции Roots можно использовать следующие опции:
Options[Roots]
{Cubics ->
True, Eliminate -> False, EquatedTo-> Null,
Modulus ->
0, Multiplicity->1, Quar tics -> True, Using -> True}
Ниже они
описаны подробно:
-
Cubics — указывает,
следует ли искать явные решения для неприводимых кубических уравнений;
-
EquatedTo — задает
выражение для замещения переменной в решении;
-
Modulus — задает промежуточную
факторизацию полинома;
-
Multiplicity— устанавливает
кратность каждого из корней в конечном результате;
-
Quartics — задает точное
решение квадратного уравнения и полинома четвертой степени;
-
Using — указывает
какие-либо дополнительные уравнения, которые следует использовать для решения
уравнений.
Применение
опций нередко позволяет получать решения, которые не удаются с первого раза.
Однако это требует определенного опыта и понимания сути решаемой задачи.
Дополнительные функции для решения уравнений
Имеется также
ряд дополнительных функций, которые используются описанными ранее функциями
и также могут применяться при решении нелинейных уравнений:
-
Auxiliary [v] — применяется
модулем Solve для указания того, что переменная v должна использоваться функцией
Roots для результирующих решений, но соответствующие значения v не должны
быть включены в окончательный ответ;
-
Eliminate [eqns,
vars]
— исключает переменные vars из системы уравнений
eqns;
-
FindRoot [Ihs == rhs,
{x, x0}] — ищет численное решение уравнения Ihs ==
rhs, начиная с х = x0;
-
MainSolve [eqns] —
основная функция для преобразования системы уравнений. Ее вызывают Solve и
Eliminate. Уравнения должны быть представлены в форме Ihs ==
rhs. Они могут
объединяться с помощью && и | |. MainSolve возвращает
False, если
не существует решения уравнений, и возвращает
True, если все значения переменных
являются решениями. MainSolve перестраивает уравнения, применяя определенные
директивы;
-
MainSolve [eqns,
vars, elim, rest] — пытается перестраивать уравнения eqns так, чтобы найти решения
для переменных vars и исключить переменные
elim. Список rest может включаться
для указания порядка исключения любых остальных переменных;
-
NRoots [lhs==rhs,
var] — возвращает список численных приближений корней полиномиального уравнения;
-
Residue [ехрr, {х,
х0 } ] — ищет вычет ехрг в точке х = х0;
-
SolveAlways [eqns,
vars] — возвращает значения параметров, которые превращают уравнения eqns
в тождества для всех значений переменных
vars.
Примеры использования
некоторых из этих функций показаны на рис. 4.19.
Рис.
4.19.
Примеры применения дополнительных функций для решения уравнений
В целом надо
отметить, что система Mathematica обладает обширными средствами для решения
уравнений и их систем. Умение их применять — залог правильного и эффективного
решения сложных математических задач, относящихся к классу решения уравнений.
Графическая иллюстрация и выбор метода решения уравнений
При рассмотрении
приведенных выше примеров может сложиться благодушное впечатление о том, что
решение нелинейных уравнений может производиться автоматически и без размышлений.
Но это далеко не так — представленные выше примеры просто подобраны так, что
они имеют решение с помощью соответствующих функций.
На самом
деле порой даже простые уравнения могут не иметь решения. В сложных случаях
очень полезна графическая визуализация решения. В качестве примера на рис. 4.20
показана визуализация вычисления корней квадратного уравнения. В данном случае
график функции явно указывает на существование двух действительных корней при
х, близких к 0.2 и 2.3. Функция Nsolve без труда находит оба корня.
Рис.
4.20.
Визуализация решения квадратного уравнения для случая двух
действительных корней
А вот на
рис. 4.21 показан случай, когда из-за изменения последнего члена квадратичной
функции ее график уже не пересекает ось х вообще. Это говорит о том,
что решения в виде действительных корней нет. И в самом деле, NSolve находит
корни как комплексно-сопряженные числа. Действительная часть найденных корней
дает координату х для впадины кривой — параболы.
Если требуется
решение равенства f1(х) = f
2
(x), то для графической визуализации
решения можно построить графики функций f1(х)
и f
2
(лг) — наличие
точек их пересечения будет означать существование действительных корней. Этот
случай иллюстрирует рис. 4.22. В данном случае проблем с решением нет, поскольку,
по существу, решается квадратное уравнение.
Рис.
4.21.
Визуализация решения квадратного уравнения для случая двух
комплексных корней
Рис.
4.22.
Пример визуализации решения уравнения вида
f(x) = 5х + 1
Но вот на
рис. 4.23 показан случай решения уравнения f(x)
= ехр(х/2). Графики функций
ясно показывают, что парабола пересекается экспонентой в двух точках. Однако
функция NSolve отказывается решать такое уравнение и выдает сообщение о том,
что оно является трансцендентным.
Таким образом,
в данном случае наличие графического решения говорит о необходимости смены функции,
с помощью которой до сих пор решались уравнения. Подходящей в данном случае
является функция FindRoot, которая отыскивает
одно решение
вблизи заданной начальной точки. Применив ее дважды, нетрудно получить оба корня
данного уравнения.
Рис.
4.23.
Пример решения уравнения вида f(x) = ехр(х/2)
Приведенные
примеры далеко не исчерпывают проблему графической визуализации решения и выбора
методов решения. Однако они иллюстрируют возможности системы Mathematica в этой
области и заостряют внимание на потенциальных проблемах. Для реализации численных
расчетов в системе Mathematica отобраны наилучшие и наиболее эффективные численные
методы из описанных в литературе, в том числе в отечественной.
Получение сразу нескольких корней
Многие уравнения
с тригонометрическими функциями могут иметь периодические или близкие к ним
решения. К сожалению, функции Mathematica, вычисляющие корни уравнений, не способны
в этом случае дать сразу несколько корней. Однако ситуация тут далеко не безнадежна
— приведенный ниже пример наглядно показывает это.
Пусть требуется
в интервале изменения х от 0 до 20 найти все решения уравнения
х sin(x) + х/2
- 1 =
0
График функции,
представляющей левую часть уравнения, показан на рис. 4.24. Хорошо видно, что
он пересекает ось х семь раз, то есть имеет в интересующем нас диапазоне
семь корней.
Рис.
4.24.
График функции х sin(x) + х/2 - 1 и пример вычисления всех
ее корней в интервале изменения х от 0 до 20
Колебательная
составляющая функции обусловлена входящей в нее функцией
sin(x), которая имеет
нули в точках 0, n, 2n, Зn... Однако, как видно из рис. 4.24, эти значения
лишь приближенные, ввиду влияния других членов уравнения.
Ключевая
идея получения всех корней уравнения заключается в поиске нужных решений с помощью
функции FindRoot, которой последовательно подставляются различные начальные
приближения. Однако вместо уже испытанного приема — поиска корней поодиночке
— можно воспользоваться «таблицей» решений, используя функцию
Table.
Решение, приведенное под графиком функции на рис. 4.24, наглядно иллюстрирует
возможности этого приема — найдены (или, вернее, уточнены) все семь корней исходного
уравнения.
Получение неизвестных в явном виде
Читатель,
возможно, обратил внимание на то, что решения всех представленных выше примеров
выглядят не совсем обычно — в виде списка подстановок. Это не позволяет использовать
неизвестные в явном виде, например, для проверки решений или передачи найденных
неизвестных в последующие вычислительные блоки. Однако от этого затруднения
легко избавиться, если перед конструкций блока решения использовать выражение
следующего вида:
{х,у,z,...}/.
Список переменных
в этом выражении должен однозначно соответствовать списку неизвестных системы
уравнений. Покажем этот прием в действии. Ниже приведено решение системы из
трех нелинейных уравнений:
FindRoot[{x-2==9,y^2=16,x+y+z==10},{x,l.},{y,l.},{z,l.}]
(Х-> 3.,
у-> 4., z->3.} {x,y,z}
{X, у, 2}
Обратите
внимание на то, что вывод списка {х, у, z } не дает полученных значений неизвестных.
Это связано с тем, что переменные в блоке решения имеют ло-к(1лъный
характер
и за пределами блока их значения (в том числе неопределенные) сохранятся такими,
какими они были до применения в блоке решения.
Теперь зададим
решение в ином виде:
{x,y,z}/.FindRoot[{x*2==9,
уА2==1б, x+y+z==10}, {x,l.}, {у,1.}, {z,l.}]
{3., 4., 3.}
Как видите,
на сей раз решение получено в виде списка с числами — явными значениями неизвестных.
Можно обозначить их как а, Ь и с, получить список {а,
b, с} и даже использовать
их отдельно:
{а,b,с}=%
(З.,4.,3.)
а,b,с
{З.,4.,3.}
а
3.
b
4.
с
3.
Теперь можно
проверить решение данной системы:
{а^2, b^2,а+b+с}
{9., 16., 10.}
Полученный
вектор правых частей системы совпадает с заданным, что свидетельствует о правильности
решения. Разумеется, вместо нового списка { а , b , с } для вектора решения
можно было использовать и вектор { х, у, z } .