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

Сравнение функций - C++

Восстановить пароль Регистрация
 
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
01.12.2013, 21:53     Сравнение функций #1
Здравствуйте. Прошу помощи т.к. зашел в тупик.
Задача: Требуется написать программу которая вычисляла тригонометрическую функцию двумя путями: с использованием математических функций math.h и разложением тригонометрической функции в ряд, а затем сравнить результаты вычислений с некоторой точностью эпсилон.. К сожалению не получается реализовать функцию по разложению в ряд.

Формула разложения котангенса

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include<iostream>
#include<conio.h>
#include<math.h>
void stopping();
double seq_ctg(double,double);
double mpow(double , double);
double fact(double);
using namespace std;
const double PI=3.14;
const long N=12;
int main()
{
setlocale(LC_ALL,"Rus");
double eps, xs,xe,dx,xi, myctg, cctg,delta; 
cout<<"Введите E --> ";
cin>>eps;
cout<<"Введите X start --> ";
cin>>xs;
cout<<"Введите X end --> ";
cin>>xe;
cout<<"Введите DX --> ";
cin>>dx;
if(dx<=0||xs>=xe)
stopping();
printf("|-----------------|-------------------|-----------------|-------------------|\n");
printf("|        X        |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
printf("|-----------------|-------------------|-----------------|-------------------|\n");
for( ;xs<=xe;xs=xs+dx)
{  
   if(xs/PI!=1)
   {
   cctg=cos(xs)/sin(xs);
   myctg=seq_ctg(xs,eps);
   delta=sqrt(abs(myctg*myctg-cctg*cctg));
   printf("|    %10.6f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",xs,myctg,cctg,delta);
   }
   else 
   {
       printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 
   }
}
printf("|-----------------|-------------------|-------------------------------------|\n");
cout<<"Введите X ideal --> ";
 cin>>xi;
 eps=0.1;
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 printf("|    Epsilon      |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 for( ;eps>0.0000001;eps=eps/10)
{
    
      
      if(xs/PI!=1)
      {
            myctg=seq_ctg(xi,eps);
            cctg=cos(xi)/sin(xi);
            delta=sqrt(abs(myctg*myctg-cctg*cctg));
            printf("|    %10.7f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",eps,myctg,cctg,delta);
       }
else
    printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 }
    printf("|-----------------|-------------------|-------------------------------------|\n");
 
 
cin.get();
cin.get();
return 0;
}
 
 double seq_ctg(double xs, double eps)
 {int n=0;
 double prov,rezult=0;
 do
 {prov=rezult;
 rezult=rezult+((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
 n++;
 }
 while(abs(rezult-prov)>=eps);
 return prov/xs;
 }
 
 
 
 double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
 double mpow(double x, double y)
{
    double r = 1;
    while((y--)>0) r*=x;
    return r;
}
 
void stopping()
   {
cout<<"Ошибка";
cin.get();
cin.get();
exit(0);
   }
Библиотечная и рядная функции слишком намного отличаются.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
01.12.2013, 23:40     Сравнение функций #2
parkito, в формуле указано что модуль x должен быть меньше Пи. Я не увидел у Вас этого условия в программе. Условие
C++
1
if(xs/PI!=1)
еще не говорит о том, что x меньше, он может быть и больше и частное в этом случае тоже не будет равно 1. Это так на вскидку.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
01.12.2013, 23:43     Сравнение функций #3
Цитата Сообщение от parkito Посмотреть сообщение
if(xs/PI!=1)
Нельзя так сравнивать вещественные числа в принципе, т.к. представление не точное; должно быть что-нибудь вроде
C++
1
if (std::abs(xs / PI - 1) > eps)
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
01.12.2013, 23:46  [ТС]     Сравнение функций #4
Тем не менее, даже если я жестко задаю условие
C++
1
if(abs(xs)<PI&&xs!=0)
Не работает корректно
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include<iostream>
#include<conio.h>
#include<math.h>
void stopping();
double seq_ctg(double,double);
double mpow(double , double);
double fact(double);
using namespace std;
const double PI=3.14;
const long N=12;
int main()
{
setlocale(LC_ALL,"Rus");
double eps, xs,xe,dx,xi, myctg, cctg,delta; 
cout<<"Введите E --> ";
cin>>eps;
cout<<"Введите X start --> ";
cin>>xs;
cout<<"Введите X end --> ";
cin>>xe;
cout<<"Введите DX --> ";
cin>>dx;
if(dx<=0||xs>=xe)
stopping();
printf("|-----------------|-------------------|-----------------|-------------------|\n");
printf("|        X        |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
printf("|-----------------|-------------------|-----------------|-------------------|\n");
for( ;xs<=xe;xs=xs+dx)
{  
   if(abs(xs)<PI&&xs!=0)
   {
   cctg=cos(xs)/sin(xs);
   myctg=seq_ctg(xs,eps);
   delta=sqrt(abs(myctg*myctg-cctg*cctg));
   printf("|    %10.6f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",xs,myctg,cctg,delta);
   }
   else 
   {
       printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 
   }
}
printf("|-----------------|-------------------|-------------------------------------|\n");
cout<<"Введите X ideal --> ";
 cin>>xi;
 eps=0.1;
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 printf("|    Epsilon      |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 for( ;eps>0.0000001;eps=eps/10)
{
    
      
      if(abs(xs)<PI&&xs!=0)
      {
            myctg=seq_ctg(xi,eps);
            cctg=cos(xi)/sin(xi);
            delta=sqrt(abs(myctg*myctg-cctg*cctg));
            printf("|    %10.7f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",eps,myctg,cctg,delta);
       }
else
    printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 }
    printf("|-----------------|-------------------|-------------------------------------|\n");
 
 
cin.get();
cin.get();
return 0;
}
 
 double seq_ctg(double xs, double eps)
 {int n=0;
 double prov,rezult=0;
 do
 {prov=rezult;
 rezult=rezult+((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
 n++;
 }
 while(abs(rezult-prov)>=eps);
 return prov/xs;
 }
 
 
 
 double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
 double mpow(double x, double y)
{
    double r = 1;
    while((y--)>0) r*=x;
    return r;
}
 
void stopping()
   {
cout<<"Ошибка";
cin.get();
cin.get();
exit(0);
   }
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
01.12.2013, 23:52     Сравнение функций #5
Цитата Сообщение от parkito Посмотреть сообщение
xs!=0
Ещё раз скажу, что так нельзя; там, где по логике должен быть 0, его вполне может не быть, а будет какое то близкое число, например 0.00000001 .
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
01.12.2013, 23:57  [ТС]     Сравнение функций #6
Хорошо. А что по работе функции ?
C++
1
seq_ctg
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
02.12.2013, 00:02     Сравнение функций #7
parkito, вот здесь
C++
1
2
3
4
5
6
do
{
    prov=rezult;
    rezult=rezult+((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
    n++;
}while(abs(rezult-prov)>=eps);
разность может быть меньше введенного вами эпсилон, но результат будет сильно отличаться от котангенса. Я бы сравнивал разность котангенса из math.h и полученного вами значения. Если использовать ваши обозначения, то:
C++
1
2
3
4
5
do
{
    rezult+=((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n));
    n++;
}while(eps <= abs(rezult - cctg));
Как-нибудь так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 00:11     Сравнение функций
Еще ссылки по теме:

C++ Сравнение C++ с С#
C++ Организовать арифметику класса ( сложение вычитание и сравнение) в виде именованных функций, сохраняющих результат в объекте «this»
C++ Вызов функций внутри других функций

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

Или воспользуйтесь поиском по форуму:
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
02.12.2013, 00:11  [ТС]     Сравнение функций #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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include<iostream>
#include<conio.h>
#include<math.h>
void stopping();
double seq_ctg(double,double,double);
double mpow(double , double);
double fact(double);
using namespace std;
const double PI=3.14;
const long N=12;
int main()
{
setlocale(LC_ALL,"Rus");
double eps, xs,xe,dx,xi, myctg, cctg,delta; 
cout<<"Введите E --> ";
cin>>eps;
cout<<"Введите X start --> ";
cin>>xs;
cout<<"Введите X end --> ";
cin>>xe;
cout<<"Введите DX --> ";
cin>>dx;
if(dx<=0||xs>=xe)
stopping();
printf("|-----------------|-------------------|-----------------|-------------------|\n");
printf("|        X        |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
printf("|-----------------|-------------------|-----------------|-------------------|\n");
for( ;xs<=xe;xs=xs+dx)
{  
   if(abs(xs)<PI&&xs!=0)
   {
   cctg=cos(xs)/sin(xs);
   myctg=seq_ctg(xs,eps,cctg);
   delta=sqrt(abs(myctg*myctg-cctg*cctg));
   printf("|    %10.6f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",xs,myctg,cctg,delta);
   }
   else 
   {
       printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 
   }
}
printf("|-----------------|-------------------|-------------------------------------|\n");
cout<<"Введите X ideal --> ";
 cin>>xi;
 eps=0.1;
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 printf("|    Epsilon      |      My_ctg(x)    |       ctg(x)    |        Sigma      |\n");
 printf("|-----------------|-------------------|-----------------|-------------------|\n");
 for( ;eps>0.0000001;eps=eps/10)
{
    
      
      if(abs(xs)<PI&&xs!=0)
      {
            myctg=seq_ctg(xi,eps,cctg);
            cctg=cos(xi)/sin(xi);
            delta=sqrt(abs(myctg*myctg-cctg*cctg));
            printf("|    %10.7f   |     %10.6f    |    %10.6f   |     %10.6f    |\n",eps,myctg,cctg,delta);
       }
else
    printf("|    %10.7f   |       Ошибка      |      Ошибка     |       Ошибка      |\n",xs,myctg,cctg,delta);
 }
    printf("|-----------------|-------------------|-------------------------------------|\n");
 
 
cin.get();
cin.get();
return 0;
}
 
 double seq_ctg(double xs, double eps, double cctg)
 {int n=0;
 double prov,rezult=0;
 do
{
    rezult+=((mpow(-1,n)*mpow(2,2*n)*mpow(xs,2*n))/fact(2*n))/xs;
    n++;
 }while(eps <= abs(rezult - cctg));
 return rezult;
 }
 
 
 
 double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
 double mpow(double x, double y)
{
    double r = 1;
    while((y--)>0) r*=x;
    return r;
}
 
void stopping()
   {
cout<<"Ошибка";
cin.get();
cin.get();
exit(0);
   }
Не работает.
Для остановки счета нужно использовать погрешность епсилон. В противном случае смысл программы меняется.
Yandex
Объявления
02.12.2013, 00:11     Сравнение функций
Ответ Создать тему
Опции темы

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