Уравнения и системы уравнений
Многие математические задачи сводятся к решению в общем случае нелинейных уравнений вида f(x) = 0 или f(x) = expr. В системе Mathematica они обозначаются как eqns (от слова equations — уравнения). Разумеется, могут решаться и системы, состоящие из ряда таких уравнений. Для решения уравнений (как одиночных, так и систем) в численном и символьном виде Mathematica имеет функцию Solve:
- Solve [eqns, vars] — предпринимает попытку решить уравнение или систему уравнений eqns относительно переменных vars;
- Solve [eqns, vars, elims] — пытается решать уравнения eqns по переменным vars, исключая переменные elims.
Рис. 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 можно использовать ряд опций. Их можно вывести командой Options [Solve]. Ниже описано их назначение:
- InverseFunctions — указывает, следует ли использовать обратные функции;
- MakeRules — указывает, должен ли результат быть представлен как объект AlgebraicRulesData;
- Method — устанавливает алгоритм, используемый для вычисления результата (возможны методы 1, 2 и 3);
- Mode — задает характер решения уравнения (возможны Generic, Modular и Rational);
- Sort — устанавливает, нужна ли сортировка результатов;
- Verif ySolutions — устанавливает, следует ли проводить проверку полученных решений и удаление посторонних решений;
- WorkingPrecision — устанавливает число цифр промежуточных вычислений (по умолчанию Infinity).
Рис. 4.15. Примеры решения уравнений с опцией InverseFunction
То, насколько может влиять на решение опция Method, наглядно показывают примеры, представленные на рис. 4.16.
Рис. 4.16. Примеры решения уравнений разными методами
Множество примеров решения систем нелинейных уравнений в символьном виде можно найти в справочной системе Mathematica. Многие нелинейные уравнения и системы нелинейных уравнений в принципе не имеют аналитических решений. Однако их решение вполне возможно численными методами. Для численного решения систем нелинейных уравнений используется функция NSolve:- NSolve [eqns, vars] — пытается численно решить одно уравнение или систему уравнений eqns относительно переменных vars;
- NSolve [eqns, vars, elims] — пытается численно решить уравнения eqns относительно vars, исключая переменные elims.
Ри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. Примеры применения дополнительных функций для решения уравнений
В целом надо отметить, что система 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 } .
|