Условие задачи
Вычислите с заданной точностью [latex]\varepsilon[/latex]сумму ряда [latex]\sum\limits_{i=1}^{\infty}{\frac{\sqrt{i+1}}{ie^i}} [/latex].
Задачу также можно найти здесь.
Тесты
№ | Точность [latex]\varepsilon[/latex] | Сумма ряда |
1 | 0.1 | 0.637464 |
2 | 0.001 | 0.685288 |
3 | 0.0001 | 0.685782 |
4 | 0.000001 | 0.685848 |
Алгоритм решения
Поскольку в данной задаче использование рекуррентной формулы приведет только к накоплению погрешности, будем считать каждое слагаемое суммы непосредственно, пока не достигнем заданной точности. Для этого зададим начальное значение переменной exponent = M_E для [latex]i=1[/latex] , а также для первого члена ряда а = sqrt(2)/ exponent. Тогда для каждого значения счетчика нам нужного всего лишь накапливать степень экспоненты и вычислять текущий член ряда по формуле [latex]\frac{\sqrt{i+1}}{i\cdot{e}^{i}} [/latex] , накапливая сумму, пока не достигнем заданной точности эпсилон.
Проверить правильность найденной суммы можно с помощью сайта WolframAlpha.
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> #include <cmath> using namespace std; int main(){ double exponent = M_E, a = sqrt(2)/exponent, sum = 0, E; cin >> E; for (int i = 1; (a = sqrt(i+1)/(i * exponent)) >= E; i++){ exponent *= M_E; sum += a; } cout << sum; return 0; } |
Код программы на сайте ideone.
Работает правильно. Но наша цель научиться делать правильно.
— Не нужно повторять дважды код в 6-й и 7-й строке. Просто присвойте =а.
— Отношение последующего слагаемого к предыдущему здесь почти бесполезно. Таким образом следует считать только [latex]e^i[/latex].
— Вы иногда в тексте пояснения путаете е и эпсилон.
Спасибо за замечания, код исправил. Также внесены правки в пояснении (е и эпсилон).
Вы не учли одно из замечаний
– Отношение последующего слагаемого к предыдущему здесь почти бесполезно. Таким образом следует считать только [latex]e^i[/latex].
Объясню подробнее.
При последовательном вычислении степеней нужно будет только домножать предыдущую степень на [latex]e[/latex]. Это разумная экономия в вычислениях.
Все остальные сомножители у Вас добавляются, чтобы сократиться при следующем шаге. Т.е. единственная их задача — создать дополнительную вычислительную погрешность. Т.е. знание [latex]\sqrt{7}[/latex] ни как не помогает проще вычислить [latex]\sqrt{8}[/latex].
По WolframAlpha. Очень хорошо, что Вы им воспользовались. Только лучше (грамотнее) задать пределы суммирования — например, так.
Зачтено.