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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
#1

Переделать код в рядах Тейлора - C++

11.06.2013, 22:39. Просмотров 1587. Ответов 56
Метки нет (Все метки)

есть код для этого задания:
Провести программную реализацию расчета приблизительного значения функции y, разложив функцию f (x) в ряд Тейлора, при этом необходимо вывести и применить рекуррентное отношение для расчета общей части для каждого слагаемого ряда или его части. Аргумент функции должен изменяться в диапазоне [Xbegin, Xend] с шагом Xdelta. Параметры Xbegin, Xend, Xdelta и точность (допустимая погрешность) расчетов е, определяющая условие завершения рекурсивного расчета задаются пользователем с клавиатуры. Предусмотреть ситуации, когда значение функции могу быть не определено для заданных аргументов.
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
#include <iostream>  
#include <conio.h> 
#include <math.h>
 
using namespace std;
 
double factorial (double p)
{
int n=1;
p=2*n+1;
if (p == 0) 
return 1; 
else 
return p*factorial(p - 1);
}
long double sin_kub(double p, double x, double e, long double y)
{
double fact=factorial(p);
y=((pow(3, p)-3)*pow(x, p)*pow(-1, p-1)/fact);
if (y>e)
return y=(y+sin_kub(p+1, x, e, y))*0.25;
else return y*0.25;
}
void main()
{
setlocale (0,"Russian");
double xbegin, xdelta, xend, e, x;
cout<<"Введите xbegin (начальное значение): ";
cin>>xbegin;
cout<<"Введите xend(конечное значение х): ";
cin>>xend;
while (xend<xbegin)
{
cout<<"Не корректно задано."<<endl;
cout<<"Введите xbegin (начальное значение): ";
cin>>xbegin;
cout<<"Введите xend(конечное значение х): ";
cin>>xend;
}
cout<<"Введите xdelta(шаг): ";
cin>>xdelta;
cout<<"Введите e(точность): ";
cin>>e;
while (e<0.01)
{
cout<<"Ваше \"е\" слишком маленькое. Введите другое: ";
cin>>e;
}
for (double x=xbegin; x<=xend; x+=xdelta)
{
long double f=sin_kub(3, x, e,0);
cout<<"x="<<x<<"      "<<"f(x)="<<f<<endl;
}
 
getch ();
}
но мне оченьочень нужно , чтобы считало эту формулу(второй снимок).
на днях сдавать, а сделать еще кучу работы нужно, помогите, пожалуйста.
Миниатюры
Переделать код в рядах Тейлора   Переделать код в рядах Тейлора  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 22:39     Переделать код в рядах Тейлора
Посмотрите здесь:

C++ Переделать Код!
C++ Разложение в ряд Тейлора(код есть, но ошибочный)
C++ переделать код!
C++ Переделать код с С на С++
C++ Переделать код!
C++ Ошибка в рядах Тейлора
C++ Переделать код
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
12.06.2013, 17:58     Переделать код в рядах Тейлора
  #41

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Вот с синусом лучше бы помог кубическим, там на самом деле с рекуррентными соотношениями не совсем приятно получается. -1 * x^2 * (3^(2n+1) - 3) / (3^(2n-1) - 3) / ((2n+1)! / (2n-1)!)
- автор полностью игнорит мои посты не вижу смысла в помощи, я помогаю когда есть фидбэк от автора + пример вывода итератора есть - поделил оно на другое и пошёл пить пиво.

Цитата Сообщение от MrGluck Посмотреть сообщение
по моему, там должно быть и то и то,
- настойчиво скажу нет,
втой логике задание что есть нет.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 18:00     Переделать код в рядах Тейлора #42
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n+1}}{{a}_{n}} = \frac{-1 * {x}^{2} * ({3}^{2n + 1} - 3)}{({3}^{2n - 1} - 3) * 2n * (2n+1)}
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 18:06  [ТС]     Переделать код в рядах Тейлора #43
Цитата Сообщение от MrGluck Посмотреть сообщение
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n+1}}{{a}_{n}} = \frac{-1 * {x}^{2} * ({3}^{2n + 1} - 3)}{({3}^{2n - 1} - 3) * 2n * (2n+1)}
столько всего было сказанно, но что из этого всего для меня подойдет?
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 18:08     Переделать код в рядах Тейлора #44
MikeEl, если я не ошибся в расчетах, то это рекуррентная формула для расчета кубического синуса. Я решал просто с рекурсией, но без соотношения (выражение следующего ряда последовательности через предыдущий)
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 18:17  [ТС]     Переделать код в рядах Тейлора #45
Цитата Сообщение от MrGluck Посмотреть сообщение
MikeEl, если я не ошибся в расчетах, то это рекуррентная формула для расчета кубического синуса. Я решал просто с рекурсией, но без соотношения (выражение следующего ряда последовательности через предыдущий)
я вот совместилу Ваш код и код Юрия. естественно чтоб все работало. и все считает. так правильно будет? :
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 <math.h>
#include <conio.h>
#include <iomanip>
 #include <stdio.h>
