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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2010, 03:10   #1
blondino4ka_milk
Пользователь
 
Аватар для blondino4ka_milk
 
Регистрация: 02.03.2010
Сообщений: 59
По умолчанию Вычислении функции

Выдаёт не правильные значения!

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от хнач до хкон с шагом dx с точностью е. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.


Код:
#include <iostream.h>
#include <math.h>
#include <windows.h>

char*Rus(const char*text);

int main(){
const double pi = 3.14159265;
double x, eps, ch, f; 
double Xn, Xk, dX;
int n = 0; 

cout <<Rus("Введите начало Xn\n");
cin >>Xn;

cout <<Rus("Введите конец Xk\n");
cin >>Xk;

cout <<Rus("Введите шаг dX\n");
cin >>dX;

cout <<Rus("Введите точность Eps:\n"); 
cin >>eps;

cout <<endl<<endl<<Rus("\nТаблица табулирования функции arctg(x)\n");
cout << "_________________________________________________" <<endl;
cout << Rus("|       x       |      arctg(x) |кол-во членов ряда|") <<endl;
cout << "_________________________________________________" <<endl; 


for(x=Xn;x<=Xk; x+=dX)
{
n=0;
f = pi/2;
while (fabs(ch-n)>eps){
if(x!=1)
ch =pow((-1.0), (n+1))/((2*n+1)*pow(x, (2*n+1))); 
f+=ch; 
n++;
}
cout <<"|\t" <<x <<"\t|\t" <<f <<"\t|\t"<<n <<"\t|"<<endl;
}
cout << "_________________________________________________" <<endl;
return 0;
}
char bufRus[256];
char*Rus(const char*text){
CharToOem(text, bufRus);
return bufRus;
}

Последний раз редактировалось blondino4ka_milk; 10.04.2010 в 03:18.
blondino4ka_milk вне форума Ответить с цитированием
Старый 10.04.2010, 09:58   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от blondino4ka_milk Посмотреть сообщение
while (fabs(ch-n)>eps){
Плохо. Ну какое отношение n имеет к точности вычислений?! Оно же растёт, а Вам нужно выйти просто когда член ряда по модулю станет меньше эпсилон.
Цитата:
Сообщение от blondino4ka_milk Посмотреть сообщение
ch =pow((-1.0), (n+1))/((2*n+1)*pow(x, (2*n+1)));
Опять плохо. Придётся снова наказать. Во-первых, даже формула члена ряда Тейлора сама по себе неверно запрограммирована. А во-вторых, "в лоб" такие вещи никто не считает (палкий привiт вашим лектору и ассистенту!). Ряд - на то и ряд, что в нём каждый последующий член можно выразить через предыдущий. Ваша, как программиста, задача, эту закономерность найти и формализовать.
Код:
   ...
   double   chlen,         // Член ряда
                num,          // Числитель
                den = 1.,   // Знаменатель
                f;
   ...
   // "Нулевой" (считаем с нуля) член ряда
   num = x;
   chlen = num / den;
   f = chlen;     // Сумма ряда, она же - значение ф-ии
   n = 0;          // Счётчик итераций
   while ( fabs( chlen ) >= eps ) {
      num = num * ... ;
      den = den + ... ;
      chlen  = ... ;
      f = f + ... ;
      ++n;
      // Про отладочные печати не забываем
      cout << num << " " << den << " " << chlen << " " << " " << f << " " << n << endl;
   }
   ...
Вместо многоточий - написать правильные выражения.

Зачем Вам PI? Конечно, это - идеальное значение для проверки формулы арктангенса. Ну так и проверьте один раз! Но какое отношение оно имеет к f?!
Vago вне форума Ответить с цитированием
Старый 10.04.2010, 12:00   #3
blondino4ka_milk
Пользователь
 
Аватар для blondino4ka_milk
 
Регистрация: 02.03.2010
Сообщений: 59
По умолчанию

не поняла! вот упростила выражение! всё сделала по павловской! =((
Код:
double ch=pi/2, y=ch;
for (int n =0;fabs(ch)>eps;n++){	
	ch*=(2*n+1)/((2*n+2)*x);
	y+=ch;
	++n;
blondino4ka_milk вне форума Ответить с цитированием
Старый 10.04.2010, 12:09   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Мы, вообще, какую функцию через ряд вычисляем? Арктангенс?
Vago вне форума Ответить с цитированием
Старый 10.04.2010, 12:12   #5
blondino4ka_milk
Пользователь
 
Аватар для blondino4ka_milk
 
Регистрация: 02.03.2010
Сообщений: 59
По умолчанию

ну да получается
это же правильно должно быть последнее у меня! в павловской так 41 страница "вычисление суммы ряда"

Последний раз редактировалось blondino4ka_milk; 10.04.2010 в 12:21.
blondino4ka_milk вне форума Ответить с цитированием
Старый 10.04.2010, 12:41   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Кто б ещё объяснил, кто такая Павловская?...
Какая у неё формула для ряда записана?
Vago вне форума Ответить с цитированием
Старый 10.04.2010, 13:08   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

А-а, вот оно что... Вы для ускорения сходимости этой формулой
Код:
arctg( x ) = PI/2 - arctg( 1/ x )
пользуетесь, что-ли?
Vago вне форума Ответить с цитированием
Старый 10.04.2010, 13:12   #8
blondino4ka_milk
Пользователь
 
Аватар для blondino4ka_milk
 
Регистрация: 02.03.2010
Сообщений: 59
По умолчанию



нет, не пользуюсь!
Изображения
Тип файла: jpg Безымянный3.jpg (19.3 Кб, 129 просмотров)

Последний раз редактировалось Stilet; 13.04.2010 в 10:24.
blondino4ka_milk вне форума Ответить с цитированием
Старый 10.04.2010, 13:47   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Да нет, формула вроде правильная, за исключением того, что инициализировать f надо нулем, а никак уж не pi/2, что бы там где ни писали.
Ну а слагаемые, понятное дело, надо выводить по индукции из предыдущих. Ну или, скорее, элементы этих слагаемых (знак, степень икса и n).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.04.2010, 14:28   #10
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Так. Понятно.

1. Павловская & Щупак, - С/С++. Структурное программирование: Практикум, СПб.: 2003
"Допущено...в качестве...для студентов..." Ну надо же!..

2.
arctg x = Pi/2 - 1/x + 1/3x^3 - 1/5x^5 +... , если x > 1;
"Не пользуюсь!... Не пользуюсь!.." ))
arctg x = x - x^3 / + x^5/5 - x^7/7 +... , если |x| <= 1;
arctg x = -Pi/2 - 1/x + 1/3x^3 - 1/5x^5 +... , если x < - 1;

Осталось правильно запрограммировать!..
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При вычислении максимального значения выдает О kerill385884 Помощь студентам 3 25.03.2010 18:52
С++, найти ошибку в вычислении бесконечной нормы матрицы OffyGhost Помощь студентам 2 09.03.2010 14:18
Ошибка при вычислении.. CodeExpert Помощь студентам 7 17.02.2010 17:24
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
ошибка в вычислении wowka Помощь студентам 4 21.07.2008 15:51