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

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

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

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

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

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

Нужно написать ряд Тейлора по формуле: 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 в 01:43.
emalf вне форума Ответить с цитированием
Старый 11.05.2017, 09:56   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

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

Сделал в 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, 11:01   #4
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

А что правда, если считать через домножающий множитель, то точность сильно страдает?????????????????
Код:
//---------------------------------------------------------------------------
//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, 11:09   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Первая строка вывода этой программы:
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 в 17:05.
Cuprum5 на форуме Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия для вычисления суммы ряда 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 19:47