1 / 1 / 2
Регистрация: 23.01.2017
Сообщений: 25
1

Вычисление бесконечного ряда с заданной точностью

15.04.2017, 01:41. Показов 3365. Ответов 7

Доброй ночи. Сейчас столкнулся с неприятной ситуацией, в задаче, которая казалось бы полностью понятна (но это не точно).

Формулировка задания - Ряды с факториалами. Написать программу вычисления F(x) в виде бесконечного ряда с точностью 10^-9. Организовать вычисление этого ряда для значения x, запрашиваемого с клавиатуры, и проверку получаемого результата путем сравнения с системной функцией F(x). То есть, sinh - сумма стремится к 0. В целом даже предполагаю где находится ошибка, в коде это выделил.

И так суть проблемы, необходимо рассчитать сумму бесконечного ряда и выполнить проверку. С расчетами ряда проблем нет, а вот проверить ну ни как не получается. Если я правильно понял, то для проверки нам необходимо при каждом изменении n вычитать из sh(x) сумму ряда, до тех пор пока разность не будет равна 0. Голова вообще не фурычит ночью. Какое должно быть условие, чтобы при получении числа с нужной точностью, мы получили верную проверку. (sinh-sum)

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
#include "stdafx.h"
#include "iostream"
#include "iomanip"
#include "windows.h"
 
using namespace std;
 
 
double factorial(double x)
{
    if (x == 0) return 1;
    return x * factorial(x - 1);
}
int main()
{
    HANDLE hCon;
    COORD cPos;
 
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    long double x = 0, sum = 1, cs = 0, t, sums, sums1;
    int X = 0, Y = 0, n = 0;
    cout << "Vvedite znachenye x = ";
    cin >> x;
    cs = sinh(x);
    cout << "\n" << "sinh(x) = " << setprecision(10) << cs << "\n";
    t = pow(x, 2 * n + 1) / factorial(2 * n + 1);
    while (abs((abs(sum) - abs(cs))) >= 0.000000001) { //(Первая ошибка тут (На вычисления не влияет))
        t = (pow(x,2*n+1) / factorial(2*n + 1));
        sum += t;
        n++;
        cPos.Y = 3 + n;
        cPos.X = X + 2;
        SetConsoleCursorPosition(hCon, cPos);
        cout << "n = " << n-1;
        cPos.Y = 3 + n;
        cPos.X = X + 15;
        SetConsoleCursorPosition(hCon, cPos);
        cout << "t = " << t;
        cPos.Y = 3 + n;
        cPos.X = X + 40;
        SetConsoleCursorPosition(hCon, cPos);
        cout << fixed << setprecision(10) << "summa =" << sum;
        cPos.Y = 3 + n;
        cPos.X = X + 65;
        SetConsoleCursorPosition(hCon, cPos);
        cout << fixed << setprecision(10) << abs((abs(sum) - abs(cs))); //(Вторая тут)
 
    }
    cout << "\n";
    return 0;
}
Миниатюры
Вычисление бесконечного ряда с заданной точностью   Вычисление бесконечного ряда с заданной точностью   Вычисление бесконечного ряда с заданной точностью  

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2017, 01:41
Ответы с готовыми решениями:

