Форум программистов, компьютерный форум CyberForum.ru

ArcSec через степенные ряды - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 21:07     ArcSec через степенные ряды #1
Программа предназначена для вычисления ArcSec, но почему-то результат выдает не тот который нужно, помогите подправить(((
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
#include <iostream>
using namespace std;
double fuct (int n)
{
    double fuct= 1.0;
    for (register int i=2; i<=n; i++)
        fuct*=i;
    return fuct;
}
double power (double x, int n)
{
    double power = 1.0;
    for ( register int i=1; i<=n; i++)
        power*=x;
    return power;
}
double abs (double x)
{
    return ((x<0)? -x:x);
}
double ArcSec (double x, double eps)
{
    int n=1;
    double yp, ArcSec=1.0;
    do 
    {
        yp=ArcSec;
        ArcSec=yp+((fuct(2*n)/power(2,2*n)*fuct(n)*fuct(n)))*(power(x,-2*n-1)/2*n+1);
        n++;
    }
    while (abs ( ArcSec-yp)>eps);
    return ArcSec;
}
void main()
{
    char ch;
    short digit;
    double value, epsilon;
    cout <<"Input the digit number [1;8]";
    cin >> digit;
    epsilon = 1/power(10, digit);
    cout <<"Input X - value:";
    cin >> value;
    cout <<"Y=ArcSec(x)="<<ArcSec(value,epsilon);
    cin.get (ch);
    cin.get (ch);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2010, 21:07     ArcSec через степенные ряды
Посмотрите здесь:

C++ Ряды
ряды C++
C++ ряды
C++ Ряды
ряды C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 21:30     ArcSec через степенные ряды #2
а какой результат и для каких значений должен быть, когда вы вручную считаете?
и есть формула ArcSec в обычном виде? может в ней ошибка...
и 17-20 строки не нужны, ф-ция модуля присутствует, если подключить заголовочный файл
#include <cmath>
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 21:42  [ТС]     ArcSec через степенные ряды #3
ну вот такая
Миниатюры
ArcSec через степенные ряды  
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 21:51  [ТС]     ArcSec через степенные ряды #4
сколько должно получиться точно не знаю, но все равно ответ выдает 1.#INF , что-то подсказывает, что это не правильный ответ)))

Добавлено через 6 минут
п/2 потеряла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double ArcSec (double x, double eps)
{
    int n=1;
    double yp, ArcSec=1.0;
    do 
    {
        yp=ArcSec;
        ArcSec=yp+((fuct(2*n)/power(2,2*n)*fuct(n)*fuct(n)))*(power(x,-2*n-1)/2*n+1);
        n++;
    }
    while (abs ( ArcSec-yp)>eps);
    ArcSec=3.14/2-ArcSec;
    return ArcSec;
}
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 21:54     ArcSec через степенные ряды #5
хм, ну если arcsec(z) = arccos(z^-1)
то можно просто написать
C++
1
2
3
#include <cmath>
float z = 3;
float arcsec = acos(pow(z, -1));
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 21:59  [ТС]     ArcSec через степенные ряды #6
да, это гораздо проще))) но в задании нужно обязательно вычисление произвести через степенные ряды(( вот на сайте посчитала несколько арксекансов http://www.planetcalc.ru/326/ программа вместо того, чтобы писать полностью ответ, все что после запятой заменяет #INFом, подскажите, где я неправильно написала?
AndyHell
 Аватар для AndyHell
5 / 5 / 0
Регистрация: 18.04.2010
Сообщений: 20
19.04.2010, 01:24     ArcSec через степенные ряды #7
Тоже интересует подсчет именно через степенные ряды.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
19.04.2010, 04:49     ArcSec через степенные ряды #8
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
#include <iostream>
#include<cmath>
 
double factorial(double x) { 
        if( x == 0 ) 
            return 1;
        return x * factorial (x - 1);
}
 
double arcsec(double z){
    double arcsec = 0, sum = 0, pi = 3.14;
    double n = 0;
    if(abs(z)>=1){
        sum += ((factorial(2*n) / (powf(2, 2*n) * powf(factorial(n), 2))) * (powf(z, (-(2*n+1))) / (2*n+1)));
        n++;
            arcsec = pi/2 - sum;
    }
    return arcsec;
}
 
void main(){
    double z;
    std::cout << "Enter value z: ";
    std::cin >> z;
    std::cout << "arcsec " << z << " = " << arcsec(z) << std::endl;
    system("pause");
}
для z = 4, онлайн калькулятор подсчитал в радианах
arcsec = 1.3181160717
здесь
arcsec = 1.32
вроде правильно
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
19.04.2010, 12:16     ArcSec через степенные ряды #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double ArcSec(double argument, double precision)
{
   if (fabs(argument) < 1)
      return 0;
   const double PI = 3.14159265358979;
   int n = 0;
   double value, factor;
 
   factor = 1 / argument;
   value = PI / 2.0 - factor;
   do
   {
      n++;
      factor *= ((2*n-1)/(2*n*argument*argument));
      value -= (factor/(2*n+1));
   }while(fabs(factor/(2*n+1)) > precision);
   return value;
}
llomushka
 Аватар для llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
19.04.2010, 18:44  [ТС]     ArcSec через степенные ряды #10
Спасибо за помощь!!!
AndyHell
 Аватар для AndyHell
5 / 5 / 0
Регистрация: 18.04.2010
Сообщений: 20
19.04.2010, 19:12     ArcSec через степенные ряды #11
а можно ли сделать так, чтобы знак после запятой, до которого должно происходить вычисление функции задавался пользователем?
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
19.04.2010, 22:17     ArcSec через степенные ряды #12
да, можно
C++
1
2
3
4
5
6
7
#include <iostream>
#include <iomanip>
.....
double z = 4;
std::cout.flags(std::ios::fixed);
std::cout << std::setprecision(5); //5 знаков после запятой
std::cout << z << std::endl;
а вообще вот все это есть
AndyHell
 Аватар для AndyHell
5 / 5 / 0
Регистрация: 18.04.2010
Сообщений: 20
19.04.2010, 22:32     ArcSec через степенные ряды #13
Огромное спасибо!
в конечном итоге получилось следующее
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
#include <iostream>
#include <cmath>
#include <iomanip>
 using namespace std;
double factorial(double x) { // Вычисление факториала
        if( x == 0 ) 
                return 1;
        return x * factorial (x - 1);
}
 
double arcsec(double z){  // Вычисление ArcSec
        double arcsec = 0, sum = 0;
    const double PI = 3.14159265358979;
        int n = 0;
        if(fabs(z)>=1)
    {
         sum += ((factorial(2*n) / (powf(2, 2*n) * powf(factorial(n), 2))) * (powf(z, (-(2*n+1))) / (2*n+1)));
             n++;
             arcsec = PI/2 - sum;
        }
        return arcsec;
}
 
void main()
{
        double z=0, eps=0;
    short digit;
        cout << "Input the digit number [1;4]";
        cin >> digit;
    cout <<"Input X - value:";
        cin >> z;
        cout << "arcsec " << z;
    cout.flags(ios::fixed);
        cout << setprecision(digit);
    cout<< " = " << arcsec(z) << endl;
        system("pause");
}
Всё замечательно считает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2010, 01:47     ArcSec через степенные ряды
Еще ссылки по теме:

Вычисление арккотангенса через арктангенс, разложенный в степенные ряды C++
Ряды C++
Ряды C++

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

Или воспользуйтесь поиском по форуму:
AndyHell
 Аватар для AndyHell
5 / 5 / 0
Регистрация: 18.04.2010
Сообщений: 20
23.04.2010, 01:47     ArcSec через степенные ряды #14
Вот ещё один вариант реализации
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
49
50
#include <iostream>
using namespace std;
double fuct (int n)
{
    double fuct= 1.0;
    for (register int i=2; i<=n; i++)
        fuct*=i;
    return fuct;
}
double power (double x, int n)
{
    double power = 1.0;
    for ( register int i=1; i<=n; i++)
        power*=x;
    return power;
}
double abs (double x)
{
    return ((x<0)? -x:x);
}
double ArcSec (double x, double eps)
{
    int n=0;
    double yp, ArcSec=0;
    if (abs(x)<=1) return 0;
    do 
    {
        yp=ArcSec;
        ArcSec=yp+((fuct(2*n)/(power(2,2*n)*fuct(n)*fuct(n)))*((1/power(x,2*n+1))/(2*n+1)));
        n++;
    }
    while (abs ( ArcSec-yp)>eps);
 
    return 1.570796326794895 - ArcSec;
}
void main()
{
    char ch;
        short digit;
    double value, epsilon;
    cout <<"Input the digit number [1;8]";
    cin >> digit;
    epsilon = 1/power(10, digit);
    cout <<"Input X - value:";
    cin >> value;
    cout.precision(digit);
    cout <<"Y=ArcSec(x)="<<ArcSec(value,epsilon);
    cin.get (ch);
    cin.get (ch);
}
Yandex
Объявления
23.04.2010, 01:47     ArcSec через степенные ряды
Ответ Создать тему
Опции темы

Текущее время: 23:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru