Исследование функции на экстремум подразумевает, как известно, нахождение производной и определение точек, в которых эта производная равна нулю. Далее, по знаку второй производной в найденных точках, определяется тип экстремума — максимум или минимум (если вторая производная меньше нуля — максимум, если больше нуля — минимум).
Задача 2.18
Исследовать на экстремум функцию у(х) = хm(1-х)n.
Сначала определим саму функцию.
Затем найдем ее производную.
Последняя как несложно проверить, равна следующему.
Выражение можно было бы упростить, но для решения поставленной задачи это не представляется необходимым. Далее определяем точки, в которых производная равна нулю. Воспользуемся процедурой solve(), в качестве параметров которой указываем решаемое уравнение и переменную, относительно которой это уравнение следует решить.
В данном случае экстремум предполагается только в одной точке — в ней производная равна нулю. Это легко проверить. Поступим следующим образом.
Выше переменной х присвоено значение, при котором производная функции должна равняться нулю. Переменная m возвращает значение производной в точке х, а этой переменной только что было присвоено значение.
Полученное выражение достаточно громоздко, однако вводить в заблуждение это не должно. После упрощения получаем, как и ожидалось, нуль.
Для определения типа экстремума нужно определить значение второй производной в этой точке. Вторая производная равна:
В этом случае вместо переменной х использована новая переменная t. Объясняется это довольно просто — переменной х было присвоено значение, после чего она, так сказать, стала числом. По числу дифференцировать нельзя. Поэтому существовало две альтернативы: либо "восстановить" переменную х с помощью команды х: = 'х', либо использовать новую переменную, что и было сделано.
Поскольку интерес представляет значение второй производной в конкретной точке, следует выполнить команду присвоения (после этой команды t автоматически будет определять нужную точку).
Переменная среды %% возвращает результат выполнения предпоследней команды, т.е. значение второй производной, но уже в нужной точке (по-скольку предьщущей командой параметру t было присвоено соответствующее Значение).
После упрощения получаем следующее.
Для определения типа экстремума важен знак полученного выражения. Определяется этот знак с помощью процедуры sign().
Поскольку выражение отрицательно, приходим к выводу, что найденная точка является точкой максимума.
Процедуру исследования функции на экстремум можно практически полностью переложить на плечи Maple.
Задача 2.19
Найти экстремумы функций.
Сразу определим процедуру, которая и возьмет на себя основную работу по исследованию функции на экстремум. Комментарии к процедуре размещены ниже.
Параметром процедуры является функция (f), исследуемая на экстремум. После зарезервированного слова local перечисляются локальные переменные (они доступны и используются только внутри процедуры): х — чтобы задать аргумент функции f; s — для записи значения исследуемой на экстремум точки; переменные А и В нужны при работе со второй производной в точке предполагаемого экстремума; ListOf Points — список точек предполагаемого экстремума; и, наконец, ResultList — список результатов исследования по каждой точке.
В первую очередь в процедуре определяются точки предполагаемого экстремума. Для этого находятся точки, в которых производная равна нулю (solve(diff (f (x),x)=0,x); здесь результатом операции является последовательность решений), а результат этого вычисления, заключенный в квадратные скобки (это уже список), присваивается в качестве значения переменной ListOf Points. Таким образом, все точки, исследуемые на экстремум, являются элементами списка ListOf Points.
На следующем шаге инициализируется переменная ResultList (в качестве начального значения ей присваивается пустой список). Далее идет один большой оператор цикла (начинается с for ... do и заканчивается end do). В рамках этого оператора перебираются все значения s из списка ListOfPoints (for s in ListOfPoints), т.е. с помощью переменной s пересматриваются точки, в которых производная функции равна нулю. Для каждой из этих точек сначала вычисляется вторая производная (в виде общей зависимости от х), затем переменной х присваивается значение исследуемой на экстремум точки, переменной А — значение второй производной в этой точке, а переменной В присваивается это же значение, но в формате числа с плавающей точкой — для этого используется процедура evalf(), которая преобразует указанное в качестве ее аргумента выражение в формат числа с плавающей точкой. Переменная В будет использоваться в условных операторах (if) при проверке знака второй производной в данной точке.
На заметку
Дело в том, что Maple пытается получить решение уравнения, в котором производная приравнена к нулю, в аналитическом виде. Но если такое аналитическое выражение в дальнейшем нужно исследовать на предмет того, больше оно нуля или нет, исследование это будет проводиться согласно правилам преобразования алгебраических выражений, т.е. тоже аналитически. Может оказаться, что Maple будет не в состоянии преобразовать выражение настолько, чтобы стало очевидно, больше оно нуля или нет. Кроме того, на такие преобразования может уйти много времени. Поэтому и используется переменная В; при сравнении чисел в форме с плавающей точкой используются другие алгоритмы, которые работают быстрее.
Далее следует структура из вложенных условных операторов (структура if ... fi).
На заметку
Вместо структуры окончания условного оператора if можно использовать конструкцию end if. Так, безусловно, длиннее, зато понятнее!
Если вторая производная в точке меньше нуля (В<0), в список результатов вводится запись с указанием точки и того, что это точка максимума, а в случае В>0 — что это точка минимума. Если же В=0, вносится запись о том, что необходимо дополнительное исследование. (В этих случаях необходимо осуществлять поиск производных более высоких порядков.) Объединение строк при этом выполняется с помощью процедуры cat(). Данная процедура используется для объединения строк и названий и формирует результат в виде строки (названия), в которой объединены все ее аргументы в порядке следования. Например, рассмотрим команду cat ("в точке х=", convert (x, string ),"-максимум "). Первый и третий аргументы процедуры cat() заключены в двойные кавычки и являются строками. Они будут объединены в таком виде, как есть. Интерес представляет второй аргумент процедуры cat() — процедура convert(), которая используется для преобразования типов. Первый ее аргумент (х) является числовым (или символьным) значением точки, исследуемой на экстремум. Это значение преобразуется в строчной формат, о чем свидетельствует опция string. Поэтому в результате объединения получаем строку вида "в точке х=значение — максимум". Такие строки и составляют список ResultList, т.е. являются элементами этого списка.
После условных операторов, но перед окончанием оператора цикла (напоминаем, заканчивается конструкцией end do) размещается команда "восстановления" переменной х (х: = 'х'); иначе на следующем этапе нельзя было бы вычислить производную второго порядка по х. Наконец, последней командой в теле процедуры выводится список с результатами исследования.
Теперь с помощью описанной процедуры можем исследовать на экстремум следующие функции:
Внимание!
Как можно видеть, сообщение о том, что в точке х=2 необходимо дополнительное исследование, выведено дважды. Причина в том, что при вычислении производной и определении точек, где она равна нулю, корень х=2 имеет двойную кратность, поэтому процедура solve () в последовательности решений этот корень выводит дважды; отсюда и два сообщения. Во избежание этого следовало бы определить переменную ListOf Points не как список, а как множество. Тогда два одинаковых решения будут интерпретироваться как один элемент множества.
Не составляет большого труда написать процедуру, которая при исследовании функции на экстремум будет вычислять, если это необходимо, и производные более высоких порядков, чем второй. Принципиально нового ничего в этом нет, поэтому читатель при желании может сделать это самостоятельно.