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

Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
24.07.2012, 16:33     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #1
Всем доброго время суток! Проверьте пожалуйста правильный ли следующий код
exp(x):
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 <cmath>
#include <iostream>
#include <cstdlib>
using namespace std;
 
double my_abs(double val)
{
    double ret = val;
    if(val < 0)
        ret *= -1;
    return ret;
}
 
double Taylor(double x, double e, long &n)
{
    double sum = 0;
    double an = 1;
    n = 1;
    do
    {
        sum += an;
        n   += 1;
        an *= x/(1.0*n);
    }
    while(e <= my_abs(an));
    return sum;
    
}
 
int main()
{
    long n;
    double xn, xk, dx, e;
    cout<<"xn = ";cin>>xn;
    cout<<"xk = ";cin>>xk;
    cout<<"dx = ";cin>>dx;
    cout<<" e = ";cin>>e;
    cout<<"|  x  |  Sum  |   N   |\n";
    while(xn <= xk)
    {
        cout<<xn<<" | "<<Taylor(xn, e, n)<<" |  ";
        cout<<n<<endl;
        xn = xn + dx;
    }
    system("pause");
    return 0;
}
и exp(-x):
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 <cmath>
#include <iostream>
#include <cstdlib>
using namespace std;
 
double my_abs(double val)
{
    double ret = val;
    if(val < 0)
        ret *= -1;
    return ret;
}
 
double Taylor(double x, double e, long &n)
{
    double sum = 0;
    double an = 1;
    n = 1;
    do
    {
        sum += an;
        n   += 1;
       an *= (-1)*x/(1.0*n);
    }
    while(e <= my_abs(an));
    return sum;
    
}
 
int main()
{
    long n;
    double xn, xk, dx, e;
    cout<<"xn = ";cin>>xn;
    cout<<"xk = ";cin>>xk;
    cout<<"dx = ";cin>>dx;
    cout<<" e = ";cin>>e;
    cout<<"|  x  |  Sum  |   N   |\n";
    while(xn <= xk)
    {
        cout<<xn<<" | "<<Taylor(xn, e, n)<<" |  ";
        cout<<n<<endl;
        xn = xn + dx;
    }
    system("pause");
    return 0;
}
Заранее огромное спасибо!!!

Добавлено через 45 минут
Никто не может подсказать????
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2012, 16:33     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x)
Посмотрите здесь:

C++ exp(-40)
C++ Вычислить: с=2*exp(x)+2/5*y^x
Вычисление exp с заданной точностью C++
exp(x) возвращает 0 C++
C++ функция exp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.07.2012, 17:27     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #2
А что проверить то надо - чего надо добиться от программы?
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
24.07.2012, 22:21  [ТС]     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #3
Проверить нужно правильно ли программы вычисляют exp(x) и exp(-x)?
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2012, 21:01     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #4
isaak, у тебя есть код для экспонеты exp(x), для exp(-x) не надо ничего придумывать, просто надо воспользоваться свойством показателя степени - а именно отриц степень это тоже число в положительной степени но в знаменателе, т.е exp(-x) = 1/exp(x) и всё
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.07.2012, 21:14     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #5
isaak, оба варианта не верны. Во первых, считает неверно, не такое начальное условие. Надо так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Taylor(double x, double e, long &n)
{
    double sum = 0;
    double an = 1;
    n = 0;
    do
    {
        sum += an;
        n   += 1;
        an *= x/(1.0*n);
    }
    while(e <= my_abs(an));
    return sum;
}
Во вторых, намешали точность и количество членов ряда. Ваш алгоритм идет до тех пор, пока очередной член ряда не станет меньше e, но это не оценка остатка. Я бы по-другому алгоритм написал. А про exp(-x) вам правильно подсказывают, но опять же, exp(-x) можно уже с наперед заданной точностью считать, так как ряд станет рядом Лейбница.
Catstail
Модератор
 Аватар для Catstail
