Maple 9.5/10 в математике, физике и образовании - Владимир Дьяконов
Шрифт:
Интервал:
Закладка:
> AA:=subs(А0=5,omega0=10,m=1, gamma=1, А);
> AAprime :=diff(АА, omega);
> ss1:=solve(AAprime=0,omega);
> evalf(ss1);
0., 9.974968670 , -9.974968670Нетрудно подметить, что частота пика амплитудно-частотной характеристики чуть меньше частоты собственных колебаний системы.
5.1.5. Поиск экстремумов с помощью функции 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 часто отказывается работать и просто повторяет запись обращения к ней.
5.1.6. Поиск минимумов и максимумов аналитических функций
Часто нужно найти минимум или максимум заданной функции. Для поиска минимумов и максимумов выражений (функций) expr служат функции стандартной библиотеки:
minimize(expr, opt1, opt2, ..., optn)
maximize(expr, opt1, opt2, ..., optn)
Эти функции могут разыскивать максимумы и минимумы для функций как одной, так и нескольких переменных. С помощью опций opt1, opt2, …, optn можно указывать дополнительные данные для поиска. Например, параметр 'infinity' означает, что поиск минимума или максимума выполняется по всей числовой оси, а параметр location (или location=true) дает расширенный вывод результатов поиска — выдается не только значение минимума (или максимума), но и значения переменных в этой точке.
Примеры применения функции minimize приведены ниже (файл minmax):
> minimize(х^2-3*х+y^2+3*y+3);
> minimize(х^2-3*х+y^2+3*y+3, location);
> minimize(х^2-3*х+y^2+3*y+3, х=2..4, y=-4..-2, location);
-1, {[{х = 1, y = -2}, -1]}> minimize(х^2+y^2,х=-10..10,y=-10..10);
0> minimize(х^2 + y^2,х=-10..10,y=-10..10, location);
0, {[y = 0, х = 0},0]}> minimize(abs(х*ехр(-х^2)-1/2), х=-4..4);
½-½√2 е(-1/2)> minimize(abs(х*ехр(-х^2)-1/2), х=-4..4, location=true);
Приведем подобные примеры и для функции поиска максимума — maximize:
> maximize(х*ехр(-х));
е(-1)> maximize(х*ехр(-х),location);
е(-1), {[{х=1}, е(-1)] }> maximize(sin(х)/х,х=-2..2,location);
1, {[{x=0}, 1]}> maximize(exp(-х)*sin(y),х=-10..10,y=-10..10, location);
Обратите внимание на то, что в предпоследнем примере Maple 9.5 выдал верный результат, тогда как Maple 8 в этом примере явно «оскандалился» и вместо максимума функции sin(x)/x, равного 1 при x=0, выдал результат в виде бесконечности:
∞, {[{x =0}, ∞]}Эта ситуация кажется более чем странной, если учесть, что в этом примере еще Maple 6 давал правильный результат. Это еще один пример, показывающий, что в отдельных случаях Maple может давать неверные результаты.
Применим функцию minimize для поиска минимума тестовой функции Розенброка. Рис. 5.2 показывает, что minimize прекрасно справляется с данной задачей. На рис. 5.2 представлено также построение функции Розенброка, хорошо иллюстрирующее ее особенности.
Рис. 5.2. Поиск минимума функции Розенброка и построение ее графика
Трудность поиска минимума функции Розенброка связана с ее характерными особенностями. Из рис. 5.2 видно, что эта функция представляет собой поверхность типа «глубокого оврага с почти плоским дном», в котором и расположена точка минимума. Такая особенность этой функции существенно затрудняет поиск минимума. То, что система Maple 9.5 справляется с данной тестовой функцией, вовсе не означает, что трудности в поиске минимума или максимума других функций остаются позади.
5.1.7. Поиск минимума функций с ограничениями методом выпуклого программирования
Часто необходимо найти минимум некоторой функции при наличии ограничений на значения независимых переменных. Ниже рассматривается нетривиальная задача такого рода, решаемая методом выпуклого программирования (разновидность нелинейного программирования) — файл minp.
Пусть надо найти минимум функции f:=х1^2+(х2–1)^2 при следующих ограничениях: 2x1+х2>=7, x1+2*х2>=5, x1>=0 и х2>=0. Составим на основе этого функцию Лагранжа:
> F:=x1^2+(х2-1)^2+y1*(7-2*х1-х2)+y2*(5-х1-2*х2);
F:= x1² + (х2-1)² + у1(7-2х1-х2) + у2(5-х1-2х2)и найдем ее частные производные:
> F1:=diff(F,x1);
F1:=2x1-2y1-y2> F2:=diff(F,x2);
F2:=2x2 -2-y1-2y2> F3:=dxff(F,y1);
F3:=7-2x1-x2> F4:=diff(F,y2);
F4:=5-x1-2x2Соберем воедино все равенства и неравенства этой задачи:
> eq:={Fl=u1,F2=u2,x1*F1,x2*F2,F3+v1,F4+v2,y1*F3,y2*F4,
x1>=0,x2>=0,y1>=0,y2>=0,u1>=0,u2>=0,v1>=0,v2>=0};
eq := {2x1-2y1-y2=u1, 2x2-2-y1-2y2=u2, 7-2x1-x2+v1, 5-x1-2x2+v2, y1(7-2x1-x2), y2(5-x1-2x2), x1(2x1-2y1-y2), x2(2x2-2-y1-2y2), 0≤x1, 0≤x2, 0≤y1, 0≤y2,0≤u1,0≤v1, 0≤v2, 0≤u2}Первые шесть равенств соответствуют теореме Куна-Такера о том, что в точке минимума существуют целые неотрицательные числа u1, u2, v1 и v2 для которых выполняются эти шесть равенств (обратите внимание на то, что запись только левой части равенства означает, что она приравнивается к 0). Теперь с помощью функции solve можно найти решение данной задачи:
> solve(eq,{x1,х2,y1,y2,u1,u2,v1,v2});
Таким образом, на указанном множестве функция достигает минимума в точке (12/5, 11/5).
5.1.8. Анализ функций на непрерывность
Для исследования функций на непрерывность (отсутствие разрывов) Maple имеет функцию iscont, записываемую в ряде форм:
iscont(expr, х = а..b)
iscont(expr, х = а..b, 'closed')
iscont(expr, х = а..b, 'open')
Она позволяет исследовать выражение expr, заданное в виде зависимости от переменной х, на непрерывность. Если выражение непрерывно, возвращается логическое значение true, иначе — false. Возможен также результат типа FAIL. Параметр 'closed' показывает, что конечные точки должны также проверяться, а указанный по умолчанию параметр 'open' — что они не должны проверяться.