Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

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

Ответ
 
Опции темы
Старый 11.05.2017, 02:29   #1
emalf
 
Регистрация: 15.12.2016
Адрес: Москва
Сообщений: 6
Репутация: 10
Восклицание Оператор цикла для вычисления суммы ряда

Нужно написать ряд Тейлора по формуле: arctg(x)=x-x^3/3+x^5/5-x^7/7+... |x|<=1
как указать в программе x<=1?! и моя программа немного неправильно написана, я в ступоре. Объясните, пожалуйста

Код:

#include <iostream>
#include <locale.h>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
setlocale(LC_ALL, ".1251");
float xn, xk, dx, eps, x, s, f;
int i,n;
cout<<"\n\nVvedite xn = ";
cin>>xn;
cout<<"\n\nVvedite xk = ";
cin>>xk;
cout<<"\n\nVvedite shag dx = ";
cin>>dx;
cout<<"\n\nVvedite tochnost eps = ";
cin>>eps;
cout<<"\n         x      s(x)     atan x        n\n";
n=0;
for(x=xn; x<=xk; x+=dx)
{  s=x;
for(f=x,i=3; fabs(f)>eps; i+=2)
{  f=f*(-x*x/(i-1)/i);
s+=f; n=i;
}
cout<<"\n"<<setprecision(4)<<setw(10)<<x
<<setprecision(4)<<setw(10)<<s
<<setprecision(4)<<setw(10)<<atan(x)
<<setw(10)<<n;
}
cout<<"\n";
system("PAUSE");
}

Ps: я, наверно, не в ту тему написала (надо в помощь студентам), извините

Последний раз редактировалось emalf; 11.05.2017 в 02:43.
emalf вне форума   Ответить с цитированием
Старый 11.05.2017, 10:56   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 280
Репутация: 59
По умолчанию

Цитата:
Сообщение от emalf Посмотреть сообщение
как указать в программе x<=1?!
- в программе это не нужно указывать. Ряд работает только в этом числе(от -1 до 1). Вам нужно сделать проверку, чтобы входное число x было в этом диапазоне, иначе будет ошибка. Ошибка заключается в том что ряд не подсчитает число неправильно, а будет просто выдан бред.
Cuprum5 на форуме   Ответить с цитированием
Старый 11.05.2017, 11:30   #3
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 280
Репутация: 59
По умолчанию

Сделал в C++Bilder 6.
Получилось!!!!! А-ха-ха-ха-ха-ха-ха!!!!!
Код:

//---------------------------------------------------------------------------
//Example program
#include <vcl>
#include <iostream>
#include <conio>
#include <string>
#include <math>
#include <iomanip>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;

int main(int argc, char* argv[])
{
double xn = -1, xk = 1, dx = 0.2, eps = 0.001, x, s, f;
int Sign, k, n;

cout<<"-------------------------------------------------------------------------";
cout<<"\n|         x       |       s(x)      |       atan x    |         n       |\n";
cout<<"-------------------------------------------------------------------------";
for(x = xn; x <= xk; x += dx)
{
    n = 0;
    s = 0;
    Sign = 1;
    for(f = 1, k = 1; fabs(f) > eps; k += 2)
    {
        //f *= -x*x/k/(k-2);
        f = Sign*pow(x, k)/k;
        s += f;
        Sign = -Sign;
        n++;
    }
    cout << "\n|" << setprecision(4) << setw(17) << x
    << "|" << setprecision(4) << setw(17) << s
    << "|" << setprecision(4) << setw(17) << atan(x)
    << "|" << setw(17) << n << "|";
}
cout<<"\n-------------------------------------------------------------------------";

getch();
return 0;
}
//---------------------------------------------------------------------------

Ну ввод уж сделаете сами, хорошо?
Cuprum5 на форуме   Ответить с цитированием
Старый 11.05.2017, 12:01   #4
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 280
Репутация: 59
По умолчанию

А что правда, если считать через домножающий множитель, то точность сильно страдает?????????????????
Код:

//---------------------------------------------------------------------------
//Example program
#include <vcl>
#include <iostream>
#include <conio>
#include <string>
#include <math>
#include <iomanip>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;

int main(int argc, char* argv[])
{
double xn = -1, xk = 1, dx = 0.2, eps = 0.001, x, s, f, b;
int Sign, k, n;

cout<<"-------------------------------------------------------------------------";
cout<<"\n|         x       |       s(x)      |       atan x    |         n       |\n";
cout<<"-------------------------------------------------------------------------";
for(x = xn; x <= xk; x += dx)
{
    n = 1;  //0
    s = x;
    Sign = -1;
    b = x;
    for(f = 1, k = 3; fabs(f) > eps; k += 2)
    {
        b *= x*x*(k-2)/k;
        f *= Sign*b;
        //f = Sign*pow(x, k)/k;
        s += f;
        Sign = -Sign;
        n++;
    }
    cout << "\n|" << setprecision(4) << setw(17) << x
    << "|" << setprecision(4) << setw(17) << s
    << "|" << setprecision(4) << setw(17) << atan(x)
    << "|" << setw(17) << n << "|";
}
cout<<"\n-------------------------------------------------------------------------";

getch();
return 0;
}
//---------------------------------------------------------------------------

Cuprum5 на форуме   Ответить с цитированием
Старый 11.05.2017, 12:09   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 280
Репутация: 59
По умолчанию

Первая строка вывода этой программы:
x = -1; s(x) = -0.7417; atan(x) = -0.7854; n = 501.
Точность здесь сильно отличается в худшую сторону по сравнению с первым вариантом программы. Поэтому я делаю вывод, что считать точнее будет через pow().
7 строка этого вывода:
x = 0.2; s(x) = 0.1973; atan(x) = 0.1974; n = 3.
Здесь уже точность неплохая, но это всегда так: чем билиже к 0 тем точнее.
Таким образом я делаю вывод:
1) 1 вариант программы использует pow() - медленно, но точно;
2) 2 вариант программы, где используется домножающий множитель:
Код:

b *= x*x*(k-2)/k;

Получился не самый точный результат, т.е. тут быстро, но не точно. Я прав?

Последний раз редактировалось Cuprum5; 11.05.2017 в 18:05.
Cuprum5 на форуме   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия для вычисления суммы ряда malikon Помощь студентам 3 02.05.2014 20:46
Программа для вычисления суммы бесконечного ряда (С++) yurets17 Помощь студентам 1 09.10.2013 23:16
С использованием цикла для вычисления суммы ряда решить уравнение ben74 Помощь студентам 0 15.03.2012 10:00
Решить уравнение с использованием цикла для вычисления суммы ряда ben74 Помощь студентам 1 05.02.2012 12:48
программа для вычисления суммы ряда Vitalina69 Общие вопросы Delphi 2 01.12.2010 20:47




08:00.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru