Основы работы в системе компьютерной алгебры Mathematica

Уравнения. Системы уравнений

Разбить на страницы
Показывать лекцию целиком

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

8.0. Введение

Доступ к множеству оригинальных алгоритмов при помощи встроенных функций, широчайшие возможности символьного и графического представления результатов делают Mathematica эффективным инструментом аналитического и численного решения уравнений. В данной лекции мы познакомимся с основными функциями Mathematica, применяемыми для нахождения решений алгебраических, трансцендентных и дифференциальных уравнений, а также систем уравнений. В этом нам помогут книги Е. М. Воробьёва [1] и А.Н. Прокопени [5].

8.1. Нахождение символьных решений алгебраических и трансцендентных уравнений

Наиболее часто используемая функция для решений уравнений — Solve. Она позволяет находить решения полиномиальных уравнений вплоть до чётвёртого порядка, некоторых полиномиальных уравнений высших порядков, а также неполиномииальных уравнений (А. Н. Прокопеня и А. В. Чичурин [5, с. 28]). В простейшем случае для решения одного уравнения lhs==rhs (lhs и rhs — левая и правая части уравнения, соответственно) с одной неизвестной var функция задаётся в виде Solve[lhs==rhs,var] (пример In[1] на рис. 8.1). Корни уравнения выдаются в виде вложенного списка правил замены в виде подстановок (см. Out[1])

Для того чтобы решить при помощи этой функции систему уравнений, нужно задать оба обязательных аргумента в виде списков уравнений и переменных, т. е., записать функцию как Solve[{lhs1==rhs1,lhs2==rhs2,...},{var1,var2,...}]. Уравнения также можно отделять друг от друга логическим оператором (логическим умножением).

В примере In[2] на рис. 8.1 мы решили систему уравнений. Обратим внимание на то, в каком виде мы получаем корни системы. В Out[2] мы получаем вложенный список, элементами которого являются одномерные списки. Каждый одномерный список в качестве элементов содержит пару корней системы уравнений.

Для того чтобы была возможность в дальнейшем производить манипуляции с корнями уравнения или системы уравнений, следует от вложенного списка правил преобразований перейти к одномерному списку корней уравнения или системы уравнений. Делается это при помощи уже известного нам оператора " /. ". Так в примере In[3] на рис. 8.1 мы присвоили выражению xroots список корней системы уравнений в In[2] для переменной x.

Обратиться к конкретному корню уравнения или системы уравнений теперь можно, пользуясь навыками работы со списками. Так в примере In[4] на рис. 8.1 мы вывели на экран первое правило подстановки из списка, полученного в результате решения уравнения In[2], а в In[5] — второй в списке набор корней этого же уравнения с учётом преобразования In[3].

(рис 8.1) Решение алгебраических уравнений при помощи функции Solve

Если Mathematica не может представить решение полиномиального уравнения в аналитическом виде, например, в случае, если полином в уравнении имеет степень выше четвёртой, то корни таких уравнений представляются программой при помощи Root-объектов (А. Н. Прокопеня и А. В. Чичурин [5, с. 29]). Такой объект в виде Root[f,k] представляет точное значении корня с номером k полиномиального уравнения f[x]==0. Пример полученных в таком виде решений — Out[1] на рис. 8.2.

В примере In[1] на рис. 8.2 мы находили решение уравнения, заданного в общем виде. Если все коэффициенты уравнения имеют численные значения (как в примере In[2]), то получить численные значения корней не составляет труда при помощи функции N — пример In[3].

(рис 8.2) Представление корней уравнений в виде Root-объектов

В предыдущих примерах обсуждались возможности функции Solve применительно к алгебраическим уравнениям. В примере In[1] на рис. 8.3 мы попробовали решить с её помощью трансцендентное уравнение $$Cos[a*x]==a$$ относительно переменной x. Понятие трансцендентного уравнения в Mathematica ничем не отличается от его понятия в математике: Трансцендентное уравнение — уравнение, не являющееся алгебраическим. Обычно это уравнения, содержащие показательные, логарифмические, тригонометрические, обратные тригонометрические и др. функции.

Как мы видим в Out[1] на рис. 8.3, для нашего трансцендентного уравнения Mathematica также сумела найти корень. Мы знаем, что на самом деле такое уравнение имеет бесконечное число корней, отличающихся на $$2*\pi$$. Знает это и Mathematica: поэтому она выдаёт сообщение о том, что помимо найденного ей могут существовать и другие корни уравнения.

Однако в ряде случаев Mathematica оказывается бессильной найти корни трансцендентного уравнения в символьном виде. Тогда она выдаёт сообщение, в котором честно признаётся в своём бессилии и рекомендует попробовать решить уравнение неалгебраическими (численными) методами (см. пример In[2] на рис. 8.3).

Подробней о функции Solve и её возможностях см. книги Е. М. Воробьёва [1, с. 45–50] и А. Н. Прокопени и А. В. Чичурина [5, с. 28–29].

(рис 8.3) Решение трансцендентных уравнений при помощи функции Solve

Ещё одна функция нахождения корней уравнения или системы уравнений является функция FindInstance. Заданная в простейшем виде FindInstance[syseqns,vars] функция находит один набор значений переменных vars, при которых уравнения системы syseqns становятся верными тождествами (пример In[1] на рис. 8.4). Помимо уравнений функция умеет находить и отдельные решения неравенств. В расширенном виде с дополнительным аргументом функция FindInstance[syseqns,vars,dom] выбирает только те выражения, которые принадлежат к типу данных dom. Выражение Integers задаёт целочисленные данные, Complexes — комплексные. А вот с выражением Reals всё не так однозначно. Если в исходном уравнении все численные коэффициенты заданы точно, то функция FindInstance с аргументом Reals всё равно будет стараться искать точные решения неравенства или корни уравнения: отличие от Integers состоит в том, что под этот критерий подпадают рациональные выражения и комбинации целочисленных и рациональных выражений — ср. результаты вычисления In[2] и In[3]. Приближённые результаты (в виде вещественных чисел) функция FindInstance вернёт, если хотя бы один коэффициент исходного уравнения или неравенства был задан приближённо.

Функция в виде FindInstance[syseqns,vars,dom,n] находит n или менее наборов значений vars, принадлежащих к типу данных dom (примеры In[4] и In[5] на рис. 8.4). Аргумент dom может быть опущен (пример In[6]).

Безусловно, FindInstance не может найти больше корней, чем их на самом деле имеет уравнение. Так количество корней полиномиальных уравнений не может превышать наибольшей степени переменной в этих уравнениях. В примере In[7] на рис. 8.4 мы пытаемся заставить Mathematica найти пять корней квадратного уравнения, хотя знаем, что их всего два. Только эти два корня сумела отыскать и Mathematica — см. Out[7].

Функция FindInstance также может представлять результат вычисления в виде Root-объектов (пример In[8] на рис. 8.4).

(рис 8.4) Нахождение считанного числа корней уравнений, систем уравнений, решений неравенств и систем неравенств при помощи функции FindInstance

Один из методов решения систем алгебраических уравнений некомпьютерными методами, вручную, заключается в поэтапном представлении одной переменной через другие: при этом уменьшается и количество уравнений, и количество переменных. Для реализации подобной процедуры служит функция Eliminate. Задаётся она в единственной форме Eliminate[syseqns,vars] и исключает переменные vars из системы уравнений syseqns путём их выражения через оставшиеся переменные (примеры In[1] и In[2] на рис. 8.5). Результатом действия функции Eliminate может являться уравнение (см. Out[2]) или система уравнений (Out[1]) в зависимости от количества уравнений в первом аргументе syseqns и количества переменных во втором vars.

Если система уравнений syseqns имеет решение, то функция Eliminate[syseqns,vars] возвращает True, если в списке переменных vars, которые следует исключить, указать все переменные системы syseqns — пример In[3] на рис. 8.5. Если система не имеет решений вовсе, то независимо от количества переменных в аргументе vars функция Eliminate будет возвращать False — примеры In[4] и In[5].

Подробней о функции Eliminate см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 30].

(рис 8.5) Исключение переменных из системы уравнений при помощи функции Eliminate

По поводу полученных при помощи функции Solve решений Е. М. Воробьёв [1, с. 49–50] пишет следующее: "Функция Solve находит решения уравнений, трактуя их "в общем положении", т.е. для неспецифических значений входящих в уравнения символьных параметров". Иллюстрацию этого утверждения мы находим в Out[1] на рис. 8.1: очевидно, что оба выражения для корней не имеют смысла при a=0. Выход из сложившейся ситуации предлагают А.Н. Прокопеня и А. В. Чичурин [5, с. 30]: "Если уравнение или система уравнений содержит параметры, причём решение существует не при любых значениях параметров, то для решения системы удобно использовать функцию Reduce. В этом случае результат получается в виде набора уравнений, который содержит все возможные решения, включая дополнительные условия на параметры". Заданная в простейшем виде функция Reduce[syseqns,vars] ищет решения в общем виде независимо от потенциальной принадлежности решений к тому или иному типу численных данных (примеры In[1] и In[2] на рис. 8.6). Добавление третьего аргумента dom производит тот же эффект, что и в случае функции FindInstance: Reduce[syseqns,vars,dom] выбирает только решения, принадлежащие к типу данных dom; выражение dom может принимать значении Integers, Reals и Complexes (пример In[3]).

