Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2012, 19:37   #1
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию Найдите ошибку

Уважаемые знатоки! Помогите исправить код программы. Почему то не могу получить ответы которые даны как выходные данные
Код программы
Код:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <math.h>

using namespace std;
 
int main () {
      const int MaxIter=500;
		double Xn, Xk, dX, eps;
		cin >> Xn >> Xk >> dX >> eps;
        double z, ch; 
		int kol=0;
  for (double x=Xn; x<=Xk; x+=dX) 
 { //Пробуем различные x
  
  double y=x,zn=x,n=2,xn=x;
   //Сумма ряда, знак слагаемого, номер шага, x в степени n
  do {
   z=log(1-x);  //Точное значение суммы ряда
  ch=(1/n)*pow(zn,n);
   y+=ch; //Формула накопления суммы ряда
   kol++;
   n++; //Увеличиваем номер шага на 1
  } while (fabs(ch)>eps && n<MaxIter);
    //Пока не достигнута точность eps или не сделано 500 шагов цикла
  y=-y;
  cout << x <<"   "<< y <<"   "<< kol <<"   "<< z << endl;
 }
 system ("PAUSE");
 return 0;
    }
Должны быть такие:
ч
0 0 1 0
0.1 -0.1054 4 -0.1054
0.2 -0.2231 5 -0.2231
0.3 -0.3567 7 -0.3567
0.4 -0.5108 8 -0.5108
0.5 -0.6931 10 -0.6931
0.6 -0.9162 14 -0.9163
0.7 -1.204 18 -1.204
0.8 -1.609 27 -1.609
0.9 -2.302 51 -2.303
А у меня:
0 0 1 0
0.1 -0.105358 4 -0.105361
0.2 -0.223131 8 -0.223144
0.3 -0.356664 14 -0.356675
0.4 -0.51078 21 -0.510826
0.5 -0.693065 30 -0.693147
0.6 -0.916219 43 -0.916291
0.7 -1.20379 60 -1.20397
0.8 -1.60913 86 -1.60944
0.9 -2.30189 136 -2.30259
Подскажите как сделать так чтобы точность была как в задании и почему количество просуммированных элементов ряда не такое как в задании. Подскажите в чем ошибка?
Tatyana64 вне форума Ответить с цитированием
Старый 05.11.2012, 19:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

пропиши cout.precision(4); в начале проги
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2012, 19:49   #3
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию Спасибо

Только опять вопрос почему у меня не такое количество членов ряда суммирует?
у меня
1
4
8
14
21
30
43
60
86
136
а в задании
1
4
5
7
8
10
14
18
27
51
Tatyana64 вне форума Ответить с цитированием
Старый 05.11.2012, 20:02   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты отладчиком пройдись по программе, и выяснишь
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2012, 20:17   #5
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию Попробую

Хотя пока представления не имею как это делать
Tatyana64 вне форума Ответить с цитированием
Старый 05.11.2012, 21:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В чем работаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2012, 22:35   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

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

Правильно - через рекурентную формулу, когда следующий элемент ряда вычисляется через предыдущий.
В случае задачи:
ln(1-x) = Sum(x^n/n), где n = 1...
Т.е. an+1 = an*k, где k = (n/(n+1)*x;
a1 := x;
n = 1; a2 = x^2/2;
n = 2; a3= x^3/3; и т.д.

Подробности можно найти в книгах Т.А. Павловской:
например:
- Программирование на языке высокого уровня. Паскаль.
См. в списке предлагаемой литературы, или
- Программирование на языке высокого уровня. С/С++.
что ближе к теме


Как-то так надо бы ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.11.2012, 23:11   #8
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
Злость Visual C++ 2010

Отладчик я кажется нашла F10, но ошибку с его помощью не выявила. Может правда не так считаю сумму ряда?
Tatyana64 вне форума Ответить с цитированием
Старый 05.11.2012, 23:19   #9
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию ln(1-x)

В задании написано
ln(1-x) =-(x+x^2/2+x^4/4+x^6/6+....)
Tatyana64 вне форума Ответить с цитированием
Старый 05.11.2012, 23:34   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Да, да. Загляните в предложенные мной книжки.
Ранее я уже обращал внимание на то, как тут некоторые неправильно решают подобные задания.

Дело в том, что при Вашем способе вычисления накапливаются большие неточности и сходимость ряда ухудшается.
Поскольку диапазон для х:
-1<= x < 1, т.е. |х| < 1,
то для случая, когда выполняется вычисление элемента ряда через возведение в степень, получаются очень малые слагаемые, к тому же обремененные большими ошибками вычисления.



Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найдите ошибку Yanik Помощь студентам 4 12.06.2011 11:45
Найдите ошибку C++ D.176 Помощь студентам 1 24.05.2011 07:31
найдите ошибку Sergey240892 Помощь студентам 15 04.03.2011 11:34
Найдите ошибку Гиро-Гинор Помощь студентам 2 12.11.2010 23:16
Найдите ошибку St1fler92 Помощь студентам 4 26.05.2009 15:23