Maple 9.5/10 в математике, физике и образовании - Владимир Дьяконов
Шрифт:
Интервал:
Закладка:
> solve(sin(х)=1/2,х);
Здесь вспомогательные переменные _ВI~ и _ZI~ могут иметь только целочисленные значения (знак ~ означает, что на них наложено ограничение — в нашем случае в виде целочисленности возможных значений).
На рис. 4.31 показан более сложный случай решения нелинейного уравнения вида f1(х)=f2(x), где f1(х)=sin(x) и f2(х)=cos(x)-1. Решение дано в графическом виде и в аналитическом для двух случаев — нахождения главных значений корней и нахождения всех корней. Обратите внимание на команду _EnvAllSolutions:=true задающую поиск всех корней.
Рис. 4.31. Пример решения уравнения, имеющего периодические решения
В подобных решениях встречаются переменные _В1~ и означающие ряд натуральных чисел. Благодаря этому через них можно представить периодически повторяющиеся решения.
Примеры решения уравнений с обратными тригонометрическими функциями показаны ниже:
> eqns := 2*arcsin(x) — arccos(5*x);
eqns := 2 arcsin(x) - arccos(5x)> solve(eqns, {x});
> eqns := arccos(x) — arctan(x/2);
eqns := arccos(x) - arctan(½x)> solve(eqns, {x});
4.8.4. Решение систем линейных уравнений
Для решения систем линейных уравнений созданы мощные матричные методы, которые будут описаны отдельно в Главе 6. Однако функция solve также может успешно решать системы линейных уравнений, причем в символьном (аналитическом) виде. Такое решение в силу простоты записи функции может быть предпочтительным. Для решения система уравнений и перечень неизвестных задаются в виде множеств (см. приведенный ниже пример):
> eq1:=а*х+b*у=е; eq2:=c*x+d*y=f;
eq1 := ах + by = е eq2 := cx + dу = f> solve({eq1,eq2},{x,y});
В данном случае решение системы из двух линейных уравнений представлено в символьном виде.
Рисунок 4.32 дает еще два примера решения систем из двух линейных уравнений на этот раз в численном виде. В первом примере функция solve возвращает решение в виде значений неизвестных x и у, а во втором отказывается это делать.
Рис. 4.32. Примеры решения системы из двух линейных уравнений с графической иллюстрацией
В чем дело? Оказывается, в том, что во втором случае система просто не имеет решения. Импликативная графика пакета расширения plots дает прекрасную возможность проиллюстрировать решение. Так, нетрудно заметить, что в первом случае геометрическая трактовка решения сводится к нахождению точки пересечения двух прямых, отображающих два уравнения. При этом имеется единственное решение, дающее значения x и у для этой точки.
Во втором случае решения и впрямь нет, ибо уравнения задают параллельно расположенные прямые, которые никогда не пересекаются. Рекомендуем читателю самостоятельно проверить и третий случай — бесконечного множества решений. Он имеет место, если оба уравнения описывают одну и ту же зависимость и их графики сливаются в одну прямую.
Решение систем из трех линейных уравнений также имеет наглядную геометрическую интерпретацию — в виде точки, в которой пересекаются три плоскости, каждая из которых описывается функцией двух переменных. Для наглядности желательно представить и линии пересечения плоскостей. Это позволяет сделать функция импликативной трехмерной графики implicitplot3d, что и показано на рис. 4.33. Для объединения графиков площадей использована функция display.
Рис. 4.33. Пример решения системы из трех линейных уравнений с графической иллюстрацией решения
Некоторые проблемы с решением систем из трех линейных уравнений иллюстрируют примеры, приведенные на рис. 4.34. В первом примере решения вообще нет. График показывает, в чем дело — линии пересечения плоскостей идут параллельно и нигде не пересекаются. Во втором примере все три плоскости пересекаются по одной линии.
Рис. 4.34. Графическая иллюстрация особых случаев решения системы из трех линейных
Следующий пример показывает решение системы из четырех линейных уравнений:
> sys := { 4*x1 + 7*х2 - х3 + 3*х4 = 11,
-2*х1 + 2*х2 - 6*х3 4+ х4 = 4, x1 - 3*х2 + 4*x3 - х4 = -3, 3*х1 - 5*х2 - 7*х3 + 5*х4 = 8 }:
> solve(sys, {x1, х2, х3, х4});
Эта система имеет решение, но его простая графическая иллюстрация уже невозможна.
Случай решения неполной системы уравнений (уравнений — 3, а неизвестных — 4) иллюстрирует следующий пример:
> sys := { x1 + 2*х2 + 3*х3 + 4*х4 = 51,
x1 - 3*х2 + 4*х3 + х4 = 32, х1 + 2*х2 - 6*х3 + х4 = -23 }:
> solve(sys, {x1, х2, х3, х4 });
Как видно из приведенных примеров, функция solve неплохо справляется с решением систем линейных уравнений.
4.8.5. Решение систем нелинейных и трансцендентных уравнений
Функция solve может использоваться для решения систем нелинейных и трансцендентных уравнений. Для этого система уравнений и перечень неизвестных задаются в виде множеств. Ниже приведены примеры решения уравнений (файл solvenl):
> restart;
> solve{{х*у=а,x+y=b},{х,у});
у = RootOf(_Z² - _Zb + а), х = -RootOf(_Z² -_Zb + a)+b)> allvalues(%);
> s:=solve({x*y=2,x+y=3},{x,y});
s:={y = 1, x = 2}, {y = 2, x = 1}> assign(s); x; y;
1 2> unassign('x'); y:= 'y';
y:= y> [x, y];
[x,y]В этих примерах хорошо видна техника работы с функциями solve и assign. В конце примеров показано восстановление неопределенного статуса переменных х и у с помощью функции unassign и снятие определения переменных с помощью заключения их в прямые апострофы.
Приведем еще один пример решения системы нелинейных уравнений с проверкой правильности решения с помощью функции eval:
> eqs: = {2*х+4*у=6,у+1/х=1};
> r:=solve(eqs, {х, у});
r:= {y = 2, х = -1}, {у = ½, х = 2}> eval(eqs,r[1]);
{1 = 1, 6 = 6}> eval(eqs,r[2]);
{1 = 1, 6 = 6}Для проверки всех решений можно использовать также функции map и subs:
> map(subs,[r],eqs);
[{1 = 1, 6 = 6}, {1 = 1, 6 = 6}]Maple имеет и еще ряд возможностей для проверки решений, но представленных обычно вполне достаточно для такой проверки. Ее следует принять за правило при выполнении решений уравнений.
4.8.6. Функция RootOf
В решениях уравнений нередко появляется функция RootOf, означающая, что корни нельзя выразить в радикалах. Эта функция применяется и самостоятельно в виде RootOf(expr) или RootOf(expr, х), где expr — алгебраическое выражение или равенство, х — имя переменной, относительно которой ищется решение. Если переменная х не указана, ищется универсальное решение по переменной _Z. Когда expr задано не в виде равенства, решается уравнение expr=0. Для получения решений вида RootOf в явном виде может использоваться функция allvalues.
Примеры применения функции RootOf (файл RootOf):
> RootOf(х^2+1=0,х);
RootOf (_Z² + 1)> allvalues(%);
I, -I> RootOf(а*b^2+а/b,b);
RootOf(_Z³ + 1)> allvalues(%);
-1, ½ +½I√3, ½-½I√3> RootOf(x^3-1,x) mod 7;
RootOf(_Z³ + 6)> allvalues(%);
-6(1/3), ½6(1/3) - ½I√3 6(1/3), ½6(1/3) + ½I√3 6(1/3)> evalf(%);
-1.817120593, .9085602965-1.573672596 I, .908560296+1.573672596 I> RootOf(х^2-2*х+1,х) mod 5;
1Итак, функция RootOf является эффективным способом представления решения в компактном виде. Как уже отмечалось, наряду с самостоятельным применением она часто встречается в составе результатов решения нелинейных уравнений.
4.8.7. Решение уравнений со специальными функциями
К важным достоинствам Maple относится возможность решения уравнений, содержащих специальные функции как в записи исходных выражений, так и в результатах решения. Приведем несколько примеров такого рода (файл solvesf):
> restart:eqn := Psi(3*x-99) - Psi(3*x-100) + 3/х^2=0;
> r:=solve(eqn, {х});
> eqn := max(x,3*x-12)=min(10*x+8, 22-x);
eqn := max(x, - 12 + 3x) = min(10x + 8, 22 - x)> r:=solve(eqn, {x});
> map(subs,[r],eqn);
> eqn := LambertW(3*x)=ln(x);
eqn := LambertW(3x) = ln(x)> r:=solve(eqn, {x});
r:= {x = e³}> map(subs, [r], eqn);
[LambertW(3e³) = ln(e³)]> evalf(map(subs,[r], eqn));
[3.000000000 = 3.000000000]Полезно обратить внимание на не вполне обычную проверку правильности решений. Иногда при этом выводятся значения левой и правой частей уравнения, требующие осмысления полученных результатов.