Если в результате выполнения функции Reduce был получен набор из нескольких уравнений, то обратиться к конкретному уравнению оказывается возможным тем же методом, который используется при работе с функцией Solve — при помощи двойных скобок [[]]. В примере In[4] на рис. 8.6 мы обращаемся ко второму уравнению, полученному в результате вычисления In[2].

Кроме того, Reduce позволяет решать параметрически заданные неравенства, системы неравенств и системы неравенств и уравнений (пример In[5] на рис. 8.6).

(рис 8.6) Нахождение корней параметрических выражений при помощи функции Reduce

Ещё одна функция для работы с параметрическими уравнениями — SolveAlways: она находит значение параметров, при которых уравнения системы удовлетворяются при любых значениях переменных. Задаётся она также с двумя обязательными аргументами: уравнением или системой уравнений и переменной или списком переменных — SolveAlways[syseqns,vars]. Примеры использования функции см. на рис. 8.7.

(рис 8.7) Нахождение универсальных значений параметров для превращения уравнения в тождество при помощи функции SolveAlways

Во многих случаях на практике, если в процессе работы возникла необходимость решить систему линейных уравнений, часто оказывается, что задана не сама система, а матрица её коэффициентов. Если система уравнений задана в матричной форме m x=b, где m — квадратная матрица коэффициентов, а x и b — векторы переменных и свободных членов уравнений системы в правой части, соответственно, решить её можно при помощи функции LinearSolve[m,b] [5, с. 31] — примеры на рис. 8.8. Как пишет Е. М. Воробьёв [1, с. 51]: "Функция LinearSolve наиболее эффективна в случае систем большой размерности с разреженными матрицами коэффициентов".

Подробней о функциях SolveAlways и LinearSolve см. книги Е. М. Воробьёва [1, с. 50–51] и А. Н. Прокопени и А. В. Чичурина [5, с. 31].

(рис 8.8) Решение систем линейных уравнений, заданных в матричной форме при помощи функции LinearSolve

8.2. Нахождение численных решений алгебраических и трансцендентных уравнений

Если Mathematica не может в аналитическом виде найти корни уравнений или систем уравнений, например, в случае полиномиальных уравнений 5-го и выше порядков, некоторых трансцендентных уравнений, можно попробовать найти решение численными методами.

Для численного решения полиномиальных уравнений в Mathematica имеется функция NSolve. Задаётся функция точно так же, как и функция Solve: имеет два обязательных аргумента, первый из которых представляет собой уравнение или систему уравнений, а второй — переменную или перечень переменных. В примере In[1] на рис. 8.9 попробуем численно решить уравнение, которое мы пытались аналитически решить в примере In[2] на рис. 8.2. В Out[1] мы видим, что корни успешно найдены. Безусловно, найти корни уравнение или систему уравнений в явном виде численным методом можно лишь в случае, если все коэффициенты при переменных заданы как численные данные. Если хоть один коэффициент задан в ином виде, например, в символьном, то в решении мы получим либо корни в аналитическом виде (пример In[2]), либо в виде уже знакомых нам Root-объектов (пример In[3]). Как только символьный коэффициент приобретёт численное значение, корни уравнений или системы уравнений сразу могут быть представлены в численном виде (пример In[4]).

Подробней о функции NSolve см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 18–19].

(рис 8.9) Нахождение численных решений алгебраических уравнений при помощи функции NSolve

Функция NSolve эффективно работает с полиномиальными уравнениями и системами уравнений. Если же уравнения содержат более замысловатые математические функции, то какой-то специальной процедуры нахождения всех решений даже численными методами не существует. В этом случае используется функция FindRoot: но она находит только один корень. В общем виде функция задаётся как FindRoot[{eqn1,eqn2,...},{{var1,varstart1},{var2,varstart2},...}], где eqn1,eqn2,... — система уравнений, var1,var2,...— переменные, varstart1,varstart2,... — начальное приближение к решению, от которого Mathematica начинает поиск истинного решения. В примере In[1] на рис. 8.10 при помощи функции FindRoot мы нашли корень уравнения из In[2] на рис. 8.3, которое не смогли решить аналитически.

Функция FindRoot также может представлять результат вычисления в виде Root-объектов.

Для нахождения корня уравнения или системы уравнений функция FindRoot проводит поиск итерационным методом касательных, с каждой итерацией приближаясь к истинному значению корня. Заданное по умолчанию число итераций равняется 100. Однако для некоторых уравнений, а также в зависимости от заданной нами начальной точки поиска этого числа не хватает для достаточно точного, по мнению Mathematica, нахождения корней (пример In[2] на рис. 8.10). Иное число итераций можно задать при помощи опции MaxIterations (пример In[3] на рис. 8.10).

О функции FindRoot см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 19–20].

(рис 8.10) Нахождение корня уравнения при помощи функции FindRoot

Как мы видим из сказанного выше, возможности Mathematica в решении уравнений небезграничны. Даже численными методами для некоторых уравнений одномоментно можно найти только один корень. Пользуясь для этого функцией FindRoot, следует из некоторых соображений самостоятельно вручную задавать точку для начала поиска корней. А некоторые уравнения и вовсе могут не иметь корней, и для их нахождения будет впустую потрачено машинное время и ресурсы. Чтобы при проведении расчётов хоть как-то гарантировать нахождение корня при их наличии или сэкономить силы и время, не тратя их на поиски корней, если их вовсе нет, прибегают к мощнейшему средству Mathematica для представления данных — графике. Графическому решению уравнений много внимания уделено в книге В. П. Дьяконова [2, с. 258–262]. В настоящем курсе мы познакомимся с сутью и основными принципами этого метода.

Пусть мы хотим найти решение трансцендентного уравнения $$x*Sin[3*x]==2$$, причём нас интересуют только x, принадлежащие отрезку от 0 до 6. Для этого сначала мы строим на одном графике левую и правую части уравнения в зависимости от x в указанных пределах при помощи функции Plot (пример In[1] на рис. 8.11). Как видно на рисунке в Out[2], графики имеют 4 пересечения, а уравнение, соответственно, 4 корня, причём приблизительное положение этих корней мы также можем определить из графика. Теперь, задавая эти приблизительные координаты в качестве исходных точек для нахождения корней, мы находим сами корни при помощи функции FindRoot — см. пример In[2]. В данном примере, используя цикл Do (с циклами мы познакомимся в лекции настоящего курса, посвящённой процедурному программированию), мы выводили на экран при помощи функции Print результат выполнения функции FindRoot, меняя каждый раз значение исходной точки поиска i.

Приведём ещё один пример. Пусть у нас возникла необходимость решить уравнение $$Cos[x]+Sin[2*x]==(x-3)^2+1$$ относительно x из отрезка от -10 до 10. Действуем по тому же алгоритму. Сначала визуализируем тригонометрическую $$Cos[x]+Sin[2*x]$$ и параболическую $$(x-3)^2+1$$ зависимости от переменной x (пример In[3] на рис. 8.11). Как мы видим на рисунке в Out[3], кривые не имеют ни одного пересечения в интересующей нас области и, ввиду периодичности первой функции и принципиального нахождения выше уровня $$f=3$$ второй, они не имеют пересечений вовсе. Соответственно, и уравнение не будет иметь корней: искать их не имеет смысла. Если же мы всё же попытаемся найти корни уравнения при помощи функции FindRoot (пример In[4]), Mathematica выдаст сообщение о том, что при заданных значениях точности и разрядности не может найти удовлетворительного решения и рекомендует повысить точность вычислений (хотя, мы уже знаем, что никакого результата это не даст).

(рис 8.11) Применение графических средств для нахождения корней уравнений численными методами

8.3. Нахождение символьных решений дифференциальных уравнений