using namespace std;
 
double S(double x, double e)
{
    double   k = 1;
    double sum = 0;
    double ak  = x - 1;//рассчитываем лишь самый первый слен разложения
    while(e < fabs(ak))//Вот оно условие окончания итерационного процесса
    {
        sum += ak;
        //вот рекуррентная формула для ln
        ak  *=((-1)*(x - 1)*k/(k + 1));
        k   =  k + 1;
    }
    return sum;
}
 
int main()
{
    {double xstart, xend, xdelta, e;
cout << "Начало (xstart):";
cin >> xstart;
cout << "Конец (xend): ";
cin >> xend;
cout << "Шаг(xdelta): ";
cin >> xdelta;
cout << "Точность(e, eps): ";
cin >> e;
if (xstart<=0)
{cout<<"Error!"<<endl;
return 0;
}
for(double x=xstart;x <= xend; x+=xdelta) 
{
if (x<=0)
continue;
else
cout << "f(" << x << ")="  << setw (9) << log(x) << endl;
}
system("pause");
return 0;
}
 
    
}
Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- автор полностью игнорит мои посты не вижу смысла в помощи, я помогаю когда есть фидбэк от автора + пример вывода итератора есть - поделил оно на другое и пошёл пить пиво.

- настойчиво скажу нет,
втой логике задание что есть нет.

я не игнорю, я проверяю все и анализирую. огромное спасибо за Ваше содействие.
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 19:04     Переделать код в рядах Тейлора #46
MikeEl, вообщем то так тогда уж
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
#include <iostream>
#include <cmath>
#include <iomanip>
#include <cstdlib>
#include <clocale>
 
using namespace std;
 
double S(double x, double e)
{
    double   k = 1;
    double sum = 0;
    double ak  = x - 1;//рассчитываем лишь самый первый слен разложения
    while(e < fabs(ak))//Вот оно условие окончания итерационного процесса
    {
        sum += ak;
        //вот рекуррентная формула для ln
        ak  *=((-1)*(x - 1)*k/(k + 1));
        k   =  k + 1;
    }
    return sum;
}
 
int main()
{
    setlocale(LC_ALL, "");
    double xstart, xend, xdelta, e;
    cout << "Начало (xstart):";
    cin >> xstart;
    cout << "Конец (xend): ";
    cin >> xend;
    cout << "Шаг(xdelta): ";
    cin >> xdelta;
    cout << "Точность(e, eps): ";
    cin >> e;
    if (xstart <= 0)
    {
        cout << "Error!" << endl;
    return 0;
    }
    for(double x = xstart; x <= xend; x += xdelta)
    {
        if (x <= 0)
            continue;
        else
            cout << "f(" << x << ")="  << setw (9) << log(x) << " == " << S(x, e) << endl;
    }
 
    system("pause");
    return 0;
}
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 19:23  [ТС]     Переделать код в рядах Тейлора #47
Цитата Сообщение от MrGluck Посмотреть сообщение
MikeEl, вообщем то так тогда уж
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
#include <iostream>
#include <cmath>
#include <iomanip>
#include <cstdlib>
#include <clocale>
 
using namespace std;
 
double S(double x, double e)
{
    double   k = 1;
    double sum = 0;
    double ak  = x - 1;//рассчитываем лишь самый первый слен разложения
    while(e < fabs(ak))//Вот оно условие окончания итерационного процесса
    {
        sum += ak;
        //вот рекуррентная формула для ln
        ak  *=((-1)*(x - 1)*k/(k + 1));
        k   =  k + 1;
    }
    return sum;
}
 
int main()
{
    setlocale(LC_ALL, "");
    double xstart, xend, xdelta, e;
    cout << "Начало (xstart):";
    cin >> xstart;
    cout << "Конец (xend): ";
    cin >> xend;
    cout << "Шаг(xdelta): ";
    cin >> xdelta;
    cout << "Точность(e, eps): ";
    cin >> e;
    if (xstart <= 0)
    {
        cout << "Error!" << endl;
    return 0;
    }
    for(double x = xstart; x <= xend; x += xdelta)
    {
        if (x <= 0)
            continue;
        else
            cout << "f(" << x << ")="  << setw (9) << log(x) << " == " << S(x, e) << endl;
    }
 
    system("pause");
    return 0;
}
простите, еще раз. но второй столбик не должен быть равен первому или вообще, как он работает и для чего?
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 19:27     Переделать код в рядах Тейлора #48
MikeEl, сравниваются значения посчитанные библиотечной функцией и значения, посчитанные нами же (пользовательской функцией).

Добавлено через 16 секунд
Вам будет очень тяжело все объяснять, если вы так и не пройдете основ языка
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 19:28  [ТС]     Переделать код в рядах Тейлора #49
Цитата Сообщение от MrGluck Посмотреть сообщение
MikeEl, сравниваются значения посчитанные библиотечной функцией и значения, посчитанные нами же (пользовательской функцией).

Добавлено через 16 секунд
Вам будет очень тяжело все объяснять, если вы так и не пройдете основ языка
а каким образом?
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 19:29     Переделать код в рядах Тейлора #50
MikeEl, на глаз
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 19:31  [ТС]     Переделать код в рядах Тейлора #51
Цитата Сообщение от MrGluck Посмотреть сообщение
MikeEl, на глаз
это сравнение обязательное для этого задания, а то я что-то в условии такого не замечаю.?
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 20:11     Переделать код в рядах Тейлора #52
MikeEl, конечно нет, просто для того чтобы убедиться, что все корректно работает.

Вопросы пошли у вас...
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 20:21  [ТС]     Переделать код в рядах Тейлора #53
Цитата Сообщение от MrGluck Посмотреть сообщение
MikeEl, конечно нет, просто для того чтобы убедиться, что все корректно работает.

Вопросы пошли у вас...
действительно, очень сглупил, простите. благодарю за все.
а можете объясниь данный цикл:?
C++
1
2
3
4
5
 for(double x = xstart; x <= xend; x += xdelta)
    {
        if (x <= 0)
            continue;
        else
MrGluck
Ворчун
Эксперт CЭксперт С++
6395 / 3593 / 445
Регистрация: 29.11.2010
Сообщений: 9,512
12.06.2013, 20:35     Переделать код в рядах Тейлора #54
Изначально x равен xstart. Пока значение x меньше, либо равно xend, выполнять тело цикла. После выполнения тела увеличивать значение x на xdelta (шаг)

Цитата Сообщение от MikeEl Посмотреть сообщение
if (x <= 0)
* * * * * * continue;
означает, что если x меньше, либо равен 0, то пропускать текущую итерацию (сразу перейти к концу тела цикла).
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2013, 10:53     Переделать код в рядах Тейлора #55
MikeEl, вчера вечером я был занят делами, потому пишу лишь сегодня
- ниже вывод таблицы значений с проверкой
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 <math.h>
#include <stdio.h>
 
double S(double x, double e)
{
    double   k = 1;
    double sum = 0;
    double ak  = x - 1;//Г°Г*ññ÷èòûâГ*ГҐГ¬ ëèøü Г±Г*ìûé ïåðâûé ñëåГ* Г°Г*çëîæåГ*ГЁГї
    while(e < fabs(ak))//Âîò Г®Г*Г® óñëîâèå îêîГ*Г·Г*Г*ГЁГї ГЁГІГҐГ°Г*öèîГ*Г*îãî ïðîöåññГ*
    {
        sum += ak;
        //âîò ðåêóððåГ*ГІГ*Г*Гї ôîðìóëГ* äëÿ ln
        ak  *=((-1)*(x - 1)*k/(k + 1));
        k   =  k + 1;
    }
    return sum;
}
 
int main()
{
    double e, x, xn, xk, hx;
    while( 1 )//ÄåëГ*Гѕ ГЎГҐГ±ГЄГ®Г*ГҐГ·Г*ûé ââîä
        //äëÿ Г§Г*âåðøåГ*ГЁГї Г°Г*áîòû ïðîñòî Г§Г*êðûâГ*ГҐГ¬ îêГ*Г® ГЄГ®Г*ñîëè
    {
        printf("Enter xn : ");scanf("%lf",&xn);
        printf("Enter xk : ");scanf("%lf",&xk);
        printf("Enter hx : ");scanf("%lf",&hx);
        printf("Enter e : ");scanf("%lf",&e);
        printf("-----------------------------\n");   
        printf("   x    |    S    |    y    |\n");
        printf("-----------------------------\n");  
        for(x = xn; x <= xk; x += hx)
            printf("%lf | %lf | %lf |\n", x, S(x,e), log(x));
        printf("-----------------------------\n");  
    }
    return 0;
}
Миниатюры
Переделать код в рядах Тейлора  
-=ЮрА=-
13.06.2013, 10:58
  #56

Не по теме:

Цитата Сообщение от MikeEl Посмотреть сообщение
столько всего было сказанно, но что из этого всего для меня подойдет?
- это неверный итератор

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 11:31     Переделать код в рядах Тейлора
Еще ссылки по теме:

C++ Переделать код из С в С++
Ряд Тейлора - исправить код C++
Переделать ряд Тейлора C++
C++ Переделать код С# в С++
Переделать код с C# на C++ C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2013, 11:31     Переделать код в рядах Тейлора #57
Внимание вот правильный итератор для синус х в кубе
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = {(-1)}^{n + 1}*\frac{{3}^{(2*n + 1)} - 3}{(2*n + 1)!}*{x}^{(2*n + 1)}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = {(-1)}^{n + 2}*\frac{{3}^{(2*n + 3)} - 3}{(2*n + 3)!}*{x}^{(2*n + 3)}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = \frac{{(-1)}^{n + 2}*\frac{{3}^{(2*n + 3)} - 3}{(2*n + 3)!}*{x}^{(2*n + 3)}}{{(-1)}^{n + 1}*\frac{{3}^{(2*n + 1)} - 3}{(2*n + 1)!}*{x}^{(2*n + 1)}} = \frac{(-1)*{x}^{2}}{(2*n + 2)*(2*n + 3)}*\frac{{3}^{(2*n + 3)} - 3}{{3}^{(2*n + 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
#include <math.h>
#include <stdio.h>
 
double S(double x, double e)
{
    double   k = 1;
    double sum = 0;
    double ak  = (pow(3, k + 2) - 3)*pow(x, 3.0)/6;//Г°Г*ññ÷èòûâГ*ГҐГ¬ ëèøü Г±Г*ìûé ïåðâûé ñëåГ* Г°Г*çëîæåГ*ГЁГї
    while(e < fabs(ak))//Âîò Г®Г*Г® óñëîâèå îêîГ*Г·Г*Г*ГЁГї ГЁГІГҐГ°Г*öèîГ*Г*îãî ïðîöåññГ*
    {
        sum += ak;
        //âîò ðåêóððåГ*ГІГ*Г*Гї ôîðìóëГ* äëÿ sin(x)^3
        ak  *=((-1)*pow(x, 2.0))/((2*k + 2)*(2*k + 3));
        ak  *=(pow(3, 2*k + 3) - 3)/(pow(3, 2*k + 1) - 3);
        k   =  k + 1;
    }
    return 0.25*sum;
}
 
int main()
{
    double e, x, xn, xk, hx;
    while( 1 )//ÄåëГ*Гѕ ГЎГҐГ±ГЄГ®Г*ГҐГ·Г*ûé ââîä
        //äëÿ Г§Г*âåðøåГ*ГЁГї Г°Г*áîòû ïðîñòî Г§Г*êðûâГ*ГҐГ¬ îêГ*Г® ГЄГ®Г*ñîëè
    {
        printf("Enter xn : ");scanf("%lf",&xn);
        printf("Enter xk : ");scanf("%lf",&xk);
        printf("Enter hx : ");scanf("%lf",&hx);
        printf("Enter e : ");scanf("%lf",&e);
        printf("-----------------------------\n");   
        printf("   x    |    S    |    y    |\n");
        printf("-----------------------------\n");  
        for(x = xn; x <= xk; x += hx)
            printf("%lf | %lf | %lf |\n", x, S(x,e), pow(sin(x), 3.0));
        printf("-----------------------------\n");  
    }
    return 0;
}

Не по теме:

PS:Хоть бери да пиши FAQ с кодами и формулами итераторов для копипаста

Миниатюры
Переделать код в рядах Тейлора  
Yandex
Объявления
13.06.2013, 11:31     Переделать код в рядах Тейлора
Ответ Создать тему
Опции темы

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