Алгоритмы, использующие рекуррентную последовательность

advertisement
Алгоритмы, использующие рекуррентную последовательность
Последовательность чисел а0, а1, а2, ..., аn называется рекуррентной, если
каждый последующий ее член выражается через один или несколько
предыдущих. Если для получения следующего значения последовательности
требуется только один предыдущий элемент ak = ϕ ( ak −1 ) , то это
последовательность первого порядка. Для нахождения всех членов такой
последовательности достаточно задать начальный элемент а0.
k
100
100
k
k x
Пример 1. Вычилить сумму s ( x) = ∑ a = ∑ (−1)
.
k
!
k =1
k =1
Вначале составления алгоритма необходимо получить рекуррентную
формулу. Для получения формулы рассмотрим значение слагаемого при
x
x⋅x
различных значениях k: при k = 1; a1 = −1 ; при k = 2; a2 = 1
; при
1
1⋅ 2
x⋅ x⋅ x
k = 3; a3 = −1
и т.д. Видно, что на каждом шаге слагаемое
1⋅ 2 ⋅ 3
x
дополнительно умножается на −1 . Исходя из этого формула рекуррентной
k
x
последовательности будет иметь вид ak = −ak −1 . Полученная формула
k
позволяет избавиться от многократного вычисления факториала и возведения
в степень. Текст программы представлен ниже.
s=0; // Начальное значение суммы
a=1; // Начальное значение для вычисление очередного
// члена рекуррентной последовательности
for ( int k=1; k<=100; k++)
{
a*=-x/k; // Вычисление члена рекуррентной последовательности
s+=a; // Суммирование всех слагаемых
}
x 2k
Пример 3.9. Вычилить сумму s ( x) = ∑ a = ∑ (−1)
sin( x ) .
(2
k
)!
k =0
k =0
Анализируя формулу можно сделать вывод, что получить рекуррентную
зависимость для sin(x) достаточно сложно, поэтому будем считать функцию
sin(x) нерекуррентной частью и рассчитывать отдельно. Теперь получим
2k
100
k x
:
рекуррентную зависимость для оставшийся формулы ∑ (−1)
(2k )!
k =0
рассчитаем значение слагаемого при различных значениях k: при
x2 * x 2
1
x2
k = 0; a1 = 1 ; при k = 1; a1 = −1
; при k = 2; a2 = +1
; при
1
1* 2
1* 2 * 3 * 4
100
k
100
k
x2 * x2 * x 2
и т.д. При расчете слагаемых, для того, что бы
k = 3; a3 = −1
1* 2 * 3* 4 * 5 * 6
было легко вывести рекуррентную формулу, всегда отделяйте уже
рассчитанную на предыдущих шагах часть от новой! Видно, что на каждом
x2
шаге слагаемое дополнительно умножается на −1
. Исходя из
(2k − 1) * (2k )
этого формула рекуррентной последовательности будет иметь вид
x2
. Текст программы представлен ниже.
ak = −ak −1
(2k − 1) * (2k )
s=sin(x); // Значение суммы для нулевого элемента
a=1;
for (int k=1; k<=100; k++)
{
a*=-sqr(x)/(2*k*(2*k-1));
s+=a*sin(x); // Здесь добавлена нерекуррентная часть
}
При расчете удобно начинать расчет не с нулевого элемента, а с первого.
Значение суммы в нулевом элементе рассчитывается до начала цикла
(s:=sin(x)). Нерекуррентная часть добавляется при суммировании
(s:=s+a*sin(x)).
Download