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

35. Решение систем нелинейных и трансцендентных уравнений.

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

36. Поиск эсктремумов функции командой solve.

Функция solve нередко позволяет найти экстремумы в аналитическом виде как нули первой производной. Приведем примеры этого (файл extrem):

> restart:y:=ехр(-а*х)-exp(-b*x);dy:=diff(y,х);

у = e(-ax) - е(-bx) dy := -ae(-ax) + bе(-bх)

> solve(dy,x);

> restart:y:=а*х*ехр(-b*x);dy:=diff(y,х);

y := axe(-bx) dy := ae(-bx) - axbe(-bx)

> solve(dy,x);

Этот метод иногда можно распространить на случай ряда переменных. Ниже представлен такой пример для функции двух переменных:

> restart:

> z:=(х,y)-> а*х^2 + b*х*y + с*y^2 + d*(х-y);

z := (х,у)→aх² + bху + су² + d(x-y)

> xy:=solve({diff(z(x,y),x) = 0, diff(z(x,y),y) = 0},{х,y});

> z(rhs(xy[2]),rhs(xy[1]));

> simplify(%);

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

37. Поиск эсктремумов функции командой extrema.

Ряд функций служит специально для вычисления экстремумов, максимумов и минимумов функций, а также для определения их непрерывности. Одна из таких функций extrema позволяет найти экстремумы выражения expr (как максимумы, так и минимумы) при ограничениях constrs и переменных vars, по которым ищется экстремум:

extrema(expr, constrs)

extrema(expr, constrs, vars)

extrema(expr, constrs, vars, 's')

Ограничения contrs и переменные vars могут задаваться одиночными объектами или списками ряда ограничений и переменных. Найденные координаты точки экстремума присваиваются переменной 's'. При отсутствии ограничений в виде равенств или неравенств вместо них записывается пустой список {}.

Эта функция в предшествующих версиях Maple находилась в стандартной библиотеке и вызывалась командой readlib(extrema). Но начиная с Maple 7 ее можно использовать без предварительного объявления. В этом убеждают приведенные ниже примеры (файл extrema):

> restart:

> z:=(х,y)-> а*х^2 + b*x*y + с*y^2 + d*(х-y);

z:= (х,у)→ах² + bxy + су² + d(х - y)

> extrema(z(х,y),{},{х,y},'s');

> s;

> extrema(а*х^2+b*х+с,{},x,'s');s;

> extrema(х*ехр(-х),{}, х, 's'); s;

{e(-1)} {{x = 1}}

> extrema(sin(x)^2,{},x,'s');s;

{0,1} {{x=0}, {хπ}}

> extrema(х+у/z,х^2+у^2+z^2=1,{x,y,z},'s');s;

{max(1 - RootOf(_Z4 + 1)2, - 1 + RootOf(_Z4 + 1)2), min(1 - RootOf(_Z4 + 1)2, -1 + RootOf(_Z4 + 1)2)} {{z = RootOf(_ Z4 + 1), x = -1, у = RootOf(_Z4 + 1)3}, {x = 1, z= RootOf(_ Z4 + 1), у = - RootOf(_ Z4 + 1)3}}

> evalf(%);

{{x = -1., у = -0.7071067812+0.7071067812 I, z = 0.7071067812+0.7071067812 I},{z = 0.7071067812+0.7071067812 I, x = 1., у = 0.7071067812-0.7071067812 I}}

Как видно из приведенных примеров, функция extrema возвращает как значения экстремумов, так и значения аргументов, при которых экстремумы наблюдаются. Обратите внимание, что в первом примере результат вычисления экстремума функции z(x,y) оказался тем же, что и в предшествующем разделе. Это говорит в пользу применения функции extrema.

Для проверки оптимизационных алгоритмов существует ряд тестовых функций. Одна из таких функций — функция двух переменных Розенброка. В представленном ниже примере она задана как rf(x,y):

> rf:= (x,у)->100*(у-х^2)^2+(1-х)^2;

rf:=(x,.y)→100(y-x²)²+(1-x)²

> extrema(rf(х,у),{х,у},'s');s;

{{y = -RootOf f(_ Z4 + 1)3, х = 1, z = RootOf(_Z4 + 1)}, {x = -1, у = RootOf(_Z4 + 1)3, z = RootOf(_Z4 + 1)}}

> evalf(%);

{{y = 0.7071067812-0.7071067812, x = 1., z =0.7071067812+0.7071067812 I}, {z = 0.7071067812+0.7071067812 I, x = -1.,y = -0.7071067812+0.7071067812 I}}

Как нетрудно заметить, минимум этой функции при значениях x=у=1, равный 0, функцией extrema явно не обнаружен. Однако это не недостаток данной функции, а просто неудачное ее применение. Функция Розенброка имеет минимум значения и для его обнаружения надо использовать функцию minimize, описанную ниже.

Функция extrema дает неплохие результаты при поиске экстремумов простых аналитических функций, не имеющих особенностей. Однако при анализе сложных функций, содержащих функции со сравнением аргумента (например, abs(x), signum(x) и др.) функция extrema часто отказывается работать и просто повторяет запись обращения к ней.

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