Сумма бесконечного ряда с заданной точностью
как реализовать сумму бесконечного ряда? посмотрел пару примеров не понял \sum_{n=0}^{\propto...

Сумма бесконечного ряда с заданной точностью
Написать программу вычисления суммы бесконечного ряда с точностью eps=0.001: ...

Вычисление суммы бесконечного ряда с точностью эпсилон
Работает но выдает ошибку. если возможно подскажите. условие запрограммировать вычисление суммы...

Функция бесконечного ряда Тейлора с заданной точностью на С
Помогите написать программу. Находил примеры, но не могу понять как сделать с бесконечностью. ...

7
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
15.04.2017, 09:39 2
Лишнего много у тебя, и не оптимально.
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
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
int main()
{
    double x, y, a, b, c;
    int i;
    
    cin >> x;
    cout.precision(10);
    cout.setf(cout.fixed);
    cout << sinh(x) << endl << endl;
    
    y = 0;
    a = x;
    b = 1;
    c = x;
    i = 1;
    
    while ((c = a / b) >= 1E-9)
    {
        y += c;
        cout << setw(2) << (i - 1) / 2 << setw(15) << c << setw(15) << y << endl;
        i += 2;
        a *= x * x;
        b *= i * (i - 1);
    }
}
1
Диссидент
Эксперт C
26856 / 16758 / 3675
Регистрация: 24.12.2010
Сообщений: 37,521
15.04.2017, 10:37 3
Цитата Сообщение от nmcf Посмотреть сообщение
C++
1
b *= i * (i - 1);
Хрен редьки не намного слаще!
Значение b = i! очень быстро улетает в заоблачные выси. Что приводит сначала к потере точности, а потом и к переполнению.
Я бы сделал так
C++
1
2
3
4
5
6
7
while (a  >= 1E-9)
    {
        y += a;
        // cout << setw(2) << (i - 1) / 2 << setw(15) << c << setw(15) << y << endl;
        i += 2;
        a *= x * x/( i * (i - 1));
    }
Добавлено через 5 минут
CrazyArtemkO, При вычислении рядов подобного типа совершенно не обязательно (и даже вредно) вычислять члены "в лоб". Надо просто посмотреть, чем очередной член отличается от предыдущего. И тогда мы будем иметь дело с совсем небольшими числами.
1
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
15.04.2017, 10:42 4
Вроде бы хватает для данного случая.
1
Диссидент
Эксперт C
26856 / 16758 / 3675
Регистрация: 24.12.2010
Сообщений: 37,521
15.04.2017, 10:50 5
Цитата Сообщение от nmcf Посмотреть сообщение
Вроде бы хватает для данного случая.
Все зависит от аргумента x. А его значения нигде не оговорены. В любом случае можно подобрать x так, что грохнется любой алгоритм. Но предложенный в посте 2 грохнется при значительно меньших x, чем из поста 3. Так зачем же создавать самому себе сложности? Тем более, что и оснований к этому никаких нет. И по длине, и по ясности понимания алгоритм поста 3 ничем не хуже поста 2. А по вычислительным возможностям - лучше. И значительно.
1
1 / 1 / 2
Регистрация: 23.01.2017
Сообщений: 25
15.04.2017, 12:02  [ТС] 6
Ух ты, много нового) Да, все работает, проверку сделал. Но вот мне не до конца понятен ваш алгоритм, особенно из поста 2. В 3 посте более менее ясно. Я вот чего не заметил, в числителе нет степени, в знаменателе факториал у вас всегда i += 2, что не сильно похоже на условие. Если можно, то разложите все по полочкам, так как я вижу, что результат ваших кодов правильный.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
15.04.2017, 12:24 7
Нет смысла взводить в степень и считать факториалы. Запиши через умножение формулу и увидишь, что следующий член получается домножением текущего два раза на x и делением на два числа, производных от i.
1
Диссидент
Эксперт C
26856 / 16758 / 3675
Регистрация: 24.12.2010
Сообщений: 37,521
15.04.2017, 12:48 8
CrazyArtemkO, Все просто an+1 = an*x2/(2n*(2n+1))
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2017, 12:48
Помогаю со студенческими работами здесь

Вычислить сумму бесконечного ряда с заданной точностью
Здравствуйте, пожалуйста, помогите найти ошибку в программе, которая должна находить сумму...

Посчитать сумму бесконечного ряда с заданной точностью
Помогите написать программу на С++. необходимо посчитать сумму бесконечного ряда с заданной...

Найти сумму бесконечного ряда с заданной точностью
Народ помогите пожалуйста запрограммировать.:'( Вот что у меня получается... // #include...

Сумма членов бесконечного ряда с заданной точностью
Пожалуйста, помогите исправить мой код! Задание: найти сумму членов бесконечного ряда с заданной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru