Задача
Сравнить скорость сходимости при вычислении числа [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++).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
#include <iostream> #include <math.h> using namespace std; double fact(int i) { if(i == 0) { return 1; } if(i < 0) { return 0; } else return i * fact(i - 1); //функция для вычисления факториала } int main() { int i=0, k=1, l=1; double row=0, E; //начальные переменные scanf("%lf", &E); //ввод погрешности do { row+=1/fact(i); //вычисление ряда i++; } while(M_E-row>E); //условие, при котором цикл останавливается printf("row=%10.10lf, i=%d \n", row, i); double sum3=0, inf; //переменные для вычисления цепной дроби do { for (int k = l; k >= 1; k--) { if ((k % 2) == 0) { sum3 = 1 / (2 + sum3); } else { sum3 = 1 / (k - sum3); } } if (fabs(M_E - (sum3 + 1))<E) { break; } l++; } while (l < i + 10); inf=1+sum3; //в начале цепной дроби присутсвует единица, которая выбивается из цикла. printf("inf=%10.10lf, l=%d \n", inf, l); if(l<i) { printf("С заданной погрешностью E=%5.10lf, бесконечная дробь, с количеством итераций l=%d быстрее сходится к числу е, чем ряд, c количевством итераиций i=%d.\n", E, l, i); } else { printf("С заданной погрешностью E=%5.10lf, ряд, с количеством итераций i=%d быстрее сходится к числу е, чем бесконечная дробь, c количевством итераиций l=%d.\n", E, i, l); } return 0; } |
Код на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
import java.util.*; import java.lang.*; import java.io.*; class Brovko { public static double fact(int itser){ return itser < 2? 1 : itser * fact(itser - 1); } public static void main (String[] args) throws java.lang.Exception { int itser=0, itfrac=1; double series=0, epsilon; Scanner in = new Scanner(System.in); epsilon=in.nextDouble(); do{ series+=1/fact(itser); itser++; } while(Math.E-series>epsilon); System.out.format("series=%10.10f, itser=%d \n", series, itser); double sum3=0, fraction; do{ for (int k = itfrac; k >= 1; k--){ if ((k % 2) == 0){ sum3 = 1 / (2 + sum3); } else{ sum3 = 1 / (k - sum3); } } if (Math.abs(Math.E - (sum3 + 1))<epsilon){ break; } itfrac++; } while (itfrac < itser + 10); fraction=1+sum3; System.out.format("fraction=%10.10f, itfrac=%d \n", fraction, itfrac); if(itfrac<itser){ System.out.printf("С заданной погрешностью epsilon=%5.10f, бесконечная дробь, с количеством итераций itfrac=%d быстрее сходится к числу е, чем ряд, c количевством итераиций itser=%d.\n", epsilon, itfrac, itser); } else{ System.out.printf("С заданной погрешностью epsilon=%5.10f, ряд, с количеством итераций itser=%d быстрее сходится к числу е, чем бесконечная дробь, c количевством итераиций itfrac=%d.\n", epsilon, itser, itfrac); } } } |
Также вы можете воспользоватся ссылкой (C++)/ссылкой (Java), для ознакомления с программой.
Related Images:
Для отправки комментария необходимо войти на сайт.