Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Beliy_Krolik
0 / 0 / 3
Регистрация: 03.03.2016
Сообщений: 102
1

Вычислить сумму значений ряда в заданном интервале с заданной точностью

15.03.2016, 16:48. Просмотров 878. Ответов 7
Метки нет (Все метки)

Есть программа, вычисляющая сумму значений ряда в заданном интервале с заданной точностью. Вычислительная часть написана верно, но есть вопрос: Почему не выводится конечное значение?
Данные, на которых проверялось:
(Указаны в порядке ввода в программу)
0.1
0.9
0.05
0.001


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
#include <stdio.h>      // директивы препроцессора
#include <conio.h>
#include <math.h>
int main()
{   
    float x, s, f, x_nach, x_kon, delta_x, eps, temp;   // описание переменных
    int n;
    printf("\nLaboratornaya rabota nomer 3");
    printf("\nVariant nomer 3");
    printf("\nMR-14-1");
    printf("\nBakanov Maxim");
    printf("\n");
    printf("\nVvod ishodnih dannih:");  // ввод исходных данных
    printf("\n");
    printf("\nx_nach=");                        
    scanf("%f", &x_nach);                               // начальное значение аргумента
    printf("\nx_kon=");                     
    scanf("%f", &x_kon);                                // конечное значение аргумента
    printf("\ndelta_x=");                       
    scanf("%f", &delta_x);                              // шаг изменения аргумента
    printf("\neps=");                       
    scanf("%f", &eps);                                  // точность вычислений
    
    printf("\nDlya  x=%5.3f  do  %5.3f  s shagom  %5.3f  i tochnostiu  %5.3f\n", x_nach, x_kon, delta_x, eps);   // эхо-печать
    printf("\n");
    printf("\n   x      n         s            f");
    printf("\n--------------------------------------");
    x = x_nach;
    do 
    {   // внешний цикл - изменение аргумента
    temp=x;   // первое слагаемое 
    temp*=2;
    s=temp;   // начальное значение суммы
    n=1;   // количество итераций на каждом шаге
    f=log((1+x)/(1-x));   // точное значение функции
while(fabs(temp)>eps)
{
    temp*=(2.0*n-1.0)*(pow(x, (2.0*n+1.0)))/((2.0*n+1.0)*(pow(x, (2.0*n-1.0)))); //Очередное слагаемое
    s+=temp;
    n++;
}
    printf("\n%5.3f     %d     %0.6f     %1.6f", x, n, s, f);
    x += delta_x;   // увеличение аргумента на шаг  delta_x 
}
while (x<=x_kon);
    printf("\n--------------------------------------");
    return(0);
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2016, 16:48
Ответы с готовыми решениями:

Вычислить сумму ряда с заданной точностью
&quot;Составить программу вычисления суммы ряда с точностью до члена ряда, меньшего Е. Производить...

Вычислить сумму ряда 1/n! с заданной точностью
&quot;Вычислить значение суммы ряда 1/n! при n -&gt; бесконечности с заданной пользователем точности&quot; - ...

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

Вычислить сумму ряда с заданной точностью
Помогите пожалуйста с решением задачи: Вычислить с точностью ε=10^-5 сумму ряда...

Вычислить сумму ряда с заданной точностью
Даны действительные числа s и E&lt;1. Вычислить F=\sum_{n=1}^{\infty}\frac{2^n}{n!}*s^n для...

7
FiLF
54 / 54 / 37
Регистрация: 05.09.2013
Сообщений: 1,866
15.03.2016, 23:22 2
Цитата Сообщение от Beliy_Krolik Посмотреть сообщение
Почему не выводится конечное значение?
В коде и предпосылок к этому нет.
Необходимо добавить перед return 0;
C
1
printf("\n\nS = %f", s);
И, наверно,
C
1
while(fabs(temp - f)>eps)
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
15.03.2016, 23:53 3
Цитата Сообщение от Beliy_Krolik Посмотреть сообщение
Вычислительная часть написана верно, но есть вопрос: Почему не выводится конечное значение?
Так а покажите пальцем, где у вас в коде вывод конечного значения.
1
zer0mail
2466 / 2101 / 219
Регистрация: 03.07.2012
Сообщений: 7,620
Записей в блоге: 1
16.03.2016, 00:35 4
Beliy_Krolik, у программ есть удивительное свойство: они работают так, как написаны, а не как хочет программист или как ему надо
0
16.03.2016, 00:35
Beliy_Krolik
0 / 0 / 3
Регистрация: 03.03.2016
Сообщений: 102
16.03.2016, 04:06  [ТС] 5
Неправильно объяснил.
Программа должна работать, пока x текущий <= х конечного.
Выводится сумма ряда и значение функции для всех значений интервала, а для x_kon нет.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
16.03.2016, 04:46 6
Цитата Сообщение от Beliy_Krolik Посмотреть сообщение
Программа должна работать, пока x текущий <= х конечного.
Арифметика плавающих чисел неточна. Например, если начальное значение x равно 0, а шаг равен 0.1, то значение х никогда не будет равно 1.0. Оно может оказаться в итоге равным примерно 0.999999999, а может оказаться равным примерно 1.00000001.

Соответственно если у вас x_kon равно 1.0, а условие повторения цикла прописано как

C
1
2
3
4
    ...
    x += delta_x;   // увеличение аргумента на шаг  delta_x 
}
while (x<=x_kon);
то x на последней итерации запросто может стать равным 1.00000001. Произойдет завершение цикла, т.к. 1.00000001 больше чем 1.0. Внешне это будет выглядеть так, как будто последнее значение x куда-то пропало. И оно действительно пропало.

Исправьте условие продолжения цикла на

C
1
2
3
4
    ...
    x += delta_x;   // увеличение аргумента на шаг  delta_x 
}
while (x < x_kon + delta_x / 2);
1
Beliy_Krolik
0 / 0 / 3
Регистрация: 03.03.2016
Сообщений: 102
16.03.2016, 04:48  [ТС] 7
И как это исправить?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
16.03.2016, 04:56 8
Лучший ответ Сообщение было отмечено Beliy_Krolik как решение

Решение

Цитата Сообщение от Beliy_Krolik Посмотреть сообщение
И как это исправить?
См. выше. В общем случае исправьте условие продолжения цикла на

C
1
2
}
while (fabs(x - x_kon) < EPSILON);
Где EPSILON - это некая малая величина, "допуск". А в вашем случае хорошо сработает

C
1
2
}
while (x < x_kon + delta_x / 2);
1
16.03.2016, 04:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2016, 04:56

Вычислить сумму ряда с заданной точностью
Вычислить с точностью ε=10-5 сумму на языке си ...

Вычислить сумму бесконечного ряда с заданной точностью
Вычислить сумму бесконечного ряда: S=1/2-1/4+1/8-1/16 вот такой вот ряд..... В этом коде...

Вычислить сумму бесконечно заданного ряда с заданной точностью eps
Вычислить сумму бесконечного ряда: S=1/1-1/3+1/5-1/7...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru