Ю3.16

Задача

Сравнить скорость сходимости при вычислении числа [latex]e[/latex] с помощью ряда и бесконечной дроби:

[latex]e=2+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+…[/latex]; [latex]e=1+\frac{1}{1-\frac{1}{2+\frac{1}{3-\frac{1}{2+\frac{1}{5-…}}}}}[/latex]

У нас дан ряд(row) и бесконечная дробь(inf). Для разложения числа  [latex]e[/latex] в ряд использована функция вычисления факториала. Задаем начальные переменные и вычисляем основание натурального логарифма. При достижении заданной точности [latex]E[/latex] цикл вычислений ряда прекращается, и начинается вычисление по методу цепной дроби с заданным в первой части программы количеством итераций (для корректного сравнения скорости сходимости, количество итераций должно быть одинаково).

Алгоритм вычисления представляет собой цикл, в который вложен еще один рекурсивный цикл. Первый цикл do подставляет во второй цикл количество итераций. Во втором цикле for происходит основное вычисление цепной дроби, посредством проверки четных и нечетных шагов. Проверка на четность происходит делением текущей по счету итерации  на 2 с остатком. Если делится без остатка, то итерация четная, иначе- нечетная.

E

Количество итераций ряда(row)

i

Количество итераций цепной дроби(inf)l Комментарий
0.00001 9 7

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

0.0000002 11 9

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

0.00078 7 6

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

0.0004 7 6

Бесконечная дробь быстрее сходится к числу е, чем ряд.

Тест пройден.

При схождении к числу [latex]e[/latex] с точностью [latex]E[/latex] цепная дробь будет  делать это быстрее, чем ряд.

Ниже представлена сама программа(C++).

Код на Java:

 

Также вы можете воспользоватся ссылкой (C++)/ссылкой (Java), для ознакомления с программой.

Бровко Ілля
Бровко Ілля

Latest posts by Бровко Ілля (see all)

5 thoughts on “Ю3.16

  1. Почти зачёл. Программа-то работает. Но накопилось много «мелочей»:
    — Нет смысла печатать накопленные значения. И так ясно какими они будут. Нужно печатать количество итерация для ряда и для дроби, обеспечивающих требуемую точность.
    — Вы использовали два различных стиля отступов в одной программе. Нужно определиться и пользоваться каким-то одним. Местами (стр. 15, 23) сдвиг вообще ненужен.
    — Используйте константу M_E, которая задана в math.h и представляет число e с максимальной для double точностью.
    — row это сумма ряда. Нужно в 22-й строке задать начальное значение не 0, а 2. Вместо этого Вы отнимаете «магическую» двойку при сравнении.
    — Зачем «магические» числа в 21-й и 29-й строке?

  2. Немного схитрили. Вместо 2 в сумме ряда учли факториалы 0 и 1. Думаю это допустимо.
    Зачёл.
    Только поставьте отступы строках 28 и 51 в один уровень с остальным текстом.

    P.S. Мне не очень нравится как Вы написали функцию для факториала. Зачем нужно доопределять факториал для отрицательных чисел? Я бы ещё понял, если бы Вы написали

  3. Повторю одно из замечаний к посту Байкова.

    Очень неудачный выбор для названия переменной E! Особенно в Java. Оно начинает путаться с Math.E, так же не забывайте, что обычно названия переменных начинаются с маленьких букв. Да и не логичное название. Назовите ее eps, или epsilon, или accuracy .

    Также у Вас нарушены отступы.

    Ряд в математике не row, а series. inf наверное тоже не самое удачное имя. l и i также не самая лучшая пара имен, как понять какая переменная для чего?

Добавить комментарий