Читать контрольная по математике: "Методы нахождения корней полиномов" Страница 3
очень усложняется. Эта схема основывается на следующем представлении многочлена:
p(x) = (( ... ((anx + an-1)x + an-2)x + ... + a2)x + a1)x + a0. Займемся общим многочленом вида: p(x) = anxn + an-1xn-1 + an-2xn-2 + ... + a2x2 + a1x + a0. Мы будем предполагать, что все коэффициенты an, ..., a0 известны, постоянны и записаны в массив. Это означает, что единственным входным данным для вычисления многочлена служит значение x, а результатом программы должно быть значение многочлена в точке x. Стандартный алгоритм вычисления прямолинеен:
Evaluate(x)
xточка, в которой вычисляется значение многочлена result = a[0] + a[1]*x
xPower = x
for i = 2 to n do
xPower = xPower*x
result = result + a[i]*xPower
end for
return result Этот алгоритм совершенно прозрачен и его анализ очевиден. В цикле for содержится два умножения, которые выполняются n - 1 раз. Кроме того, одно умножение выполняется перед циклом, поэтому общее число умножений равно 2n - 1. В цикле выполняется также одно сложение, и одно сложение выполняется перед циклом, поэтому общее число сложений равно n.
Вы можете легко проверить, что это представление задает тот же многочлен, что и выше. Соответствующий алгоритм выглядит так:
HornersMethod(x)
xточка, в которой вычисляется значение многочлена
for i = n - 1 down to 0 do
result = result*x
result = result + a[i]
end for
return result
Цикл выполняется n раз, причем внутри цикла есть одно умножение и одно сложение. Поэтому вычисление по схеме Горнера требует n умножениё и n сложений - двукратное уменьшение числа умножений по сравнению со стандартным алгоритмом.
Предварительная обработка коэффициентов
Результат можно даже улучшить, если обработать коэффициенты многочлена до начала работы алгоритма. Основная идея состоит в том, чтобы выразить многочлен через многочлены меньшей степени. Например, для вычисления значения x256 можно воспользоваться таким же циклом, как и в функции Evaluate в начале этой статьи; в результате будет выполнено 255 умножений. Альтернативный подход состоит в том, чтобы положить result = x*x, а затем семь раз выполнить операцию result = result*result. После первого выполнения переменная result будет содержать x4, после второго x8, после третьего x16, после четвертого x32, после пятого x64, после шестого x128, и после седьмого x256.
Для того, чтобы метод предварительной обработки коэффициентов работал, нужно, чтобы многочлен был унимодальным (то есть старший коэффициент an должен равняться 1) , а степень многочлена должна быть на единицу меньше некоторой степени двойки (n = 2k - 1 для некоторого k > 1). В таком случае многочлен можно представить в виде: p(x) = (xj + b)q(x) + r(x), где j = 2k-1. (1)
В обоих многочленах q и r будет вдвое меньше членов, чем в p. Для получения нужного результата мы вычислим по отдельности q(x) и r(x), а затем сделаем одно дополнительное умножение и два сложения. Если при этом правильно выбрать значение b, то оба многочлена q и r оказываются унимодальными, причем степень каждого из них позволяет применить к каждому из них ту же самую процедуру. Мы увидим, что ее последовательное применение позволяет сэкономить вычисления.
Вместо того, чтобы вести речь о многочленах общего вида, обратимся к примеру. Рассмотрим многочлен: p(x) = x7 + 4x6 - 8x4 + 6x3 + 9x2 + 2x - 3. Определим сначала множитель xj + b в уравнении (1). Степень многочлена p равна 7, то есть 23 - 1, поэтому k = 3. Отсюда вытекает, что j = 22 = 4. Выберем значение b таким образом, чтобы оба многочлена q и r
Похожие работы
Интересная статья: Основы написания курсовой работы

(Назад)
(Cкачать работу)