Pir0texnik писал(а):
Так, а чем плохо для монотонного знакопостоянного ряда оценка ошибки в виде err1=dabs(Y1/sum)? т.е. отшение последнего члена суммы к сумме ряда? Для знакопеременного ряда - это не очень годится, т.к. надо смотреть на разницу между эл-ми ряда, которые по сравнению рядом по отдельности могут быть вполне значительными, а для постоянного, имно очень даже годится...
Ну это банальный матан... ошибкой в данном случае является сумма остатка ряда (то есть сумма всех членов, начиная с некоторого). Так вот, есть теорема Лейбница, в которой показано, что сумма остатка знакопеременного убывающего (|a(n)| > |a(n+1)|) ряда меньше модуля первого члена остатка. Вот для такого случая ваш алгоритм подходит.
Теперь посмотрим, что получится, если таким образом посчитать сумму монотонно убывающего положительного ряда.
Набросал простенький пример на мэпле:
Код:
> restart;
# Просим считать с точностью 20 знаков после запятой
> Digits:= 20;
# находим аналитически сумму ряда 1/k^2 для k от 1 до бесконечности.
> exact := sum(1/k^2, k=1..infinity);
2
Pi
exact := ---
6
# Сумма равна Pi^2/6
# Что в десятичном виде с 20 знаками после запятой выглядит вот так:
> evalf(exact);
1.6449340668482264365
# Выберем желаемую точность для вашего алгоритма
> tol:=0.001;
tol := 0.001
# Пусть на пером шаге "относительная ошибка" равна 1.0
> err:=1.0;
err := 1.0
# Частичную сумму ряда для начала инициализируем нулем
> total:=0;
total := 0
# Далее по алгоритму, останавливаемся, когда последний член суммы
# отнесенный к сумме менше tol
> for i from 1 by 1 while err > tol do
> total := total + evalf(1/i^2):
> err := evalf((1/i^2))/total:
> end do:
# получаем результат
> total;
1.6057234035910008572
# сотрим, насколько он далеко от точного
> realError := evalf(exact - total);
realError := 0.0392106632572255793
> видим что, реальная точность в 39 раз хуже tol
Если задать tol := 0.0001, то реальная точность будет уже в 125 раз хуже tol.
Надеюсь, понятно, что таким алгоритмом считать нельзя?