21493 / 10246 / 1670
Регистрация: 12.02.2012
Сообщений: 17,129
25.07.2012, 21:25     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #6
Чем просить "проверить" - вычисли стандартную экспоненту и сравни со своей...
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2012, 21:30     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #7
Расчёт рекуррентного сомножителя(итератора)
http://www.cyberforum.ru/cgi-bin/latex.cgi?{e}^{x} = 1 + x + \frac{{x}^{2}}{2!} + \frac{{x}^{3}}{3!} + ...
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = \frac{{x}^{n}}{n!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = \frac{{x}^{n + 1}}{(n + 1)!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n + 1}}{{a}_{n}} = \frac{ \frac{{x}^{n + 1}}{(n + 1)!}}{\frac{{x}^{n}}{n!}} = x*\frac{n!}{(n+1)!} = \frac{x}{n + 1}
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2012, 21:31     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #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
#include <cmath>
#include <iostream>
using namespace std;
 
double my_abs(double val)
{
    double ret = val;
    if(val < 0)
        ret *= -1;
    return ret;
}
 
double Taylor(double x, double e, long &n)
{
    double sum = 1 + x;
    double an  = x;
    for(n = 1;e <= my_abs(an);n++)
    {
        an *= x/(1.0*(n + 1));
        sum += an;
    }
    return sum;
    
}
 
int main()
{
    long n = 0;
    double x, xn, xk, dx, e;
    cout<<"xn = ";cin>>xn;
    cout<<"xk = ";cin>>xk;
    cout<<"dx = ";cin>>dx;
    cout<<" e = ";cin>>e;
    cout<<"exp(x) : ["<<xn<<";"<<xk<<"]\n";
    cout<<"----------------------------------\n";
    cout<<"|  x \t|   Sum   | cmath   |  N  |\n";
    cout<<"----------------------------------\n";
    for(x = xn;x <= xk; x = x + dx)
    {
        cout<<x<<"\t| "<<Taylor(x, e, n)<<" | ";
        cout<<exp(x)<<" | "<<(n = n + 1)<<"\t| "<<endl;
    }
    cout<<"exp(-x) : ["<<xn<<";"<<xk<<"]\n";
    cout<<"----------------------------------\n";
    cout<<"|  x \t|   Sum   | cmath   |  N  |\n";
    cout<<"----------------------------------\n";
    for(x = xn;x <= xk; x = x + dx)
    {
        cout<<-x<<"\t| "<<1/Taylor(x, e, n)<<" | ";
        cout<<exp(-x)<<" | "<<(n = n + 1)<<"\t| "<<endl;
    }
    system("pause");
    return 0;
}
Миниатюры
Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x)  
-=ЮрА=-
25.07.2012, 21:32
  #9

Не по теме:

Thinker, не узнал тебя по аве
Давно не пересекались на форуме, как поживаешь?

Thinker
25.07.2012, 21:37
  #10

Не по теме:

нормально, -=ЮрА=-, спасибо

isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
25.07.2012, 22:27  [ТС]     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #11
-=ЮрА=- спасибо огромное за ответ
http://www.cyberforum.ru/cgi-bin/latex.cgi?{e}^{x} = 1 + x + \frac{{x}^{2}}{2!} + \frac{{x}^{3}}{3!} + ... - это понятно
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = \frac{{x}^{n}}{n!} - это понятно
Объясни пожалуйста, почему ты взял следующее слагаемое
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = \frac{{x}^{n + 1}}{(n + 1)!} ??????
а не предыдущее
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n + 1}}{{a}_{n}} = \frac{ \frac{{x}^{n + 1}}{(n + 1)!}}{\frac{{x}^{n}}{n!}} = x*\frac{n!}{(n+1)!} = \frac{x}{n + 1}?????
И почему у тебя:
C++
1
2
double sum = 1 + x;
    double an  = x;
