Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Вычислить сумму членов бесконечного ряда


Помогите пожалуйста написать на си. Вроде не сложно, но с математикой не идут задачи у меня.


Ответ

Ну, смотрите. Для начала, ваша сумма неправильно раскрыта: для n = 0 имеем x^0 / 0!, то есть 1, а не x Итак, начальное значение слагаемого 1. Чтобы перейти к новому слагаемому на i-ой итерации, надо домножить на x^2 и разделить на (2*i - 1) * (2 * i). Дальше ясно? Кстати, возведение в степень не нужно, если делать, так, как описано. С другой стороны, известно, что для лучшей точности вычислений необходимо начинать суммирование с наименьших по модулю чисел. То есть, считать лучше с конца. Для этого превратим один цикл в два: цикл от i = 0, x = 1 пока |x| >= eps увеличиваем i, x домножаем на x0 * x0 и делим на (2*i - 1) * (2 * i) цикл пока i >= 0 увеличиваем сумму на x, делим x на x0 * x0 и домножаем на (2*i - 1) * (2 * i), уменьшаем i Как правильно было подмечено в комментариях, вычисляя слагаемые дважды (один раз на пути вправо, и один раз на пути влево), мы теряем точность. Выход — запоминать вычисленные элементы (для этого неплохо бы иметь автоматически растущий контейнер, наподобие std::vector в C++), или делать три прохода: один для вычисления количества слагаемых, второй для вычисления самих слагаемых и запоминания их, третий для суммирования с конца. Вместо первого прохода можно, по идее, грубо оценить количество слагаемых по условию выхода (|x|^n/n! < eps <=> n ln |x| - ln n! < ln eps), применив формулу Стирлинга

Комментариев нет:

Отправить комментарий