Тверской государственный университет
Опубликован: 02.12.2009 | Доступ: свободный | Студентов: 3450 / 677 | Оценка: 4.41 / 4.23 | Длительность: 09:18:00
ISBN: 978-5-9963-0259-8
Лекция 6:

Массивы

Массивы и классические алгоритмы математики

Полиномы

Полиномом n-й степени P_n(x) называют функцию:

P_n(x)=a_n x^n+a_{n-1}x^{n-1}+\ldots+a_1 x+a_0 ( 6.1)

Если рассматривать график этой функции на плоскости, то x и P_n(x) - это декартовы координаты точек графика функции. Значения a_k (k из интервала [0,n]) называются коэффициентами полинома. Все они принадлежат одному типу и при программной работе с полиномами представляются одномерным массивом с n+1 элементами.

Если задан массив коэффициентов полинома A, то вычислить значение полинома в точке x не представляет особой сложности. Но ни один уважающий себя программист не позволит себе вычислять значение полинома, буквально пользуясь схемой 6.1, требующей n-1 операций возведения в степень, n операций умножения и n операций сложения. Прекрасный пример того, как можно упростить алгоритм, дает схема Горнера, вообще не требующая возведения в степень. В этой схеме полином P_n(x) представляют в виде:

P_n(x)=(\ldots(a_n)x+a_{n-1})x+\ldots+a_1)x+a_0 ( 6.2)

Удобнее представлять схему Горнера в рекуррентной форме:

P_0=a_n;\\ P_k=P_{k-1}x+a_{n-k};\quad k=1\ldots n

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

Если P_n(x) - полином n-й степени с коэффициентами a_i, Q_n(x) - полином n-й степени с коэффициентами b_i и P_n(x) = Q_n(x), то из этого следует равенство соответствующих коэффициентов:

(P_n(x)=Q_n(x))\Rightarrow(a_i=b_i;\; \forall_i=0\ldots n) ( 6.3)

Многие задачи над полиномами связаны с определением их корней. Напомню, x_0 является корнем полинома, если P_n(x_0) = 0. У полинома n-й степени не более чем n действительных корней. Если n - нечетно, то полином имеет хотя бы один действительный корень. Все корни полинома принадлежат некоторому конечному интервалу [c, d]. Вне этого интервала поведение полинома определяется его старшим членом - a_n x^n. Для полинома четной степени обе ветви уходят в +\infty, если a_n >0 и в -\infty, если a_n<0. Для полинома нечетной степени ветви полинома вне интервала [c, d] разнонаправлены. Если a_n>0, то правая ветвь уходит в +\infty, а левая ветвь - в -\infty. Если a_n<0, то левая ветвь уходит в +\infty, а правая ветвь - в -\infty.

Когда по каким-либо физическим соображениям интервал [c, d] известен хотя бы приблизительно, задача нахождения корней полинома облегчается, в противном случае она может быть довольно трудной, особенно для случая близко расположенных корней.

Исследование интервала

Рассмотрим один из простых алгоритмов, исследующих, существует ли на заданном интервале [e, f] хотя бы один корень. Один корень заведомо существует, если полином на концах исследуемого интервала имеет разные знаки или один из концов интервала уже является корнем полинома. Это условие и будет характерным признаком поиска нужного интервала. Если исходный интервал [e, f] удовлетворяет характерному признаку, то задача решена и такой интервал найден. В противном случае в цикле по k вычислим h = L/2^k, где L - длина исходного интервала ( L= f-e ). Затем организуем внутренний цикл, в котором проверим характерный признак на всех интервалах длины h. Если интервал будет найден, то вычисления завершаются, в противном случае переходим к следующему шагу цикла по k, производя очередное дробление h. Завершение цикла по k означает, что если исследуемый интервал [e, f] и содержит корни, то это близкие пары корней, отстоящие друг от друга на расстояние, меньшее h - заключительной длины интервала по завершении цикла по k.

Приведу несколько практических рекомендаций, полезных при реализации этой схемы. Внутренний цикл следует организовать так, чтобы не повторять вычисление полинома в тех точках, в которых это вычисление проводилось на предыдущих шагах цикла. Это означает, что когда шаг h = L/2^k, то во внутреннем цикле достаточно вычислить значение полинома не более чем в 2^{k-1} точках. Внешний цикл достаточно ограничить числом в интервале от 10 до 20, поскольку уже при k=10 величина исходного интервала L уменьшится более чем в 1000 раз, что вполне достаточно в большинстве практических ситуаций. Хотя следует помнить, что в ряде ситуаций практики приходится иметь дело с резко осциллирующими функциями, где близкие корни являются правилом, а не исключением.

Алгоритмы нахождения корня полинома

Рассмотрим несколько простых схем нахождения корня полинома. Заметим, что все эти схемы применимы к нахождению корней любых функций, а не только полиномов. Как всегда в программировании, речь идет не столько о точном нахождении корня, сколько о нахождении корня с заданной точностью \varepsilon. Так что, если x_0 - это точное значение корня, то нам достаточно найти x* - такое, что |x_0 - x*| < \varepsilon.

Схема дихотомии отрезка (деление пополам)

Эта схема прекрасно подходит, когда предварительно проведено исследование интервала существования корня и найден такой интервал [e, f], на концах которого полином принимает разные знаки, так что существует корень внутри интервала. Если исходный интервал мал и сравним с заданной точностью \varepsilon, то в качестве корня можно выбрать середину этого интервала. Если же исходный интервал больше, чем значение \varepsilon, то интервал можно разделить пополам и из двух половинок выбрать ту, для которой выполняется характерный признак существования корня. Понятно, что если признак выполняется для всего интервала, то он обязательно будет выполняться для одной из его половинок. Деление отрезка пополам приводит к быстрому уменьшению длины отрезка, так что 10-20 делений достаточно, чтобы найти интервал длины, меньшей \varepsilon, а следовательно, и корень полинома с заданной точностью.

Метод простой итерации

Формально метод применим и в том случае, когда неизвестен интервал, в котором существует корень функции. Пусть x_0 - некоторое заданное начальное приближение к корню полинома. Тогда можно построить следующий итерационный процесс:

x_k=x_{k-1}-f(x_{k-1});\quad k=1,2,\ldots

Метод записан для произвольной функции f, в нашем случае функция f задана полиномом. Итерационный процесс следует прекращать либо по достижении заданной точности, либо по достижении максимально допустимого числа итераций N. Заметьте, следует задавать оба условия, поскольку сходимость процесса простой итерации к корню, даже если он существует, не гарантируется. Во многом все зависит от удачного выбора начального приближения.

Метод простой итерации обладает полезным свойством "неподвижной точки". Корни функции являются "неподвижными точками" метода. Нетрудно заметить, что если на некотором шаге x_{k-1} сошлось к корню полинома x*, то x_k и все последующие итерации будут равны x*, так что итерационный процесс из найденного корня не уходит.

Метод Ньютона

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

x_k=x_{k-1}-\frac{f(x_{k-1})}{f'(x_{k-1})};\quad k=1,2,\ldots

Понятно, что производной от полинома n-й степени будет полином степени n-1, коэффициенты которого легко вычисляются по n и коэффициентам исходного полинома. Все, что было сказано о методе простой итерации - завершение процесса, обладание неподвижной точкой, - справедливо и для метода Ньютона.

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?