Для символьного решения дифференциальных уравнений в Mathematica имеется функция DSolve. С её помощью решаются следующие типы уравнений:

  • обыкновенные дифференциальные уравнения (ОДЕ) и системы уравнений. ОДУ содержат одну независимую переменную и одну или больше зависимых переменных;
  • дифференциальные уравнения в частных производных (ДУЧП) и системы уравнений. ДУЧП содержат две или более независимые переменные и одну или больше зависимых переменных;
  • системы дифференциально-алгебраические уравнения (ДАУ). Часть уравнений системы является дифференциальными, другая часть — алгебраическими.
  • Формат обращение к функции DSolve для решения дифференциального уравнения следующий: DSolve[eqn,f[t],t], где eqn — дифференциальное уравнение относительно функции f[t]. Таким образом, функция DSolve имеет три обязательных аргумента. В примере In[1] на рис. 8.12 мы нашли аналитическое решение простейшего обыкновенного дифференциального уравнения первого порядка. В Out[1] мы видим, что результатом выполнения функции является список правил замены. Получить вместо списка правил список корней выражение можно тем же способом, что и в случае алгебраических уравнений — при помощи оператора " /. " (пример In[2]).

    Общее решение дифференциального уравнения содержит параметры C[i] (в нашем примере это только постоянная C[1]), которые определяются начальными и граничными условиями. Для получения частного решения уравнения эти условия следует задать. Для этого первым аргументом функции DSolve указывается одномерный список, в котором, помимо самого уравнения, содержатся уравнения, задающие дополнительные условия — см. пример In[3] на рис. 8.12, в котором мы решаем то же уравнение, что и в In[1], но задаём значение функции y[x] при начальном значении переменной x.

    Дополнительных условий не должно быть чрезмерное количество: в этом случае Mathematica не сумеет найти удовлетворительное решение и выдаст предупреждающее сообщение — пример In[4] на рис. 8.12.

    В Out[3] мы получили выражение для y[x], являющееся решением нашего ОДУ, которое теперь можем подставить в любое выражение, содержащее y[x]. Однако это решение не определяет правил замены для производных y'[x], y''[x] и т.д. [5, с. 35], в чём мы убеждаемся в примере In[5] на рис. 8.12, пытаясь осуществить замену для ряда выражений.

    Чтобы производные также могли быть заменены в соответствии с полученным выражением, необходимо во втором аргументе функции DSolve указать только заголовки искомых функций, не записывая их аргументы (пример In[6] на рис. 8.12). Тогда решение будет представлено в виде так называемой чистой функции — выражения с заголовком Function (с чистыми функциями мы подробней познакомимся в следующей лекции) — ср. Out[3] и Out[6]. И такое выражение уже можно подставить в любое другое выражение, содержащее как саму функцию, так и её производные: замена будет произведена корректно — ср. Out[5] и Out[7].

    (рис 8.12) Решение ОДУ при помощи функции DSolve

    Функция DSolve позволяет также решать системы дифференциальных уравнений: при этом в качестве первого аргумента указывается список уравнений системы, а второго — список искомых функций. Третьим аргументом по-прежнему остаётся независимая переменная. Пример нахождения общих решений систем дифференциальных уравнений — In[1] на рис. 8.13. Для нахождения частного решения системы следует указать начальные или граничные условия, число которых зависит от числа функций независимой переменной и порядка уравнений — пример In[2].

    Следует отметить, что функция DSolve умеет также решать алгебраические уравнения — см. пример In[3] на рис. 8.13, в котором мы в общем виде решили квадратное уравнение относительно переменной y[v].

    (рис 8.13) Решение систем ОДУ при помощи функции DSolve

    Математические зависимости, полученные в результате действия функции DSolve, могут быть визуализированы графическими средствами Mathematica. Для визуализации математических функций независимой переменной чаще всего используется функция Plot (пример In[2] на рис. 8.14), а для изображения фазовых портретов — ParametricPlot (примеры In[3] и In[4]).

    (рис 8.14) Визуализация решений ДУ и систем ДУ графическими средствами Mathematica

    В рассмотренных выше примерах мы познакомились с решением ОДУ при помощи функции DSolve. Однако как было сказано в начале лекции, с её помощью можно решать и другие виды ДУ, например, ДУ в частных производных. Единственное отличие при задании функции DSolve в этом случае заключается в форме задания последнего обязательного аргумента: он задаётся в виде списка, элементами которого являются все независимые переменные уравнения или системы уравнений. В примере In[1] на рис. 8.15 мы решаем уравнение Кортевега-де Вриза в общем случае; в примере In[2] мы визуализируем частное решение уравнения средствами трёхмерной графики.

    (рис 8.15) Решение УЧП при помощи функции DSolve

    А.Н. Прокопеня и А. В. Чичурин [5, с. 36] отмечают, что при помощи функции DSolve Mathematica умеет решать дифференциальные уравнения (в том числе высших порядков), если их решения могут быть выражены через специальные функции. В примере In[1] на рис. 8.15 мы решили дифференциальное уравнение, получив в результат, содержащий функции Эйри.

    Если функция DSolve не может найти аналитического решения, Mathematica просто перепечатывает в ячейку Out данные, введённые в области In — пример In[2] на рис. 8.16. В этом случае следует обратиться к следующему разделу настоящей лекции, посвящённому численному решению дифференциальных уравнений.

    Подробней о функции DSolve см. книги Е. М. Воробьёва [1, с. 58–61] и А. Н. Прокопени и А. В. Чичурина [5, с. 34–36].

    (рис 8.16) Функция DSolve при решении ДУ высших порядков

    8.4. Нахождение численных решений дифференциальных уравнений

    Численные решения дифференциальных уравнений в Mathematica находятся при помощи функции NDSolve. Задаётся она также, по крайней мере, тремя аргументами: NDSolve[{eqn,initialcond},f,{t,tmin,tmax}], где eqn — дифференциальное уравнение относительно функции f, аргумент которой t меняется от tmin до tmax. Третий обязательный аргумент функции NDSolve всегда задаётся списком из трёх элементов. Если быть точным, NDSolve предназначена для решения задач Коши, поскольку в первый аргумент функции в обязательном порядке входят само уравнение и начальные или граничные условия initialcond (пример In[1] на рис. 8.17).

    NDSolve всегда возвращает решения в виде интерполяционных функций или InterpolationFunction-объектов (Out[1] на рис. 8.17), которые представляют собой таблицу значений функции f[t] при разных значениях t из промежутка от tmin до tmax; значения функции в точках, не содержащихся в этой таблице, могут быть найдены интерполяцией табличных данных (А. Н. Прокопеня и А. В. Чичурин [5, с. 20–21]).

    Как правило, при выводе результатов интерполяционная функция принимает вид InterpolationFunction[{tmin,tmax},<>], т.е., явно указывается только диапазон определения интерполяционной функции {tmin,tmax}, а таблица значений обозначается условно символом <>. В таком виде результаты вычисления совершенно непригодны для анализа решений дифференциального уравнения или системы уравнений. Однако с интерполяционной функцией можно обращаться так же, как и с любой иной функцией в Mathematica, т.е., осуществлять с ней операции математического анализа, визуализировать и т.д., что позволяет извлечь пользу из результатов расчётов. Так в примере In[2] на рис. 8.17 мы визуализировали полученную в результате решения уравнения в In[1] зависимость.

    (рис 8.17) Нахождение численных решений дифференциальных уравнений

    NDSolve ищет решения итерационным методом: вычисление начинается от значения x, соответствующего частным решениям, следующими шагами охватывается весь отрезок от tmin до tmax.

    В примере In[1] на рис. 8.18 мы задали левую часть дифференциального уравнения (притом, что правая часть уравнения — 0). В In[2] мы решили дифференциальное уравнение при двух разных наборах начальных условий. В In[6] мы построили графики найденных зависимостей на одном рисунке. Как мы видим, решения отличаются друга от друга лишь фазой, которая и определяется начальными условиями.

    (рис 8.18) Влияние начальных условий на численное решение дифференциальных уравнений

    Функция NDSolve позволяет также решать системы связанных уравнений (рис. 8.19).

    (рис 8.19) Нахождение численных решений систем дифференциальных уравнений

    Как уже было сказано выше, функция NDSolve ищет решения итерационным методом. Интервал варьирования независимых переменных разбивается на отрезки, и значение функции вычисляется в точках на концах отрезков. Размер отрезков не является постоянным в процессе вычисления, а динамически меняется с каждым шагом для поиска более точного значения функции. Однако в процессе вычислений может возникнуть следующая проблема: решение может иметь сингулярность, и в этом случае NDSolve, тщетно стараясь найти решение в сингулярной точке, от шага к шагу будет уменьшать отрезок и в конечном итоге зависнет. Для того чтобы избежать этой проблемы, количество шагов для поиска решения в Mathematica ограничивается. Для ОДУ оно по умолчанию равно 10000. Самостоятельно задать число шагов можно при помощи опции MaxSteps. На рис. 8.20 мы приводим пример In[1] такой ситуации, когда поиск решения приостанавливается самостоятельно после заданного числа шагов. Mathematica в этом случае выдаёт предупреждение, что самостоятельно остановила поиск решения на некотором шаге.

    Если пользователь уверен том, что NDSolve сможет найти решение уравнения без необходимости искусственного прерывания, то число шагов можно установить бесконечным — пример In[2] на рис. 8.20.

    Подробней о численном решении дифференциальных уравнений см. книги Е. М. Воробьёва [1, с. 58–64] и А. Н. Прокопени и А. В. Чичурина [5, с. 20–22].

    (рис 8.20) Изменение числа итераций для нахождения решения дифференциального уравнения

    8.5. Нахождение решений рекуррентных уравнений

    Рекуррентными называются функции, значение которых в одной точке зависит от значения этой же функции в другой точке. Отношения между значениями функции в разных точках задаются рекуррентными уравнениями. Решает рекуррентные уравнения функция RSolve: в качестве результата она выдаёт зависимость значения функции от номера итерации. Задаётся функция в виде RSolve[eq,f[n],n], т.е. имеет, по крайней мере, три аргумента: первый — уравнение (систему уравнений) eq с начальными условиями, второй — функция (или список функций) f[n], которая зависит от номера итерации, счётчик которых n указываемой в третьем аргументе. Решение рекуррентного уравнения приведено в примерах In[1] и In[2] на рис. 8.21. Как мы видим, оба расчёта имеют одинаковый результат (ср. Out[1] и Out[2]) при том, что номера итераций указаны различным образом.

    Функцию RSolve можно рассматривать как дискретный аналог DSolve. Именно поэтому специальные функции, генерируемые DSolve при решении дифференциальных уравнений, встречаются и при решении рекуррентных уравнений. В примере In[3] на рис. 8.21 при решении рекуррентного уравнения мы получили зависимость, содержащую функцию Бесселя.

    О решении рекуррентных уравнений см. книгу В. П. Дьяконова [2, с. 263–264].

    (рис 8.21) Решение рекуррентных уравнений при помощи функции RSolve

    Ключевые термины

    Рекуррентными называются функции, значение которых в одной точке зависит от значения этой же функции в другой точке.

    Трансцендентное уравнение — уравнение, не являющееся алгебраическим.

    Краткие итоги

    В данной лекции мы познакомились с основными встроенными функциями Mathematica для нахождения символьных и численных решений алгебраических, трансцендентных, рекуррентных и дифференциальных уравнений, а также систем уравнений. Мы познакомились с принципами работы некоторых встроенных функций решения уравнений. Также мы научились сочетать возможности Mathematica символьных вычислений, численных расчётов и графических средств для нахождения решений уравнений и систем уравнений.

    Вопросы

  • Какая функция Mathematica используется для нахождения символьных решений алгебраических уравнений? В каком виде задаются её аргументы? В каком виде она возвращает результат вычислений?
  • Каким образом Mathematica представляет корни полиномиального уравнения в случае, если она не может представить полученное при помощи функции Solve решение в аналитическом виде?
  • Каким образом Mathematica может отреагировать на попытку решить при помощи функции Solve трансцендентное уравнение?
  • Какое действие выполняет функция FindInstance, применённая к алгебраическому уравнению? В каком виде задаются её аргументы?
  • Для каких целей служит функция Eliminate?
  • В каких случаях при работе с алгебраическими уравнениями функции Solve следует предпочесть функцию Reduce? В каком виде возвращается результат выполнения функции Reduce?
  • Для чего используется функция SolveAlways? Какие обязательные аргументы она содержат?
  • В каком виде должны быть заданы аргументы функции решения систем линейных уравнений LinearSolve?
  • Какая функция Mathematica используется для нахождения численных решений алгебраических уравнений? В каком виде она возвращает результат вычислений?
  • В каких случаях при решении уравнений используется функция FindRoot? Каким образом она ищет корни уравнений? Для чего используется опция MaxIterations?
  • Для решения каких типов ДУ и систем ДУ используется функция DSolve? Какие обязательные аргументы она содержат?
  • В чём заключается разница в результатах вычислений при задании второго аргумента функции DSolve как f и f[x]?
  • В чём состоят отличия при задании аргументов функций аналитического DSolve и численного NDSolve решения ДУ?
  • В каком виде возвращает результат решения функция NDSolve?
  • Для каких целей используется функция RSolve? В каком виде задаются её обязательные аргументы?
  • Упражнения

  • Решите средствами Mathematica следующие уравнения и системы уравнений. Для каждого уравнения или системы уравнений используйте по два наиболее подходящих способа решения, если это возможно. Сравните результаты решения каждым из способов друг с другом.

    $$x^2+3x-7=0$$

    $$(2x+5)^2=(3x-1)^2$$

    $$x^3-8x^2+4x+48=0$$

    $$x^5-2bx+4=0$$ (относительно $$x$$)

    $$x^2+y^2=3$$ (относительно $$x$$)

    $$6x-10/(x+1)=9$$

    $$((x-5)/(x+2))^{1/2}+((x-4)/(x+3))^{1/2}=(7/(x+2))((x+2)/(x+3))^{1/2}$$

    $$(x+x^{1/2})^{1/2}-(x-x^{1/2})^{1/2}=1.5(x/(x+x^{1/2}))^{1/2}$$

    $$cos(2t)=4t$$

    $$sin(2x)=a$$ (относительно $$x$$)

    $$14-3x=-7y, 7y^2-28=46x-7x^2$$

    $$x^{1/2}+y^{1/3}=4, (x+2y)^{1/2}=4$$

    $$ax+2y=0, 2x+(1-2a)y=1$$ (относительно $$x$$ и $$y$$)

    $$x^2+2y^2=3$$, $$xy=4$$

    $$x^2+y^2+z^2=1$$, $$2x+3y-4z=5,xyz=6$$

    $$(x^2+y^2)^{1/2}-(x^2-y^2)^{1/2}=y, x^4+y^4=144a^4$$ (относительно $$x$$ и $$y$$)

    $$ax^2+by^2=c, x^2=2y$$

    $$exp(x-1)=y, y=x^{1/2}$$

  • Из приведённых ниже систем уравнений исключите указанные переменные.

    $$x+2y+3z=4$$, $$5x+6y+7z=8$$ (исключить переменную $$z$$)

    $$x+2y+3z=4$$, $$5x+6y+7z=8$$ (переменную $$y$$)

    $$x^2+y^2+z^2=1$$, $$x+y+z=2$$, $$x-y^3=z$$ (переменную $$z$$)

    $$x^2+y^2+z^2=1$$, $$x+y+z=2$$, $$x-y^3=z$$ (переменные $$y$$ и $$z$$)

    $$x^2+y^2+z^2=1$$, $$x+y+z=2$$, $$x-y^3=z$$ (переменные $$x$$, $$y$$ и $$z$$)

    $$b^3+(a^2-4)b^2+(2a-3)b+4, 0=(1-a^2)b^4+ab+7a^2$$ (переменную $$b$$)

    $$sin(x+y)=x$$, $$cos(x-y)=y$$ (переменную $$y$$)

    $$z=x^5+y^5,a=x^2+y^2,b=x+y$$ (переменные $$x$$ и $$y$$)

    $$exp(x-1)=y, y=x^{1/2}$$ (переменную $$y$$)

  • Решите средствами Mathematica следующие ДУ и системы ДУ. Проиллюстрируйте полученные решения графически, если это возможно.

    $$y'(x)+y(x)=x cos(x)$$

    $$y'(x)+y(x)=x cos(x), y(0)=0$$

    $$y'(x)+x (y(x)-sin(x))=0, y(0)=x$$

    $$y''(x)-2y(x)-y'(x)/2=0$$

    $$y''(x)-2y(x)-y'(x)/2=0, y(0)=1, y(3)=-11$$

    $$y''(x)+2y'(x)+3y(x)=4, y(5)=6, y(7)=8$$

    $$3x^3 y'''(x)+10x^2 y''(x)+(x-x^2)y'(x)+(2-4x)y(x)=0$$

    $$y'(x)-(y(x)/x)^{1/3}=y(x)/x$$

    $$3df(u,v)/du+5df(u,v)/dv=u$$

    $$df(u,v)/du+4df(u,v)/dv=8, f(u,0)=u$$

    $$x''(t)=x(t)y(t), y'(t)=2-x(t), x(0)=x(2)=4, y(0)=1$$

    $$df(u,v)/du+d^3f(u,v)/dv^3+6f(u,v) df(u,v)/dv=0$$

    $$y'(t)=t^2y(t), x'(t)=5x(t)$$

    $$y'(t)=cos(\pi/4)y(t)-sin(\pi/4)x(t)+1/2, x'(t)=sin(\pi/4)y(t)+cos(\pi/4)x(t), y(0)=1/2, x(0)=1/2$$

    $$y'(t)-x(t)=3cos(t), y(t)-x(t)=3/2, y(\pi)=1/2$$

    $$y'(t)=x(t)^{-1/2}, x'(t)=y(t)$$

    $$x'(t)=-2(x(t)-y(t)), y'(t)=50x(t)-y(t)-x(t)z(t), z'(t)=x(t)y(t)-z(t), x(0)=z(0)=0, y(0)=1$$

    $$d^2f(u,v)/du^2=d^2f(u,v)/dv^2, f(0,v)=exp(-v^2), df(0,v)/du=0, f(u,-10)=f(u,10)$$

  • Страницы:

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

    8.0. Введение

    Доступ к множеству оригинальных алгоритмов при помощи встроенных функций, широчайшие возможности символьного и графического представления результатов делают Mathematica эффективным инструментом аналитического и численного решения уравнений. В данной лекции мы познакомимся с основными функциями Mathematica, применяемыми для нахождения решений алгебраических, трансцендентных и дифференциальных уравнений, а также систем уравнений. В этом нам помогут книги Е. М. Воробьёва [1] и А.Н. Прокопени [5].

    8.1. Нахождение символьных решений алгебраических и трансцендентных уравнений

    Наиболее часто используемая функция для решений уравнений — Solve. Она позволяет находить решения полиномиальных уравнений вплоть до чётвёртого порядка, некоторых полиномиальных уравнений высших порядков, а также неполиномииальных уравнений (А. Н. Прокопеня и А. В. Чичурин [5, с. 28]). В простейшем случае для решения одного уравнения lhs==rhs (lhs и rhs — левая и правая части уравнения, соответственно) с одной неизвестной var функция задаётся в виде Solve[lhs==rhs,var] (пример In[1] на рис. 8.1). Корни уравнения выдаются в виде вложенного списка правил замены в виде подстановок (см. Out[1])

    Для того чтобы решить при помощи этой функции систему уравнений, нужно задать оба обязательных аргумента в виде списков уравнений и переменных, т. е., записать функцию как Solve[{lhs1==rhs1,lhs2==rhs2,...},{var1,var2,...}]. Уравнения также можно отделять друг от друга логическим оператором (логическим умножением).

    В примере In[2] на рис. 8.1 мы решили систему уравнений. Обратим внимание на то, в каком виде мы получаем корни системы. В Out[2] мы получаем вложенный список, элементами которого являются одномерные списки. Каждый одномерный список в качестве элементов содержит пару корней системы уравнений.

    Для того чтобы была возможность в дальнейшем производить манипуляции с корнями уравнения или системы уравнений, следует от вложенного списка правил преобразований перейти к одномерному списку корней уравнения или системы уравнений. Делается это при помощи уже известного нам оператора " /. ". Так в примере In[3] на рис. 8.1 мы присвоили выражению xroots список корней системы уравнений в In[2] для переменной x.

    Обратиться к конкретному корню уравнения или системы уравнений теперь можно, пользуясь навыками работы со списками. Так в примере In[4] на рис. 8.1 мы вывели на экран первое правило подстановки из списка, полученного в результате решения уравнения In[2], а в In[5] — второй в списке набор корней этого же уравнения с учётом преобразования In[3].

    (рис 8.1) Решение алгебраических уравнений при помощи функции Solve

    Если Mathematica не может представить решение полиномиального уравнения в аналитическом виде, например, в случае, если полином в уравнении имеет степень выше четвёртой, то корни таких уравнений представляются программой при помощи Root-объектов (А. Н. Прокопеня и А. В. Чичурин [5, с. 29]). Такой объект в виде Root[f,k] представляет точное значении корня с номером k полиномиального уравнения f[x]==0. Пример полученных в таком виде решений — Out[1] на рис. 8.2.

    В примере In[1] на рис. 8.2 мы находили решение уравнения, заданного в общем виде. Если все коэффициенты уравнения имеют численные значения (как в примере In[2]), то получить численные значения корней не составляет труда при помощи функции N — пример In[3].

    (рис 8.2) Представление корней уравнений в виде Root-объектов

    В предыдущих примерах обсуждались возможности функции Solve применительно к алгебраическим уравнениям. В примере In[1] на рис. 8.3 мы попробовали решить с её помощью трансцендентное уравнение $$Cos[a*x]==a$$ относительно переменной x. Понятие трансцендентного уравнения в Mathematica ничем не отличается от его понятия в математике: Трансцендентное уравнение — уравнение, не являющееся алгебраическим. Обычно это уравнения, содержащие показательные, логарифмические, тригонометрические, обратные тригонометрические и др. функции.

    Как мы видим в Out[1] на рис. 8.3, для нашего трансцендентного уравнения Mathematica также сумела найти корень. Мы знаем, что на самом деле такое уравнение имеет бесконечное число корней, отличающихся на $$2*\pi$$. Знает это и Mathematica: поэтому она выдаёт сообщение о том, что помимо найденного ей могут существовать и другие корни уравнения.

    Однако в ряде случаев Mathematica оказывается бессильной найти корни трансцендентного уравнения в символьном виде. Тогда она выдаёт сообщение, в котором честно признаётся в своём бессилии и рекомендует попробовать решить уравнение неалгебраическими (численными) методами (см. пример In[2] на рис. 8.3).

    Подробней о функции Solve и её возможностях см. книги Е. М. Воробьёва [1, с. 45–50] и А. Н. Прокопени и А. В. Чичурина [5, с. 28–29].

    (рис 8.3) Решение трансцендентных уравнений при помощи функции Solve

    Ещё одна функция нахождения корней уравнения или системы уравнений является функция FindInstance. Заданная в простейшем виде FindInstance[syseqns,vars] функция находит один набор значений переменных vars, при которых уравнения системы syseqns становятся верными тождествами (пример In[1] на рис. 8.4). Помимо уравнений функция умеет находить и отдельные решения неравенств. В расширенном виде с дополнительным аргументом функция FindInstance[syseqns,vars,dom] выбирает только те выражения, которые принадлежат к типу данных dom. Выражение Integers задаёт целочисленные данные, Complexes — комплексные. А вот с выражением Reals всё не так однозначно. Если в исходном уравнении все численные коэффициенты заданы точно, то функция FindInstance с аргументом Reals всё равно будет стараться искать точные решения неравенства или корни уравнения: отличие от Integers состоит в том, что под этот критерий подпадают рациональные выражения и комбинации целочисленных и рациональных выражений — ср. результаты вычисления In[2] и In[3]. Приближённые результаты (в виде вещественных чисел) функция FindInstance вернёт, если хотя бы один коэффициент исходного уравнения или неравенства был задан приближённо.

    Функция в виде FindInstance[syseqns,vars,dom,n] находит n или менее наборов значений vars, принадлежащих к типу данных dom (примеры In[4] и In[5] на рис. 8.4). Аргумент dom может быть опущен (пример In[6]).

    Безусловно, FindInstance не может найти больше корней, чем их на самом деле имеет уравнение. Так количество корней полиномиальных уравнений не может превышать наибольшей степени переменной в этих уравнениях. В примере In[7] на рис. 8.4 мы пытаемся заставить Mathematica найти пять корней квадратного уравнения, хотя знаем, что их всего два. Только эти два корня сумела отыскать и Mathematica — см. Out[7].

    Функция FindInstance также может представлять результат вычисления в виде Root-объектов (пример In[8] на рис. 8.4).

    (рис 8.4) Нахождение считанного числа корней уравнений, систем уравнений, решений неравенств и систем неравенств при помощи функции FindInstance

    Один из методов решения систем алгебраических уравнений некомпьютерными методами, вручную, заключается в поэтапном представлении одной переменной через другие: при этом уменьшается и количество уравнений, и количество переменных. Для реализации подобной процедуры служит функция Eliminate. Задаётся она в единственной форме Eliminate[syseqns,vars] и исключает переменные vars из системы уравнений syseqns путём их выражения через оставшиеся переменные (примеры In[1] и In[2] на рис. 8.5). Результатом действия функции Eliminate может являться уравнение (см. Out[2]) или система уравнений (Out[1]) в зависимости от количества уравнений в первом аргументе syseqns и количества переменных во втором vars.

    Если система уравнений syseqns имеет решение, то функция Eliminate[syseqns,vars] возвращает True, если в списке переменных vars, которые следует исключить, указать все переменные системы syseqns — пример In[3] на рис. 8.5. Если система не имеет решений вовсе, то независимо от количества переменных в аргументе vars функция Eliminate будет возвращать False — примеры In[4] и In[5].

    Подробней о функции Eliminate см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 30].

    (рис 8.5) Исключение переменных из системы уравнений при помощи функции Eliminate

    По поводу полученных при помощи функции Solve решений Е. М. Воробьёв [1, с. 49–50] пишет следующее: "Функция Solve находит решения уравнений, трактуя их "в общем положении", т.е. для неспецифических значений входящих в уравнения символьных параметров". Иллюстрацию этого утверждения мы находим в Out[1] на рис. 8.1: очевидно, что оба выражения для корней не имеют смысла при a=0. Выход из сложившейся ситуации предлагают А.Н. Прокопеня и А. В. Чичурин [5, с. 30]: "Если уравнение или система уравнений содержит параметры, причём решение существует не при любых значениях параметров, то для решения системы удобно использовать функцию Reduce. В этом случае результат получается в виде набора уравнений, который содержит все возможные решения, включая дополнительные условия на параметры". Заданная в простейшем виде функция Reduce[syseqns,vars] ищет решения в общем виде независимо от потенциальной принадлежности решений к тому или иному типу численных данных (примеры In[1] и In[2] на рис. 8.6). Добавление третьего аргумента dom производит тот же эффект, что и в случае функции FindInstance: Reduce[syseqns,vars,dom] выбирает только решения, принадлежащие к типу данных dom; выражение dom может принимать значении Integers, Reals и Complexes (пример In[3]).

    Если в результате выполнения функции Reduce был получен набор из нескольких уравнений, то обратиться к конкретному уравнению оказывается возможным тем же методом, который используется при работе с функцией Solve — при помощи двойных скобок [[]]. В примере In[4] на рис. 8.6 мы обращаемся ко второму уравнению, полученному в результате вычисления In[2].

    Кроме того, Reduce позволяет решать параметрически заданные неравенства, системы неравенств и системы неравенств и уравнений (пример In[5] на рис. 8.6).

    (рис 8.6) Нахождение корней параметрических выражений при помощи функции Reduce

    Ещё одна функция для работы с параметрическими уравнениями — SolveAlways: она находит значение параметров, при которых уравнения системы удовлетворяются при любых значениях переменных. Задаётся она также с двумя обязательными аргументами: уравнением или системой уравнений и переменной или списком переменных — SolveAlways[syseqns,vars]. Примеры использования функции см. на рис. 8.7.

    (рис 8.7) Нахождение универсальных значений параметров для превращения уравнения в тождество при помощи функции SolveAlways

    Во многих случаях на практике, если в процессе работы возникла необходимость решить систему линейных уравнений, часто оказывается, что задана не сама система, а матрица её коэффициентов. Если система уравнений задана в матричной форме m x=b, где m — квадратная матрица коэффициентов, а x и b — векторы переменных и свободных членов уравнений системы в правой части, соответственно, решить её можно при помощи функции LinearSolve[m,b] [5, с. 31] — примеры на рис. 8.8. Как пишет Е. М. Воробьёв [1, с. 51]: "Функция LinearSolve наиболее эффективна в случае систем большой размерности с разреженными матрицами коэффициентов".

    Подробней о функциях SolveAlways и LinearSolve см. книги Е. М. Воробьёва [1, с. 50–51] и А. Н. Прокопени и А. В. Чичурина [5, с. 31].

    (рис 8.8) Решение систем линейных уравнений, заданных в матричной форме при помощи функции LinearSolve

    8.2. Нахождение численных решений алгебраических и трансцендентных уравнений

    Если Mathematica не может в аналитическом виде найти корни уравнений или систем уравнений, например, в случае полиномиальных уравнений 5-го и выше порядков, некоторых трансцендентных уравнений, можно попробовать найти решение численными методами.

    Для численного решения полиномиальных уравнений в Mathematica имеется функция NSolve. Задаётся функция точно так же, как и функция Solve: имеет два обязательных аргумента, первый из которых представляет собой уравнение или систему уравнений, а второй — переменную или перечень переменных. В примере In[1] на рис. 8.9 попробуем численно решить уравнение, которое мы пытались аналитически решить в примере In[2] на рис. 8.2. В Out[1] мы видим, что корни успешно найдены. Безусловно, найти корни уравнение или систему уравнений в явном виде численным методом можно лишь в случае, если все коэффициенты при переменных заданы как численные данные. Если хоть один коэффициент задан в ином виде, например, в символьном, то в решении мы получим либо корни в аналитическом виде (пример In[2]), либо в виде уже знакомых нам Root-объектов (пример In[3]). Как только символьный коэффициент приобретёт численное значение, корни уравнений или системы уравнений сразу могут быть представлены в численном виде (пример In[4]).

    Подробней о функции NSolve см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 18–19].

    (рис 8.9) Нахождение численных решений алгебраических уравнений при помощи функции NSolve

    Функция NSolve эффективно работает с полиномиальными уравнениями и системами уравнений. Если же уравнения содержат более замысловатые математические функции, то какой-то специальной процедуры нахождения всех решений даже численными методами не существует. В этом случае используется функция FindRoot: но она находит только один корень. В общем виде функция задаётся как FindRoot[{eqn1,eqn2,...},{{var1,varstart1},{var2,varstart2},...}], где eqn1,eqn2,... — система уравнений, var1,var2,...— переменные, varstart1,varstart2,... — начальное приближение к решению, от которого Mathematica начинает поиск истинного решения. В примере In[1] на рис. 8.10 при помощи функции FindRoot мы нашли корень уравнения из In[2] на рис. 8.3, которое не смогли решить аналитически.

    Функция FindRoot также может представлять результат вычисления в виде Root-объектов.

    Для нахождения корня уравнения или системы уравнений функция FindRoot проводит поиск итерационным методом касательных, с каждой итерацией приближаясь к истинному значению корня. Заданное по умолчанию число итераций равняется 100. Однако для некоторых уравнений, а также в зависимости от заданной нами начальной точки поиска этого числа не хватает для достаточно точного, по мнению Mathematica, нахождения корней (пример In[2] на рис. 8.10). Иное число итераций можно задать при помощи опции MaxIterations (пример In[3] на рис. 8.10).

    О функции FindRoot см. книгу А. Н. Прокопени и А. В. Чичурина [5, с. 19–20].

    (рис 8.10) Нахождение корня уравнения при помощи функции FindRoot

    Как мы видим из сказанного выше, возможности Mathematica в решении уравнений небезграничны. Даже численными методами для некоторых уравнений одномоментно можно найти только один корень. Пользуясь для этого функцией FindRoot, следует из некоторых соображений самостоятельно вручную задавать точку для начала поиска корней. А некоторые уравнения и вовсе могут не иметь корней, и для их нахождения будет впустую потрачено машинное время и ресурсы. Чтобы при проведении расчётов хоть как-то гарантировать нахождение корня при их наличии или сэкономить силы и время, не тратя их на поиски корней, если их вовсе нет, прибегают к мощнейшему средству Mathematica для представления данных — графике. Графическому решению уравнений много внимания уделено в книге В. П. Дьяконова [2, с. 258–262]. В настоящем курсе мы познакомимся с сутью и основными принципами этого метода.

    Пусть мы хотим найти решение трансцендентного уравнения $$x*Sin[3*x]==2$$, причём нас интересуют только x, принадлежащие отрезку от 0 до 6. Для этого сначала мы строим на одном графике левую и правую части уравнения в зависимости от x в указанных пределах при помощи функции Plot (пример In[1] на рис. 8.11). Как видно на рисунке в Out[2], графики имеют 4 пересечения, а уравнение, соответственно, 4 корня, причём приблизительное положение этих корней мы также можем определить из графика. Теперь, задавая эти приблизительные координаты в качестве исходных точек для нахождения корней, мы находим сами корни при помощи функции FindRoot — см. пример In[2]. В данном примере, используя цикл Do (с циклами мы познакомимся в лекции настоящего курса, посвящённой процедурному программированию), мы выводили на экран при помощи функции Print результат выполнения функции FindRoot, меняя каждый раз значение исходной точки поиска i.

    Приведём ещё один пример. Пусть у нас возникла необходимость решить уравнение $$Cos[x]+Sin[2*x]==(x-3)^2+1$$ относительно x из отрезка от -10 до 10. Действуем по тому же алгоритму. Сначала визуализируем тригонометрическую $$Cos[x]+Sin[2*x]$$ и параболическую $$(x-3)^2+1$$ зависимости от переменной x (пример In[3] на рис. 8.11). Как мы видим на рисунке в Out[3], кривые не имеют ни одного пересечения в интересующей нас области и, ввиду периодичности первой функции и принципиального нахождения выше уровня $$f=3$$ второй, они не имеют пересечений вовсе. Соответственно, и уравнение не будет иметь корней: искать их не имеет смысла. Если же мы всё же попытаемся найти корни уравнения при помощи функции FindRoot (пример In[4]), Mathematica выдаст сообщение о том, что при заданных значениях точности и разрядности не может найти удовлетворительного решения и рекомендует повысить точность вычислений (хотя, мы уже знаем, что никакого результата это не даст).

    (рис 8.11) Применение графических средств для нахождения корней уравнений численными методами

    8.3. Нахождение символьных решений дифференциальных уравнений

    Для символьного решения дифференциальных уравнений в Mathematica имеется функция DSolve. С её помощью решаются следующие типы уравнений:

  • обыкновенные дифференциальные уравнения (ОДЕ) и системы уравнений. ОДУ содержат одну независимую переменную и одну или больше зависимых переменных;
  • дифференциальные уравнения в частных производных (ДУЧП) и системы уравнений. ДУЧП содержат две или более независимые переменные и одну или больше зависимых переменных;
  • системы дифференциально-алгебраические уравнения (ДАУ). Часть уравнений системы является дифференциальными, другая часть — алгебраическими.
  • Формат обращение к функции DSolve для решения дифференциального уравнения следующий: DSolve[eqn,f[t],t], где eqn — дифференциальное уравнение относительно функции f[t]. Таким образом, функция DSolve имеет три обязательных аргумента. В примере In[1] на рис. 8.12 мы нашли аналитическое решение простейшего обыкновенного дифференциального уравнения первого порядка. В Out[1] мы видим, что результатом выполнения функции является список правил замены. Получить вместо списка правил список корней выражение можно тем же способом, что и в случае алгебраических уравнений — при помощи оператора " /. " (пример In[2]).

    Общее решение дифференциального уравнения содержит параметры C[i] (в нашем примере это только постоянная C[1]), которые определяются начальными и граничными условиями. Для получения частного решения уравнения эти условия следует задать. Для этого первым аргументом функции DSolve указывается одномерный список, в котором, помимо самого уравнения, содержатся уравнения, задающие дополнительные условия — см. пример In[3] на рис. 8.12, в котором мы решаем то же уравнение, что и в In[1], но задаём значение функции y[x] при начальном значении переменной x.

    Дополнительных условий не должно быть чрезмерное количество: в этом случае Mathematica не сумеет найти удовлетворительное решение и выдаст предупреждающее сообщение — пример In[4] на рис. 8.12.

    В Out[3] мы получили выражение для y[x], являющееся решением нашего ОДУ, которое теперь можем подставить в любое выражение, содержащее y[x]. Однако это решение не определяет правил замены для производных y'[x], y''[x] и т.д. [5, с. 35], в чём мы убеждаемся в примере In[5] на рис. 8.12, пытаясь осуществить замену для ряда выражений.

    Чтобы производные также могли быть заменены в соответствии с полученным выражением, необходимо во втором аргументе функции DSolve указать только заголовки искомых функций, не записывая их аргументы (пример In[6] на рис. 8.12). Тогда решение будет представлено в виде так называемой чистой функции — выражения с заголовком Function (с чистыми функциями мы подробней познакомимся в следующей лекции) — ср. Out[3] и Out[6]. И такое выражение уже можно подставить в любое другое выражение, содержащее как саму функцию, так и её производные: замена будет произведена корректно — ср. Out[5] и Out[7].

    (рис 8.12) Решение ОДУ при помощи функции DSolve

    Функция DSolve позволяет также решать системы дифференциальных уравнений: при этом в качестве первого аргумента указывается список уравнений системы, а второго — список искомых функций. Третьим аргументом по-прежнему остаётся независимая переменная. Пример нахождения общих решений систем дифференциальных уравнений — In[1] на рис. 8.13. Для нахождения частного решения системы следует указать начальные или граничные условия, число которых зависит от числа функций независимой переменной и порядка уравнений — пример In[2].

    Следует отметить, что функция DSolve умеет также решать алгебраические уравнения — см. пример In[3] на рис. 8.13, в котором мы в общем виде решили квадратное уравнение относительно переменной y[v].

    (рис 8.13) Решение систем ОДУ при помощи функции DSolve

    Математические зависимости, полученные в результате действия функции DSolve, могут быть визуализированы графическими средствами Mathematica. Для визуализации математических функций независимой переменной чаще всего используется функция Plot (пример In[2] на рис. 8.14), а для изображения фазовых портретов — ParametricPlot (примеры In[3] и In[4]).

    (рис 8.14) Визуализация решений ДУ и систем ДУ графическими средствами Mathematica

    В рассмотренных выше примерах мы познакомились с решением ОДУ при помощи функции DSolve. Однако как было сказано в начале лекции, с её помощью можно решать и другие виды ДУ, например, ДУ в частных производных. Единственное отличие при задании функции DSolve в этом случае заключается в форме задания последнего обязательного аргумента: он задаётся в виде списка, элементами которого являются все независимые переменные уравнения или системы уравнений. В примере In[1] на рис. 8.15 мы решаем уравнение Кортевега-де Вриза в общем случае; в примере In[2] мы визуализируем частное решение уравнения средствами трёхмерной графики.

    (рис 8.15) Решение УЧП при помощи функции DSolve

    А.Н. Прокопеня и А. В. Чичурин [5, с. 36] отмечают, что при помощи функции DSolve Mathematica умеет решать дифференциальные уравнения (в том числе высших порядков), если их решения могут быть выражены через специальные функции. В примере In[1] на рис. 8.15 мы решили дифференциальное уравнение, получив в результат, содержащий функции Эйри.

    Если функция DSolve не может найти аналитического решения, Mathematica просто перепечатывает в ячейку Out данные, введённые в области In — пример In[2] на рис. 8.16. В этом случае следует обратиться к следующему разделу настоящей лекции, посвящённому численному решению дифференциальных уравнений.

    Подробней о функции DSolve см. книги Е. М. Воробьёва [1, с. 58–61] и А. Н. Прокопени и А. В. Чичурина [5, с. 34–36].

    (рис 8.16) Функция DSolve при решении ДУ высших порядков

    8.4. Нахождение численных решений дифференциальных уравнений

    Численные решения дифференциальных уравнений в Mathematica находятся при помощи функции NDSolve. Задаётся она также, по крайней мере, тремя аргументами: NDSolve[{eqn,initialcond},f,{t,tmin,tmax}], где eqn — дифференциальное уравнение относительно функции f, аргумент которой t меняется от tmin до tmax. Третий обязательный аргумент функции NDSolve всегда задаётся списком из трёх элементов. Если быть точным, NDSolve предназначена для решения задач Коши, поскольку в первый аргумент функции в обязательном порядке входят само уравнение и начальные или граничные условия initialcond (пример In[1] на рис. 8.17).

    NDSolve всегда возвращает решения в виде интерполяционных функций или InterpolationFunction-объектов (Out[1] на рис. 8.17), которые представляют собой таблицу значений функции f[t] при разных значениях t из промежутка от tmin до tmax; значения функции в точках, не содержащихся в этой таблице, могут быть найдены интерполяцией табличных данных (А. Н. Прокопеня и А. В. Чичурин [5, с. 20–21]).

    Как правило, при выводе результатов интерполяционная функция принимает вид InterpolationFunction[{tmin,tmax},<>], т.е., явно указывается только диапазон определения интерполяционной функции {tmin,tmax}, а таблица значений обозначается условно символом <>. В таком виде результаты вычисления совершенно непригодны для анализа решений дифференциального уравнения или системы уравнений. Однако с интерполяционной функцией можно обращаться так же, как и с любой иной функцией в Mathematica, т.е., осуществлять с ней операции математического анализа, визуализировать и т.д., что позволяет извлечь пользу из результатов расчётов. Так в примере In[2] на рис. 8.17 мы визуализировали полученную в результате решения уравнения в In[1] зависимость.

    (рис 8.17) Нахождение численных решений дифференциальных уравнений

    NDSolve ищет решения итерационным методом: вычисление начинается от значения x, соответствующего частным решениям, следующими шагами охватывается весь отрезок от tmin до tmax.

    В примере In[1] на рис. 8.18 мы задали левую часть дифференциального уравнения (притом, что правая часть уравнения — 0). В In[2] мы решили дифференциальное уравнение при двух разных наборах начальных условий. В In[6] мы построили графики найденных зависимостей на одном рисунке. Как мы видим, решения отличаются друга от друга лишь фазой, которая и определяется начальными условиями.

    (рис 8.18) Влияние начальных условий на численное решение дифференциальных уравнений

    Функция NDSolve позволяет также решать системы связанных уравнений (рис. 8.19).

    (рис 8.19) Нахождение численных решений систем дифференциальных уравнений

    Как уже было сказано выше, функция NDSolve ищет решения итерационным методом. Интервал варьирования независимых переменных разбивается на отрезки, и значение функции вычисляется в точках на концах отрезков. Размер отрезков не является постоянным в процессе вычисления, а динамически меняется с каждым шагом для поиска более точного значения функции. Однако в процессе вычислений может возникнуть следующая проблема: решение может иметь сингулярность, и в этом случае NDSolve, тщетно стараясь найти решение в сингулярной точке, от шага к шагу будет уменьшать отрезок и в конечном итоге зависнет. Для того чтобы избежать этой проблемы, количество шагов для поиска решения в Mathematica ограничивается. Для ОДУ оно по умолчанию равно 10000. Самостоятельно задать число шагов можно при помощи опции MaxSteps. На рис. 8.20 мы приводим пример In[1] такой ситуации, когда поиск решения приостанавливается самостоятельно после заданного числа шагов. Mathematica в этом случае выдаёт предупреждение, что самостоятельно остановила поиск решения на некотором шаге.

    Если пользователь уверен том, что NDSolve сможет найти решение уравнения без необходимости искусственного прерывания, то число шагов можно установить бесконечным — пример In[2] на рис. 8.20.

    Подробней о численном решении дифференциальных уравнений см. книги Е. М. Воробьёва [1, с. 58–64] и А. Н. Прокопени и А. В. Чичурина [5, с. 20–22].

    (рис 8.20) Изменение числа итераций для нахождения решения дифференциального уравнения

    8.5. Нахождение решений рекуррентных уравнений

    Рекуррентными называются функции, значение которых в одной точке зависит от значения этой же функции в другой точке. Отношения между значениями функции в разных точках задаются рекуррентными уравнениями. Решает рекуррентные уравнения функция RSolve: в качестве результата она выдаёт зависимость значения функции от номера итерации. Задаётся функция в виде RSolve[eq,f[n],n], т.е. имеет, по крайней мере, три аргумента: первый — уравнение (систему уравнений) eq с начальными условиями, второй — функция (или список функций) f[n], которая зависит от номера итерации, счётчик которых n указываемой в третьем аргументе. Решение рекуррентного уравнения приведено в примерах In[1] и In[2] на рис. 8.21. Как мы видим, оба расчёта имеют одинаковый результат (ср. Out[1] и Out[2]) при том, что номера итераций указаны различным образом.

    Функцию RSolve можно рассматривать как дискретный аналог DSolve. Именно поэтому специальные функции, генерируемые DSolve при решении дифференциальных уравнений, встречаются и при решении рекуррентных уравнений. В примере In[3] на рис. 8.21 при решении рекуррентного уравнения мы получили зависимость, содержащую функцию Бесселя.

    О решении рекуррентных уравнений см. книгу В. П. Дьяконова [2, с. 263–264].

    (рис 8.21) Решение рекуррентных уравнений при помощи функции RSolve

    Ключевые термины

    Рекуррентными называются функции, значение которых в одной точке зависит от значения этой же функции в другой точке.

    Трансцендентное уравнение — уравнение, не являющееся алгебраическим.

    Краткие итоги

    В данной лекции мы познакомились с основными встроенными функциями Mathematica для нахождения символьных и численных решений алгебраических, трансцендентных, рекуррентных и дифференциальных уравнений, а также систем уравнений. Мы познакомились с принципами работы некоторых встроенных функций решения уравнений. Также мы научились сочетать возможности Mathematica символьных вычислений, численных расчётов и графических средств для нахождения решений уравнений и систем уравнений.

    Вопросы

  • Какая функция Mathematica используется для нахождения символьных решений алгебраических уравнений? В каком виде задаются её аргументы? В каком виде она возвращает результат вычислений?
  • Каким образом Mathematica представляет корни полиномиального уравнения в случае, если она не может представить полученное при помощи функции Solve решение в аналитическом виде?
  • Каким образом Mathematica может отреагировать на попытку решить при помощи функции Solve трансцендентное уравнение?
  • Какое действие выполняет функция FindInstance, применённая к алгебраическому уравнению? В каком виде задаются её аргументы?
  • Для каких целей служит функция Eliminate?
  • В каких случаях при работе с алгебраическими уравнениями функции Solve следует предпочесть функцию Reduce? В каком виде возвращается результат выполнения функции Reduce?
  • Для чего используется функция SolveAlways? Какие обязательные аргументы она содержат?
  • В каком виде должны быть заданы аргументы функции решения систем линейных уравнений LinearSolve?
  • Какая функция Mathematica используется для нахождения численных решений алгебраических уравнений? В каком виде она возвращает результат вычислений?
  • В каких случаях при решении уравнений используется функция FindRoot? Каким образом она ищет корни уравнений? Для чего используется опция MaxIterations?
  • Для решения каких типов ДУ и систем ДУ используется функция DSolve? Какие обязательные аргументы она содержат?
  • В чём заключается разница в результатах вычислений при задании второго аргумента функции DSolve как f и f[x]?
  • В чём состоят отличия при задании аргументов функций аналитического DSolve и численного NDSolve решения ДУ?
  • В каком виде возвращает результат решения функция NDSolve?
  • Для каких целей используется функция RSolve? В каком виде задаются её обязательные аргументы?
  • Упражнения

  • Решите средствами Mathematica следующие уравнения и системы уравнений. Для каждого уравнения или системы уравнений используйте по два наиболее подходящих способа решения, если это возможно. Сравните результаты решения каждым из способов друг с другом.

    $$x^2+3x-7=0$$

    $$(2x+5)^2=(3x-1)^2$$

    $$x^3-8x^2+4x+48=0$$

    $$x^5-2bx+4=0$$ (относительно $$x$$)

    $$x^2+y^2=3$$ (относительно $$x$$)

    $$6x-10/(x+1)=9$$

    $$((x-5)/(x+2))^{1/2}+((x-4)/(x+3))^{1/2}=(7/(x+2))((x+2)/(x+3))^{1/2}$$

    $$(x+x^{1/2})^{1/2}-(x-x^{1/2})^{1/2}=1.5(x/(x+x^{1/2}))^{1/2}$$

    $$cos(2t)=4t$$

    $$sin(2x)=a$$ (относительно $$x$$)

    $$14-3x=-7y, 7y^2-28=46x-7x^2$$

    $$x^{1/2}+y^{1/3}=4, (x+2y)^{1/2}=4$$

    $$ax+2y=0, 2x+(1-2a)y=1$$ (относительно $$x$$ и $$y$$)

    $$x^2+2y^2=3$$, $$xy=4$$

    $$x^2+y^2+z^2=1$$, $$2x+3y-4z=5,xyz=6$$

    $$(x^2+y^2)^{1/2}-(x^2-y^2)^{1/2}=y, x^4+y^4=144a^4$$ (относительно $$x$$ и $$y$$)

    $$ax^2+by^2=c, x^2=2y$$

    $$exp(x-1)=y, y=x^{1/2}$$

  • Из приведённых ниже систем уравнений исключите указанные переменные.

    $$x+2y+3z=4$$, $$5x+6y+7z=8$$ (исключить переменную $$z$$)

    $$x+2y+3z=4$$, $$5x+6y+7z=8$$ (переменную $$y$$)

    $$x^2+y^2+z^2=1$$, $$x+y+z=2$$, $$x-y^3=z$$ (переменную $$z$$)

    $$x^2+y^2+z^2=1$$, $$x+y+z=2$$, $$x-y^3=z$$ (переменные $$y$$ и $$z$$)

    $$x^2+y^2+z^2=1$$, $$x+y+z=2$$, $$x-y^3=z$$ (переменные $$x$$, $$y$$ и $$z$$)

    $$b^3+(a^2-4)b^2+(2a-3)b+4, 0=(1-a^2)b^4+ab+7a^2$$ (переменную $$b$$)

    $$sin(x+y)=x$$, $$cos(x-y)=y$$ (переменную $$y$$)

    $$z=x^5+y^5,a=x^2+y^2,b=x+y$$ (переменные $$x$$ и $$y$$)

    $$exp(x-1)=y, y=x^{1/2}$$ (переменную $$y$$)

  • Решите средствами Mathematica следующие ДУ и системы ДУ. Проиллюстрируйте полученные решения графически, если это возможно.

    $$y'(x)+y(x)=x cos(x)$$

    $$y'(x)+y(x)=x cos(x), y(0)=0$$

    $$y'(x)+x (y(x)-sin(x))=0, y(0)=x$$

    $$y''(x)-2y(x)-y'(x)/2=0$$

    $$y''(x)-2y(x)-y'(x)/2=0, y(0)=1, y(3)=-11$$

    $$y''(x)+2y'(x)+3y(x)=4, y(5)=6, y(7)=8$$

    $$3x^3 y'''(x)+10x^2 y''(x)+(x-x^2)y'(x)+(2-4x)y(x)=0$$

    $$y'(x)-(y(x)/x)^{1/3}=y(x)/x$$

    $$3df(u,v)/du+5df(u,v)/dv=u$$

    $$df(u,v)/du+4df(u,v)/dv=8, f(u,0)=u$$

    $$x''(t)=x(t)y(t), y'(t)=2-x(t), x(0)=x(2)=4, y(0)=1$$

    $$df(u,v)/du+d^3f(u,v)/dv^3+6f(u,v) df(u,v)/dv=0$$

    $$y'(t)=t^2y(t), x'(t)=5x(t)$$

    $$y'(t)=cos(\pi/4)y(t)-sin(\pi/4)x(t)+1/2, x'(t)=sin(\pi/4)y(t)+cos(\pi/4)x(t), y(0)=1/2, x(0)=1/2$$

    $$y'(t)-x(t)=3cos(t), y(t)-x(t)=3/2, y(\pi)=1/2$$

    $$y'(t)=x(t)^{-1/2}, x'(t)=y(t)$$

    $$x'(t)=-2(x(t)-y(t)), y'(t)=50x(t)-y(t)-x(t)z(t), z'(t)=x(t)y(t)-z(t), x(0)=z(0)=0, y(0)=1$$

    $$d^2f(u,v)/du^2=d^2f(u,v)/dv^2, f(0,v)=exp(-v^2), df(0,v)/du=0, f(u,-10)=f(u,10)$$

  • Вернуться к учебному плану