Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MAPLE.doc
Скачиваний:
221
Добавлен:
24.03.2015
Размер:
1.52 Mб
Скачать

22. Системы нелинейных и трансцендентных уравнений. Решение уравнений в численном виде. Решение систем нелинейных и трансцендентных уравнений

Функция 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 имеет и еще ряд возможностей для проверки решений, но представленных обычно вполне достаточно для такой проверки. Ее следует принять за правило при выполнении решений уравнений.

Решение в численном виде — функция fsolve

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

fsolve(eqns, vars, options)

Эта функция может быть использована со следующими параметрами:

complex — находит один или все корни полинома в комплексной форме; fulldigits — задает вычисления для полного числа цифр, заданного функцией Digits;

maxsols=n — задает нахождение только n корней;

interval — задается в виде а..b или х=а..b или {x=a..b, y=c..d, …} и обеспечивает поиск корней в указанном интервале.

Функция fsolve дает решения сразу в форме вещественных или комплексных чисел, что и показывают следующие примеры (файл fsolve):

> fsolve(sin(х)=Pi/4,х);

.9033391108

> fsolve(sin(х)=1/2,х=4..8);

6.806784083

> fsolve(2*х^2+х-1=10,x);

-2.608495283, 2.108495283

> fsolve(х^5-х,x);

-1., 0., 1.000000000

> fsolve(х^5-х,x,complex);

-1.000000000, -1.000000000 I, 0., 1.000000000 I, 1.000000000

> eqns := abs(x)*x+exp(x) > 0;

eqns:= 0 <|x|x +ex

> solve(eqns, {x});

{-2 LambertW(½)<x}

> f := sin(x+y) — exp(x)*y = 0: g := x^2 - у = 2:

fsolve{{f,g},{x,y},{x=-1..1,y=-2..0});

{x = -.6687012050, у = -1.552838968}

Заметим, что локализация поиска корней в заданном интервале позволяет отыскивать такие решения, которые не удается получить с помощью функций solve и fsolve в обычном применении. В последнем из приведенных примеров дается решение системы нелинейных уравнений, представленных уравнениями f и g.

Чтобы еще раз показать различие между функциями solve и fsolve, рассмотрим пример решения с их помощью одного и того же уравнения erf(x) = 1/2:

> solve(erf(х)=1/2,х);

RootOf(2 erf(_Z) -1)

> fsolve(erf(x)=1/2);

.4769362762

Функция solve в этом случае находит нетривиальное решение в комплексной форме через функцию RootOf, тогда как функция fsolve наводит обычное приближенное решение.

Мы уже отмечали, что функция solve дает решение уравнения ехр(-х) = х в форме специальной функции Ламберта. Нетрудно заметить, что функция fsolve дает результат сразу в форме числа с плавающей точкой:

> restart;eq:=exp(-х)=х;sol:=fsolve(ехр(-х)=х,х);

eq: = e(-x) = х sol: =0.5671432904

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]