rukovodstvo_MathCAD / Глава 5
.docГлава 5. Вычисление корней многочлена.
Многочлены (целые рациональные функции) имеют совершенно исключительное значение в математике, поэтому вопрос о вычислении корней (нулей) многочленов целесообразно рассматривать отдельно.
В Mathcad для вычисления корней многочленов предусмотрены два способа: использование встроенной функции polyroots, работающей с числовым процессором и применение оператора solve, решающего широкий круг задач и работающего с символьным процессором.
1. Функция polyroots.
Аргументом функции polyroots является вектор-столбец коэффициентов многочлена, корни которого требуется вычислить (начиная с коэффициента при нулевой степени).
Пример 1.
Пусть
требуется вычислить корни многочлена:
![]()
Вектор-столбец
коэффициентов:


Для формирования вектора коэффициентов удобно использовать оператор coeffs из палитры Symbolic.
Пример 2.
Пусть
требуется вычислить корни многочлена:
![]()

Сформируем
вектор-столбец его коэффициентов:

Подчеркнем, что оператор coeffs не нуждается в том, чтобы многочлен был записан в канонической форме. Если многочлен задан в форме сумм и произведений (см. пример 3), то оператор coeffs сам преобразует его к канонической форме и сформирует вектор коэффициентов.
Замечание. Для того, чтобы представить многочлен в канонической форме служит оператор collect из палитры Symbolic.
Пример 3.
Пусть
дан многочлен:
![]()
Построим
вектор-столбец его коэффициентов:

Теперь
представим многочлен q(x) в канонической
форме:
![]()

По умолчанию для поиска корней полинома используется метод ЛаГерра (LaGuerre), но функция polyroots может использовать также и метод матриц-компаньонов. Чтобы выбрать именно этот метод, поставьте курсор мыши на функцию polyroots и щелкните правой кнопкой мыши. Теперь вам достаточно выбрать пункт Companion Matrix из всплывающего меню. Какой из двух численных методов выбрать? Почему Mathcad отдает предпочтение методу LaGuerre, а не Companion Matrix? Теория численных методов не дает однозначного ответа на первый вопрос. В приведенных ниже примерах метод Companion Matrix демонстрирует более высокую точность, чем метод LaGuerre. Но это ничего не доказывает. Можно только отметить, что в силу ряда причин точность метода LaGuerre резко падает с возрастанием степени многочлена. Что касается второго вопроса, то, по-видимому, разработчики численного процессора Mathcad исходили из того, что метод LaGuerre имеет репутацию исключительно надежного метода счета. На наш взгляд, за исключением очень простых случаев, целесообразно вычислять корни двумя методами, а затем, подставив полученные значения корней в многочлен, оценить точность (см. пример 4).
Пример 4.
Пусть
дан многочлен:
![]()
Построим
вектор-столбец его коэффициентов:

Используем
вначале метод LaGuerre:
Теперь
воспользуемся методом Companion Matrix:


Заканчивая описание функции polyroots, отметим одно ее чрезвычайно важное свойство. Функция polyroots может вычислять корни многочленов с комплексными коэффициентами (см. пример 5).
Пусть
дан многочлен:
![]()
Построим
вектор-столбец его коэффициентов:
Используем
вначале метод LaGuerre:
Теперь
воспользуемся методом Companion Matrix:



2. Оператор solve.
Оператор solve исключительно прост в использовании. Не требуется формировать вектор коэффициентов, достаточно записать многочлен (необязательно в канонической форме), а затем ввести оператор solve из палитры Symbolic.
Так как оператор solve работает с символьным процессором, необходимо учитывать, что, в зависимости от вида операнда, задача будет решаться точно или численным методом. Если вместе с оператором solve используется оператор float, символьный процессор использует численный метод.
Замечание. Если символьный процессор, получив инструкцию решить задачу точно, не смог найти решение, он, не прибегая к помощи численного процессора для поиска приближенного решения, выдаст сообщение “No solution found” (решение не найдено).
Оператор solve (если вместе с ним не используется оператор float) даст указание символьному процессору найти корни уравнения точно, если все числа в многочлене записаны без десятичной точки. Кроме целых чисел в записи многочлена могут содержаться радикалы из целых положительных чисел, а также символы π и е.
Что понимает символьный процессор под точным определением корней? Очевидно, что в том случае, когда все корни уравнения рациональные числа, их следует вычислить без погрешности. Но, кроме этого, символьный процессор может записать корни в форме радикалов, а если это не удается, в форме тригонометрических выражений (см. пример 6).
![]()



Если коэффициенты многочлена содержат десятичную точку, то символьный процессор получит указание найти численные значения корней и записать их, используя двадцатиразрядные числа.
Замечание. В Mathcad 14.0 вы получите тот же результат, но в показательной форме.
Какой численный метод использует Mathcad для нахождения корней? К сожалению, фирма MathSoft не сообщает этого пользователю. (Вообще, «Руководство пользователя» и справочная система Mathcad ничего не сообщают о методах, используемых в работе символьного процессора.)
В целом, корни многочленов с действительными коэффициентами символьный процессор находит точнее, чем численный процессор.
Отметим одну деталь. Иногда при вычислении кратных корней символьный процессор сообщает пользователю только об одном из них (см. пример 7).
![]()
![]()
![]()
![]()
![]()



Если многочлен имеет комплексные коэффициенты, то использование оператора solve может не дать результата. До 14-той версии Mathcad при вычислении корней многочлена с комплексными коэффициентами оператор solve зачастую выдает только один корень. Но он может, вообще говоря, найти и все n корней (если многочлен ему понравится). (См. примеры 8 и 9).
![]()
![]()
Ограничим
число разрядов в ответе:

Оператор float, задающий число разрядов в получаемом символьным процессором результате, также как и оператор solve берется из палитры Symbolic.
Замечание. Mathcad 14.0 в этом случае найдет все пять корней многочлена.
Пример 9.
Дан
многочлен:
Найдем
его корни с помощью оператора solve:
![]()

3. Проблемы при вычислении корней многочлена.
При использовании любого численного метода принципиально возможны два дефекта:
-
низкая точность вычисления корней;
-
зацикливание, когда вообще не удается получить результат.
Сложность задачи вычисления корней зависит от:
-
близости корней. Чем меньше расстояние между корнями, тем труднее задача.
-
степени многочлена. Чем выше степень, тем труднее получить значения всех корней с высокой точностью.
Задача вычисления корней многочлена очень чувствительна к изменению значений коэффициентов.
Рассмотрим два многочлена:
h1(z) = (z - 2)3 = 0 и h2(z) = (z - 2)3 – 10-6 = 0
Значения младших коэффициентов многочленов h1(z) и h2(z) различаются на 0.000001. А значения корней –на 0.01, причем два корня стали комплексными!
|
h1(z) |
h2(z) |
|
z1 = 2 |
z1 = 2.0100 |
|
z2 = 2 |
z2 = 1.9950 + i·0.0087 |
|
z3 = 2 |
z3 = 1.9950 - i·0.0087 |
Итоговые упражнения.
-
Найти все коэффициенты многочлена: (x-2)·(x-3.7)·(x-5) и представить его в канонической форме.
-
Найти все корни многочлена: 1.7x6 + 3.8x4 –5.7x3 + 1.9x2 – 0.4x +1.1 = 0.
-
Найти все корни многочлена: z5-1=0 различными способами.
-
Найти все корни многочлена: z3+(3.2-1.4i)·z+1=0
