3 / 3 / 1
Регистрация: 30.03.2014
Сообщений: 50
1

Итеративный и рекурсивный методом вычисления ln 1 + x, через разложение в ряд

06.04.2015, 01:06. Показов 2815. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, друзья.
Помогите мне пожалуйста с прогой.
Уже мучаюсь очень долго время, не могу найти выхода.

Суть задания:
Написать программу с итеративным и рекурсивным методом для ln 1 + x, через разложение ряда.
Без использования pow и факторила.

Суть проблемы, при запуске программа начинает бесконечно считать или же выдает nan.
Подскажите, где накосячил - спасибо большое, особенно за подробные объяснения
P.S.
В законченном куске просто другой вариант высчитывания точности.


Код:
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>
#include <cmath>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
double MyLn(double x,double eps)
{
int n=3,k=-1;   
double tek=eps,pov=x*x*x,sum=x,sum2=x,tek2=x;
while(fabs(tek)>=eps)
{
        tek=k*pov/n;
        sum+=tek;
        pov*=(x*x);
        k*=-1;
        n+=2;
}
     /*do
    {
        sum2=sum;
        tek=k*pov/n;
        sum+=tek;
        pov*=(x*x);
        k*=-1;
        n+=2;
    }while(abs(tek2-tek)>=eps);
    */
return sum;
}
int main(int argc, char** argv) {
    int x, select;
    double eps, rez;
    cout<<"Enter eps : ";
    cin>>eps;
    cout<<endl<<"Enter x : ";
    cin>>x;
    cout<<endl<<"Select function: 1 - itertion method or 2 - recursive method : ";
    cin>>select;
    cout<<endl;
    if(select==1)
    {
        rez = MyLn(x,eps);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
    }
    else
    {
        ;
    }
    return 0;
}
Добавлено через 48 минут
Не много подправил формулу и реализацию новых членов, но все равно считает бесконечно.
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
#include <iostream>
#include <cmath>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
double MyLn(double x,double eps)
{
int n=2;//k=-1; 
double tek=eps,pov=x,sum=x,sum2=x;
    while(fabs(tek)>=eps)
    {
        
        pov*=x;
        tek=pov/n;
        tek*=-1;
        sum+=tek;
        //sum2-=sum;    
        //k*=-1;
        n++;        
    }
return sum;
}
int main(int argc, char** argv) {
    int x, select;
    double eps, rez;
    cout<<"Enter eps : ";
    cin>>eps;
    cout<<endl<<"Enter x : ";
    cin>>x;
    cout<<endl<<"Select function: 1 - itertion method or 2 - recursive method : ";
    cin>>select;
    cout<<endl;
    if(select==1)
    {
        rez = MyLn(x,eps);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
    }
    else
    {
        ;
    }
    return 0;
}
Добавлено через 16 минут
Так же еще возникла проблема, что при изменении точности eps.
Меняется совсем значение.
То есть при
0.1
выдает -1.(набор цифр)
при 0.0001
выдает -7.(набор цифр)
хотя должны менстяь цифры только после запятой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2015, 01:06
Ответы с готовыми решениями:

Вычисление функции через разложение в ряд (Ряд Тейлора)
Привет всем. Задание такого плана: Вычислить и вывести на экран в виде таблицы значения...

Рекурсивный и итеративный метод
помогите пожалуйста написать программу для итеративного способа вычисления. нужно вычислить...

Рекурсивный и итеративный методы разворачивания числа
Не могу найти решение. В общем вводим целое число например '1234' , функция должна вернуть обратное...

Вычисление произведения выражения, используя итеративный и рекурсивный методы вычислений
Составить процедуру и функцию для вычисления произведения выражения, используя итеративный и...

10
Модератор
Эксперт С++
13111 / 10381 / 6209
Регистрация: 18.12.2011
Сообщений: 27,764
06.04.2015, 08:17 2
1.
Цитата Сообщение от Twelv Посмотреть сообщение
int x,select;
C++
1
2
double x;
int select;
2.
Цитата Сообщение от Twelv Посмотреть сообщение
начинает бесконечно считать
Ряд сходится только для x<1.
Если надо для других значений, то их сначала приводят к значению меньшему 1.
См. Вычисление функций разложением в ряд Тейлора в самом низу
1
3 / 3 / 1
Регистрация: 30.03.2014
Сообщений: 50
16.04.2015, 01:37  [ТС] 3
У меня при введении -1 все равно зависает, ну вечно считает.
И еще рекурсивный метод не считает, подскажите пожалуйста.

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
#include <iostream>
#include <cmath>
 
using namespace std;
double MyLn(double x,double eps)
{
int  n=2,k=-1;
double tek=eps,pov=x,sum=x,sum2=x;
 
 const double lnln=M_LN2; //ln2
 int a=0;
    while(x>2.0)
    {
        x/=2.0;
        a++;
    }
    x-=1.;
 
 
    while(fabs(tek)>=eps)
    {
 
        pov*=x;
        tek=k*pov/n;
        sum+=tek;
 
        k*=-1;
        n++;
    }
    sum+=a*lnln;
return sum;
}
 
double MyLnRec(double x,double eps,double sum,double pov,double tek,int n, int k)
{
    if(fabs(tek)>=eps)
    {
        pov*=x;
        tek=k*pov/n;
        sum+=tek;
        sum+=MyLnRec(x,eps,sum,pov,tek,n++,-1*k);
    }
    else
    {
        return sum;
    }
}
 
int main(int argc, char** argv) {
    double eps, rez;
    double x;
    cout<<"Enter eps : ";
    cin>>eps;
    cout<<endl<<"Enter x : ";
    cin>>x;
 
    cout<<endl;
    //iteration
        rez = MyLn(x,eps);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
    //recu
        rez = MyLnRec(x,eps,0,x,eps,2,-1);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
 
    return 0;
}
0
Модератор
Эксперт С++
13111 / 10381 / 6209
Регистрация: 18.12.2011
Сообщений: 27,764
16.04.2015, 07:02 4
Ряд сходится строго при x<1.
Вот здесь есть функция ln для любого x
Вычисление функций разложением в ряд Тейлора
0
3 / 3 / 1
Регистрация: 30.03.2014
Сообщений: 50
16.04.2015, 12:55  [ТС] 5
zss, дело в том, что я использовал этот метод и после него как раз у меня начались вот эти новые проблемы.
0
Модератор
Эксперт С++
13111 / 10381 / 6209
Регистрация: 18.12.2011
Сообщений: 27,764
16.04.2015, 13:13 6
Логарифм от отрицательных чисел не существует.
Так что, задавайте x>0
0
3 / 3 / 1
Регистрация: 30.03.2014
Сообщений: 50
16.04.2015, 13:15  [ТС] 7
zss, то есть получается область определния в которой будет работать программа это 1> x>0
0
Модератор
Эксперт С++
13111 / 10381 / 6209
Регистрация: 18.12.2011
Сообщений: 27,764
16.04.2015, 13:21 8
Для фунции MyLn - любые x>0
Для MyLnRec -1<x<1. Т.к. она считает ln(x+1)
0
3 / 3 / 1
Регистрация: 30.03.2014
Сообщений: 50
16.04.2015, 13:27  [ТС] 9
zss, а почему во втором случае меньше именно двух?
0
Модератор
Эксперт С++
13111 / 10381 / 6209
Регистрация: 18.12.2011
Сообщений: 27,764
16.04.2015, 13:28 10
по модулю меньше единицы. Я опечатался.
0
3 / 3 / 1
Регистрация: 30.03.2014
Сообщений: 50
16.04.2015, 22:23  [ТС] 11
zss, при вводе 0.9 второй метод, то есть рекурсивный выдает nan.

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
#include <iostream>
#include <cmath>
 
using namespace std;
double MyLn(double x,double eps)
{
int  n=2,k=-1;
double tek=eps,pov=x,sum=x,sum2=x;
 
 const double lnln=M_LN2; //ln2
 int a=0;
    while(x>2.0)
    {
        x/=2.0;
        a++;
    }
    x-=1.;
 
 
    while(fabs(tek)>=eps)
    {
 
        pov*=x;
        tek=k*pov/n;
        sum+=tek;
 
        k*=-1;
        n++;
    }
    sum+=a*lnln;
return sum;
}
 
double MyLnRec(double x,double eps,double sum,double pov,double tek,int n, int k, int a)
{
 
 const double lnln=M_LN2; //ln2
 //int a=0;
 if (x > 2.0)
 {
    while(x>2.0)
    {
        x/=2.0;
        a++;
    }
    x-=1.;
 }
 
 
    if(fabs(tek)>=eps)
    {
        pov*=x;
        tek=k*pov/n;
        sum+=tek;
        sum+=MyLnRec(x,eps,sum,pov,tek,n++,-1*k,a);
    }
    else
    {
        sum+=a*lnln;
        return sum;
    }
}
 
int main(int argc, char** argv) {
    double eps, rez;
    double x;
    cout<<"Enter eps : ";
    cin>>eps;
    cout<<endl<<"Enter x : ";
    cin>>x;
 
    cout<<endl;
    //iteration
        rez = MyLn(x,eps);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
    //recu
        rez = MyLnRec(x,eps,0,x,eps,2,-1,0);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
 
    return 0;
}
Добавлено через 49 минут
zss, я поправил еще и почти дошел до овтета.
но вот почему то у меня итеративный метод считает не верно, точнее он при введении 2 выдает 1.3, это слишком большая разница.
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
#include <iostream>
#include <cmath>
 
using namespace std;
double MyLn(double x,double eps)
{
int  n=2,k=-1;
double tek=eps,pov=x,sum=x,sum2=x;
 
 const double lnln=M_LN2; //ln2
 int a=0;
    while(x>2.0)
    {
        x/=2.0;
        a++;
    }
    x-=1.;
 
 
    while(fabs(tek)>=eps)
    {
 
        pov*=x;
        tek=k*pov/n;
        sum+=tek;
 
        k*=-1;
        n++;
    }
    sum+=a*lnln;
 
    return sum;
}
 
double MyLnRec(double x,double eps,double sum,double pov,double tek,int n, int k)
{
    if(fabs(tek)>=eps)
    {
        pov*=x;
        tek=k*pov/n;
        sum+=tek;
        sum+=MyLnRec(x,eps,sum,pov,tek,n++,-1*k);
    }
    else
    {
        return sum;
    }
}
 
double Rlog1p (double X, double eps)
 {
     if (abs(X) <= eps )
      return X;
   double Z = X/(X+2);
   return Rlog1p(Z , eps) - Rlog1p(-Z , eps);
 }
 
 
int main(int argc, char** argv) {
    double eps, rez;
    double x;
    cout<<"Enter eps : ";
    cin>>eps;
    cout<<endl<<"Enter x : ";
    cin>>x;
 
    cout<<endl;
    //iteration
        rez = MyLn(x,eps);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
    //recu
      /*  rez = MyLnRec(x,eps,0,x,eps,2,-1);
        cout<<"Rezult Ln(x+1) = "<<rez<<endl;
*/
        rez = Rlog1p (x, eps);
        cout<<"Rlog1p ="<<rez<<endl;
 
    return 0;
}
Добавлено через 8 минут
Я применил к рекурсии новый метод и он работает правильно.
Но теперь итеративный считает не верно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2015, 22:23
Помогаю со студенческими работами здесь

Посчитать число e через разложение в ряд
Здравствуйте. Помогите пожалуйста разобраться, не понимаю в чем ошибка: ряд вида: сумма(от i=0 до...

Вычислить arctg(x) через разложение в ряд
Вычислить arctg(x) с точностью ε = 0.0001, воспользовавшись разложением в ряд: arctg(x)=...

Вычислить значение е^х через разложение в ряд
Задали задачку....вот немогу реить,неполучается с условием пишет ошибку Вычеслить значение е (в...

Вычисление функции через разложение в ряд
вычисление функции с помощью разложения в ряд помогите пожалуйста с написанием кода(( Выложите...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru