Математический анализ в Maple 9



Решение уравнений

Встроенные функции Maple при аналитическом решении уравнений исключительно эффективны. При решении уравнений в численном виде это справедливо вдвойне. В последнем случае может быть полезна процедура fsolveQ. Первым ее параметром указывается решаемое уравнение или система уравнений, после чего следует ввести переменную, относительно которой решается уравнение, или множество переменных для системы уравнений. Кроме того, с процедурой допускается использование некоторых опций. Эти опции описаны ниже в табл. 7.3.

Таблица 7.3. Опции процедуры f solve ()

Опция

Описание

avoid

В качестве значения этой опции указывается список равенств, определяющих те значения переменной (или переменных), которые следует игнорировать при поиске решения

complex

Если указать эту опцию, поиск решений будет осуществляться на множестве комплексных чисел

fulldlgits

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

maxsols

Эта опция используется при работе с полиномами. Ее значением указывается число определяемых процедурой корней. В качестве корней выбираются наименьшие

Кроме перечисленных опций, в процедуре можно указывать интервал, на котором выполняется поиск решений. Сделать это можно двумя способами. В первом случае просто указывается диапазон, во втором — переменная и, после знака равенства, диапазон ее изменения. При поиске решения исследуются и граничные точки диапазона. Ниже приведены примеры использования процедуры fsolve() для нахождения корней полинома х(х -2)(2 +4). Прежде всего, задаем следующую функцию.

Если для поиска корней указать диапазон 0..1, то корень, соответствующий граничной точке диапазона, будет определен так.



Внимание!
Если первым аргументом процедуры fsolve)) указано не непосредственно уравнение (равенство), а выражение, то решаться будет уравнение, получаемое путем приравнивания этого выражения к нулю.

Для поиска всех корней, в том числе и комплексных, при вызове процедуры указываем опцию complex.

Однако очень часто приходится не просто искать корни уравнений, а еще и демонстрировать умение создавать соответствующие процедуры для их определения. В качестве примера рассмотрим процедуру, в рамках которой вычисление корней уравнения вида f(x) = 0 осуществляется методом половинного деления интервала. Суть метода состоит в следующем. Для поиска решения выбирается начальный интервал, на котором будет выполняться поиск решения. Поиск осуществляется, если функция f(x) на границах интервала принимает значения разных знаков. В случае непрерывной функции данный факт является гарантией того, что на интервале имеется по крайней мере один корень уравнения. Далее определяется середина интервала, а также значение функции в этой точке. Данная срединная точка становится новой граничной точкой интервала — в эту точку смещается та граница интервала, для которой знак функции совпадает со знаком функции в срединной точке. После этого для нового интервала выбирается центральная точка и т.д. Таким образом, на каждом шаге интервал, содержащий корень уравнения, уменьшается в два раза. Процесс продолжается до тех пор, пока длина интервала не станет меньше погрешности, с которой следует вычислить корень. Ниже приведен код процедуры DoublDivf), согласно которой находятся корни выражения ff. Переменная, относительно которой ищутся корни, а также интервал определяются равенством xint. Погрешность задается параметром epsilon.

Основная часть кода данной процедуры нужна для отслеживания особых ситуаций, когда в процессе поиска решения на одном из этапов пробная точка случайно совпадает с корнем. Однако прежде выполняется ряд инициализаций. Так, локальная переменная х определяется как левая часть равенства xint, указанного параметром процедуры. Переменным а и b присваиваются в качестве значений левая и правая границы диапазона, на котором ищется корень. А переменная f определяется как функциональная зависимость, соответствующая выражению, для которого ищутся корни.

Внимание!
Перед тем, как выделять функциональную зависимость процедурой unapply(), указанное параметром процедуры выражение f £ преобразуется в формат представления чисел с плавающей точкой. Для этого используется процедура evalf (). Последнее не является необходимым, но рекомендуется. Причина заключается в том, что при вычислении логических значений работать в формате представления чисел с плавающей точкой намного удобнее. Кроме того, это позволяет избежать ошибок, связанных с невозможностью аналитического исследования громоздких выражений на предмет их знака.

После определения всех необходимых параметров проверяется знак произведения значений функции на границах диапазона. Если произведение больше нуля, то, значит, функция на границах имеет значения одного знака и метод вычисления корня путем деления интервала пополам применен быть не может. В этом случае выводится сообщение соответствующего содержания. В противном случае, если произведение значений функции на границах интервала меньше нуля (ситуацию, когда такое произведение равно нулю, рассмотрим отдельно), выполняется условный оператор while. Проверяемое при этом условие состоит в том, что длина интервала превышает погрешность и одновременно значение функции в центре этого интервала не равно нулю.

Внимание!
О том, что точка х=с является центром интервала, станет известно после выполнения первой команды в операторе while. Именно там переменной с будет присвоено значение. Как правило, в таких ситуациях при работе с иными программными пакетами возникает ошибка. Но только не в Maple! Даже если переменной не присвоено значение, выражение для функции в точке будет вычислено в символьном виде. Поскольку тождественно нулю оно не равно, процедура должна работать корректно. Однако для страховки можно разместить команду инициализации переменной с до начала выполнения оператора while, например сразу после инициализации локальных переменных а и Ь, а команду присваивания нового значения этой переменной перенести в конец операторного блока.

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

Наконец, рассматривается ситуация, когда произведение значений функции на границах начального интервала равно нулю. В этой ситуации проверяется на равенство нулю значение функции в точке х=а, и если это значение равно нулю, оно и возвращается в качестве решения. В противном случае решением является граничная точка х=b.

Внимание!
Согласно определению процедуры, в том случае, если обе границы первоначального интервала одновременно являются корнями, возвращен будет тот, который соответствует первой (нижней) указанной границе диапазона.

Полученное значение для корня (переменная с) преобразуется в формат числа с плавающей точкой, а результат возвращается в виде равенства перемевиа&зиачение. Ниже приведены результаты использования разработанной процедуры для исследования полиномиального выражения.

Существуют и другие способы получения приближенных решений уравнения. Очень близок к методу половинного деления метод хорд или метод секущих. Принципиальное отличие от метода половинного деления состоит в том, что пробная точка теперь выбирается не в центре интервала, а является точкой пересечения координатной оси и секущей, проходящей через точки, определяемые значениями функции на границах интервала. По сравнению с методом половинного деления метод секущих обеспечивает более быструю сходимость итерационного процесса. К недостаткам метода можно отнести требование неизменности знака первой и второй производных в области поиска корня.

Если решаемое уравнение задается функцией f(x), а граничными точками интервала поиска являются их соответственно, то следующая пробная точка выбирается согласно соотношению. Поэтому процедура для вычисления корней уравнения методом секущих может быть получена из процедуры вычисления корней методом половинного деления, если заменить оператор присваивания значения переменной с и условие проверки точности. В качестве верхней границы для точности результата может быть выбран модуль отношения значения функции в точке предполагаемого решения (в процедуре — это f (с)) и минимального значения для производной этой функции на рассматриваемом интервале (параметр М). Вот код для этой процедуры.

Теперь воспользуемся процедурой khorda(), предварительно оценив, что производная для Fl(x) по абсолютной величине меньше ехр(-З) на рассматриваемом интервале быть не может. Эту величину, преобразованную в формат числа с плавающей точкой, и указываем последним параметром процедуры khorda().

Как видим, результаты в пределах погрешности полностью совпадают. Однако для процедуры khorda(), по сравнению с DoublDiv(), такое совпадение несколько хуже.