???? Заранее огромное спасибо!!!!
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2012, 09:26     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #12
Смотри 1-ца это x^0/0!, затем идёт x^1/1, т.е a[n] = x^1/1 = x при этом само n = 1 вот и начало цикла
C++
1
2
3
4
5
for(n = 1;e <= my_abs(an);n++)
{
        an *= x/(1.0*(n + 1));
        sum += an;
}
При этом если начинать с нуля n=0: a[n] = x^0/0! = 1 то мое сравнение my_abs(an) всегда отработает и мы попадём в цикл и делаем в нём по крайней мере 1-ну итерацию(т.е всё равно попадаем на a[1]). Получается суть такая - мы всегда при точности на порядок ниже единицы просчитаем два первых слагаемых {x^0/0! = 1} + {x^1/1! = x} поэтому я сразу сумму такой и сделал
C++
1
double sum = 1 + x;
Добавлено через 9 минут
На счёт следующего или предыдущего слагаемого да не вопрос смотри
Введём обозначение m = n + 1 тогда
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{m} = \frac{{x}^{m}}{m!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{m - 1} = \frac{{x}^{m - 1}}{(m - 1)!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{m}}{{a}_{m - 1}} = \frac{\frac{{x}^{m}}{m!}}{\frac{{x}^{m - 1}}{(m - 1)!}}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{m}}{{a}_{m - 1}} = x*\frac{(m - 1)!}{m!} = \frac{x}{m}
Подставляя в последнюю формулу m = n + 1 в итоге получим
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n + 1}}{{a}_{n}} =  \frac{x}{n + 1}
Данную формулу мы получили вверху.
От себя добавлю для однозначности лучше всегда рассматривать n и n + 1 члены
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2012, 14:28     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x)
Еще ссылки по теме:

C++ вычисление математической функции exp(x)
exp(x) C++

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

Или воспользуйтесь поиском по форуму:
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
26.07.2012, 14:28  [ТС]     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x) #13
-=ЮрА=- спасибо огромное за ответ, но все равно не понятно почему для
http://www.cyberforum.ru/cgi-bin/latex.cgi?cos(x)=\sum \frac{{(-1)}^{n}*{x}^{2*n}}{(2n)!}
Сразу же берем отношение
данного слагаемого-http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n}=\frac{{(-1)}^{n}*{x}^{2n}}{(2n)!}=\frac{{(-1)}^{n}*{x}^{(2n)}}{(2n)*(2n-1)*(2n-2)!}


к предыдущему слагаемого - http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n-1}=\frac{{(-1)}^{(n-1)}*{x}^{2*(n-1)}}{(2(n-1))!}= \frac{{(-1)}^{(n-1)}*{x}^{(2n-2)}}{(2n-2)!}


Результат:

http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n-1}}=\frac{\frac{{(-1)}^{n}*{x}^{(2n)}}{(2n)*(2n-1)*(2n-2)!}}{\frac{{(-1)}^{(n-1)}*{x}^{(2n-2)}}{(2n-2)!}}=\frac{{(-1)}^{n}*{x}^{(2n)}}{(2n)*(2n-1)}

И для http://www.cyberforum.ru/cgi-bin/latex.cgi?sin(x)=\sum \frac{{(-1)}^{n}*{x}^{(2n+1)}}{(2n+1)!}
тоже самое:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n-1}}=\frac{\frac{{(-1)}^{n}*{x}^{(2n)}}{(2n)*(2n-1)*(2n-2)!}}{\frac{{(-1)}^{(n-1)}*{x}^{(2n-2)}}{(2n-2)!}}=\frac{{(-1)}^{n}*{x}^{(2n)}}{(2n)*(2n-1)}
Почему же для вычисления: http://www.cyberforum.ru/cgi-bin/latex.cgi?exp(x) = \sum \frac{{(-1)}^{n}*{x}^{(2n)}}{(2n)!}

нужно добавлять 1: m = n+1 получается, что нужно брать отношение следующего слагаемого к данному????? Я не могу понять алгоритм вычисления рекуррентной формулы????? Объясни пожалуйста заранее огромное спасибо!!!!
Yandex
Объявления
26.07.2012, 14:28     Проверьте пожалуйста правильный ли следующий код: вычисление exp(x) и exp(-x)
Ответ Создать тему
Опции темы

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