2 Схема Горнера
Вычисление по схеме Горнера оказывается более эффективным, причем оно не очень усложняется. Эта схема основывается на следующем представлении многочлена:
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 были унимодальными. Для этого нужно посмотреть на коэффициенты aj-1 в p и положить b = aj-1 - 1. В нашем случае это означает, что b = a3 - 1 = 5. Теперь мы хотим найти значения q и r, удовлетворяющие уравнению:
x7 + 4x6 - 8x4 + 6x3 + 9x2 + 2x - 3 = (x4 + 5)q(x) + r(x).
Многочлены q и r совпадают соответственно с частным и остатком от деления p на x4 + 5. Деление с остатком дает:
p(x) = (x4 + 5)(x3 + 4x2 + 0x + 8) + (x3 - 11x2 + 2x - 37).
На следующем шаге мы можем применить ту же самую процедуру к каждому из многочленов q и r:
q(x) = (x2 - 1)(x + 4) + (x + 12), r(x) = (x2 + 1)(x - 11) + (x - 26).
В результате получаем:
p(x) = (x4 + 5)((x2 - 1)(x + 4) + (x + 12)) + ((x2 + 1)(x - 11) + (x - 26)).
Посмотрев на этот многочлен, мы видим, что для вычисления x2 требуется одно умножение; еще одно умножение необходимо для подсчета x4 = x2*x2. Помимо этих двух умножений в вычислении правой части равенства участвуют еще три умножения. Кроме того, выполняется 10 операций сложения. В таблице 1 приведены сравнительные результаты анализа этого метода и других методов вычисления. Экономия не выглядит значительной, однако это объясняется тем, что мы рассматриваем лишь частный случай. Общую формулу для сложности можно вывести, внимательно изучив процедуру. Заметим прежде всего, что в равенстве (1) участвуют одно умножение и два сложения. Поэтому для числа умножений M = M(k) и числа сложений A = A(k) мы получаем следующий набор рекуррентных соотношений:
M(1) = 0 | A(1) = 0 |
M(k) = 2M(k - 1) + 1 при k > 1 | A(k) = 2A(k - 1) + 2 при k > 1. |
Таблица 1. Число операций при вычислении значения многочлена степени 7
Способ | Умножения | Сложения |
Стандартный | 13 | 7 |
Схема Горнера | 7 | 7 |
Предварительная обработка | 5 | 10 |
Решая эти соотношения, мы заключаем, что число умножений приблизительно равно N/2, а число сложений приблизительно равно (3N - 1)/2. Неучтенными, однако, остались умножения, необходимые для подсчета последовательности значений x2, x4, x8, ..., x2k-1; на это требуется дополнительно k - 1 умножение. Поэтому общее число умножений приблизительно равно N/2 + log2N.
Таблица 2. Число операций при вычислении значения многочлена степени N
Способ | Умножения | Сложения |
Стандартный | 2N - 1 | N |
Схема Горнера | N | N |
Предварительная обработка | N/2 + log2N | (3N - 1)/2 |
В таблице 2 приведены результаты сравнительного анализа стандартного алгоритма, схемы Горнера и алгоритма с предварительной обработкой коэффициентов. При сравнении последних двух алгоритмов видно, что нам удалось сэкономить N/2 - log2N умножений, но за счет дополнительных (N - 1)/2 сложений. Во всех существующих вычислительных системах обмен умножений на сложения считается выгодным, поэтому предварительная обработка коэффициентов повышает эффективность.
3 Функции произвольного видаНайдем нули функции на интервале x=[–2,7], используя Mathcad
Изобразим сначала функцию на графике.
На заданном интервале функция три раза обращается в ноль. Определим нули функции, используя встроенную функцию root(f(x),x). Первый аргумент – функция, нуль которой необходимо найти, второй – переменная, которую необходимо варьировать. (Вообще говоря, функция f может быть функцией многих переменных и необходимо указывать, по какой именно переменной мы ищем нуль функции.) Кроме того, необходимо задать начальное приближение поиска. Точность вычислений задается встроенной переменной TOL. По умолчанию ее значение равно 0,001. Это значение можно изменить либо через меню Math/Built–In Variables или непосредственно в тексте документа:
Задаем начальное приближение:
И вычисляем корень:
Если требуется найти несколько корней, как в нашей задаче, то имеет смысл определить новую функцию:
Функция r(x) возвращает значение корня ближайшее к x[2], то есть начальное приближение мы задаем через аргумент функции. Задаем вектор начальных приближений x и находим соответствующие им корни X:
Для данного примера корни легко могут быть найдены аналитически. Они равны на заданном интервале /2/2 и Полученный численный результат с заданной точностью совпадает с точным решением.
Определение новой функции целесообразно и в том случае, когда мы хотим исследовать зависимость решения от параметра. Пусть функция зависит от параметра a
Первый аргумент функции z задает значение параметра, второй – начальное приближение. Найдем корни уравнения при значениях параметра 1 и 2.
Если мы хотим получить комплексный корень, то начальное приближение следует задавать комплексным:
4 Нахождение корней полиномовДля нахождения корней полиномов имеется встроенная функция polyroots(a). Аргументом функции является вектор коэффициентов полинома , то есть для уравнения вектор а имеет вид
Если в полиноме отсутствуют некоторые степени, то на соответствующих местах следует писать 0. Пусть требуется найти корни полинома
Коэффициенты полинома могут быть и комплексными.
Список используемых информационных источников
1. Coppersmith D., Odlyzko A. M., Schroeppel R. Descrete logarithms in GF(p) // Algorithmica. V. 1,1986. P. 1-15.
2. Lenstra A. K, Lenstra H. W. (jr.) The Development of the Number Field Siev. Lect. Notes in Math. V. 1554. Springer, 1993.
3. McCarthy D. P. “The optimal algorithm to evaluate xn using elementary multiplication methods”, Math. Comp., vol. 31, no 137, 1977, pp. 251 – 256.
[1] Получите эти формулы самостоятельно по аналогии с методом Ньютона, оставив в разложении Тейлора первые три слагаемых.
[2] К сожалению, это не всегда так. Если начальное приближение выбрано неудачно и значение производной в этой точке близко к нулю, то, вообще говоря, найденный корень может быть не ближайшим к начальному приближению. В качестве примера решите самостоятельно задачу поиска корня уравнения , выбрав в качестве начального приближения число близкое к . Чем ближе к будет выбранное значение, тем более далекий от 0 корень мы будем получать.
... метода Ньютона на случай мнимых корней полиномов степени выше второй и комплексных начальных приближений. Эта работа открыла путь к изучению теории фракталов. Целью данной курсовой работы является Лисп – реализация нахождения корней уравнения методом Ньютона. 1. Постановка задачи Дано уравнение: . Требуется решить это уравнение, точнее, найти один из его корней (предполагается, что ...
... ____________________________ подпись " ______ " ________________ 2007 г. Студент ____________________________ Подпись " ____ " _________________ 2007 г. Содержание 1. Постановка задачи АНАЛИЗ Численные методы интегрирования (Исследование устойчивости САУ) Для заданной системы требуется определить: Передаточную функцию замкнутой системы, для случая ; Корни характеристического ...
. 3. Анализ цепи во временной области методом переменных состояния при постоянных воздействиях 3.1 Составление уравнений состояния цепи Уравнения электромагнитного состояния – это система уравнений, определяющих режим работы (состояние) электрической цепи. Метод переменных состояния основывается на упорядоченном составлении и решении системы дифференциальных уравнений первого порядка, ...
... системам линейных алгебраических уравнений с более чем одной неизвестной; MATLAB решает такие уравнения без вычисле-ния обратной матрицы. Хотя это и не является стандартным математическим обозначением, система MATLAB использует терминологию, связанную с обычным делением в одномерном случае, для описания общего случая решения совместной системы нескольких линейных уравнений. Два символа деления / ...
0 комментариев