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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
11.06.2013, 22:39     Переделать код в рядах Тейлора #1
есть код для этого задания:
Провести программную реализацию расчета приблизительного значения функции 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++ Разложение в ряд Тейлора(код есть, но ошибочный)
Код написан в Dev C. Не работает в Visual. Как нужно переделать код? C++
Переделать код с С на С++ C++
C++ Ошибка в рядах Тейлора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 16:16  [ТС]     Переделать код в рядах Тейлора #21
Цитата Сообщение от MrGluck Посмотреть сообщение
ну я прям даже не знаю
все вежливые)

так что скажете по поводу разницы в ответах?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 16:21     Переделать код в рядах Тейлора #22
Цитата Сообщение от MikeEl Посмотреть сообщение
так что скажете по поводу разницы в ответах?
я до конца не понял, какой разности?
Вы уверены, что eps должна быть равна 1?
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 16:27  [ТС]     Переделать код в рядах Тейлора #23
Цитата Сообщение от MrGluck Посмотреть сообщение
я до конца не понял, какой разности?
Вы уверены, что eps должна быть равна 1?
я е взял случайное

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
я до конца не понял, какой разности?
Вы уверены, что eps должна быть равна 1?
а что означают значение во втором столбике в Вашем варианте?

Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
я до конца не понял, какой разности?
Вы уверены, что eps должна быть равна 1?
еще я заметил ,чтоо оно шаг как-то не просчитывает. тоесть оно берет Х = 0,1 Х=0,1 Х=0,1 потом Х=0,2 Х=0,2 Х=0,2
а должно: Х=0,1 Х=0,12 Х=0,14 Х=0,16 Х=0,18 Х=0,2
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 16:34     Переделать код в рядах Тейлора #24
MikeEl, во втором столбике это значения, посчитанные непосредственно библиотечной функцией

Добавлено через 34 секунды
MikeEl, да, оно видимо не до конца точность правильно определяет в setprecision

Добавлено через 6 минут
C++
1
<< std::setprecision(log10(1/step) + 1) << x << ") = "
И все.
С логарифмом не до конца значения совпадают - погрешность вычисления. Была бы ошибка - не совпадало бы везде и значения уходили бы в невесть куда.
MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 16:41  [ТС]     Переделать код в рядах Тейлора #25
Цитата Сообщение от MrGluck Посмотреть сообщение
MikeEl, во втором столбике это значения, посчитанные непосредственно библиотечной функцией

Добавлено через 34 секунды
MikeEl, да, оно видимо не до конца точность правильно определяет в setprecision

Добавлено через 6 минут
C++
1
<< std::setprecision(log10(1/step) + 1) << 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
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <iomanip>
#include <cmath>
 
// sum - результат
// nom - числитель последнего члена последовательности
// n - текущий номер последовательности
// x - собственно аргумент функции sin^3(x)
// eps - точность
double calc(double sum, double nom, const int n, const double x, const double eps)
{
    nom *= (1-x);
    sum += nom / n;
    if (fabs(nom/n) >= eps)
        return calc(sum, nom, n+1, x, eps);
    else
        return sum;
}
 
// функция для принятия аргументов и передачи их рекурсивной функции с заданными
// числовыми значениями для начальных вспомогательных параметров
double f(const double x, const double eps)
{
    return calc(0, -1, 1, x, eps);
}
 
int main()
{
    double step, min, max, eps;
    std::cout << "Enter Xbegin: ";
    std::cin >> min;
    do
    {
        std::cout << "Enter Xend: ";
        std::cin >> max;
    } while (max < min);
    do
    {
        std::cout << "Enter Xdelta: ";
        std::cin >> step;
    } while (step <= 0);
    do
    {
        std::cout << "Enter eps: ";
        std::cin >> eps;
    } while (eps < 0 || eps > 1);
 
    for (double x = min; x <= max; x += step)
    {
        std::cout << "ln(" << std::fixed
            << std::setprecision(log10(1/step) + 1) << x << ") = "
            
            << f(x, eps) << std::endl;
    }
system("pause");
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 16:44     Переделать код в рядах Тейлора #26
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
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
 
// sum - результат
// nom - числитель последнего члена последовательности
// n - текущий номер последовательности
// x - собственно аргумент функции sin^3(x)
// eps - точность
double calc(double sum, double nom, const int n, const double x, const double eps)
{
    nom *= (1-x);
    sum += nom / n;
    if (fabs(nom/n) >= eps)
        return calc(sum, nom, n+1, x, eps);
    else
        return sum;
}
 
// функция для принятия аргументов и передачи их рекурсивной функции с заданными
// числовыми значениями для начальных вспомогательных параметров
double f(const double x, const double eps)
{
    return calc(0, -1, 1, x, eps);
}
 
int main()
{
    double step, min, max, eps;
    std::cout << "Enter Xbegin: ";
    std::cin >> min;
    do
    {
        std::cout << "Enter Xend: ";
        std::cin >> max;
    } while (max < min);
    do
    {
        std::cout << "Enter Xdelta: ";
        std::cin >> step;
    } while (step <= 0);
    do
    {
        std::cout << "Enter eps: ";
        std::cin >> eps;
    } while (eps < 0 || eps > 1);
 
    for (double x = min; x <= max; x += step)
    {
        std::cout << "ln(" << std::fixed
            << std::setprecision(log10(1/step) + 1) << x << ") = "
            << std::setprecision(log10(1/eps) + 1) << log(x) << " == "
            << f(x, eps) << std::endl;
    }
 
    system("pause");
}
хоть и не нравится мне эта погрешность...
-=ЮрА=-
12.06.2013, 16:49
  #27

Не по теме:

MrGluck, а ты уверен что рекуррентное соотношение это рекурсия?
В коде сейчас ужас (сори но пишу я правду)

MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 16:49  [ТС]     Переделать код в рядах Тейлора #28
Цитата Сообщение от MrGluck Посмотреть сообщение
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
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
 
// sum - результат
// nom - числитель последнего члена последовательности
// n - текущий номер последовательности
// x - собственно аргумент функции sin^3(x)
// eps - точность
double calc(double sum, double nom, const int n, const double x, const double eps)
{
    nom *= (1-x);
    sum += nom / n;
    if (fabs(nom/n) >= eps)
        return calc(sum, nom, n+1, x, eps);
    else
        return sum;
}
 
// функция для принятия аргументов и передачи их рекурсивной функции с заданными
// числовыми значениями для начальных вспомогательных параметров
double f(const double x, const double eps)
{
    return calc(0, -1, 1, x, eps);
}
 
int main()
{
    double step, min, max, eps;
    std::cout << "Enter Xbegin: ";
    std::cin >> min;
    do
    {
        std::cout << "Enter Xend: ";
        std::cin >> max;
    } while (max < min);
    do
    {
        std::cout << "Enter Xdelta: ";
        std::cin >> step;
    } while (step <= 0);
    do
    {
        std::cout << "Enter eps: ";
        std::cin >> eps;
    } while (eps < 0 || eps > 1);
 
    for (double x = min; x <= max; x += step)
    {
        std::cout << "ln(" << std::fixed
            << std::setprecision(log10(1/step) + 1) << x << ") = "
            << std::setprecision(log10(1/eps) + 1) << log(x) << " == "
            << f(x, eps) << std::endl;
    }
 
    system("pause");
}
хоть и не нравится мне эта погрешность...
у Волкодава она вообще другая)
-=ЮрА=-
12.06.2013, 16:54
  #29

Не по теме:

Цитата Сообщение от MikeEl Посмотреть сообщение
у Волкодава она вообще другая)
- потому что во всех кодах кроме поста 2 величайшая глупость потому и другая...

MikeEl
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 17:00  [ТС]     Переделать код в рядах Тейлора #30
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- потому что во всех кодах кроме поста 2 величайшая глупость потому и другая...

а что там не так?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 17:03     Переделать код в рядах Тейлора #31
Знаю, там где синус кубический вычисляется я даже так и написал, что сначала сделал через рекуррентное соотношение, а потом потер. С логарифмом я лишь упростил задачу, фактически там используется лишь числитель прошлого элемента последовательности. Ну слава Богу, сейчас пришел Юра и всех спас.

Пролей свет на нас, невежд)
-=ЮрА=-
Заблокирован
Автор FAQ
12.06.2013, 17:06     Переделать код в рядах Тейлора #32
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
#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 = 0, x = 0;
    while( 1 )//ÄåëГ*Гѕ ГЎГҐГ±ГЄГ®Г*ГҐГ·Г*ûé ââîä
        //äëÿ Г§Г*âåðøåГ*ГЁГї Г°Г*áîòû ïðîñòî Г§Г*êðûâГ*ГҐГ¬ îêГ*Г® ГЄГ®Г*ñîëè
    {
        printf("Enter x : ");scanf("%lf",&x);
        printf("Enter e : ");scanf("%lf",&e);
        printf("S(x) = %lf\n",S(x,e));
    }
    return 0;
}
Миниатюры
Переделать код в рядах Тейлора  
-=ЮрА=-
12.06.2013, 17:08
  #33

Не по теме:

MikeEl, чтобы в дальнейшем не было проблем с рядами прошу сюда
http://www.cyberforum.ru/faq/thread4...ml#post2449607
кроме рядов там расписывал ещё много очень нужного для математических апликаций на С/С++
На твой вопрос что не правильно отвечу -сама логика кодов построена не на рекуррентных выражениях.

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 17:09     Переделать код в рядах Тейлора #34
-=ЮрА=-,
Цитата Сообщение от MikeEl Посмотреть сообщение
определяющая условие завершения рекурсивного расчета
ты присаживайся к нам, неведующим и невнимательным
-=ЮрА=-
Заблокирован
Автор FAQ
12.06.2013, 17:11     Переделать код в рядах Тейлора #35
Итератор (рекуррентное соотношение) для логорифма натурального
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = {(-1)}^{n - 1}*\frac{{(x - 1)}^{n}}{n}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = {(-1)}^{n}*\frac{{(x - 1)}^{n + 1}}{n + 1}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n + 1}}{{a}_{n}} = \frac{{(-1)}^{n}*\frac{{(x - 1)}^{n + 1}}{n + 1}}{{(-1)}^{n - 1}*\frac{{(x - 1)}^{n}}{n}} = (-1)*(x - 1)*\frac{n}{n + 1}
Последнее выражение и использовано
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 17:15     Переделать код в рядах Тейлора #36
-=ЮрА=-, я не про то, я про
Цитата Сообщение от MrGluck Посмотреть сообщение
рекурсивного расчета
-=ЮрА=-
Заблокирован
Автор FAQ
12.06.2013, 17:20     Переделать код в рядах Тейлора #37
Добавлено через 4 минуты
Цитата Сообщение от MikeEl Посмотреть сообщение
- потому что во всех кодах кроме поста 2 величайшая глупость потому и другая...
а что там не так?
- цитирую тебе же тебя, верней твоё задание

Цитата Сообщение от MikeEl Посмотреть сообщение
вывести и применить рекуррентное отношение для расчета общей части для каждого слагаемого ряда или его части.
- рекурсией тут и не пахнет абсолютно.

Цитата Сообщение от MikeEl Посмотреть сообщение
double f (double x, double n)
{
return ((pow(-1.0,n++)*pow ((x-1.0), n) /n);
}
double fun (double e, double x, double n)
{
if (fabs((f(x,n)) - (f(x,n+1))) < e)
return 0;
else
return f(x,n) + fun (e, x, n+1);
}
- это ерунда (без обид для автора)

Цитата Сообщение от MikeEl Посмотреть сообщение
double calc(double sum, double nom, const int n, const double x, const double eps)
{
* * nom *= (1-x);
* * sum += nom / n;
* * if (fabs(nom/n) >= eps)
* * * * return calc(sum, nom, n+1, x, eps);
* * else
* * * * return sum;
}
- опять же рекурсия а не рекуррентное соотношение

рекуррентное соотношение и его вывод выше
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Итератор (рекуррентное соотношение) для логорифма натурального
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = {(-1)}^{n - 1}*\frac{{(x - 1)}^{n}}{n}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = {(-1)}^{n}*\frac{{(x - 1)}^{n + 1}}{n + 1}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n + 1}}{{a}_{n}} = \frac{{(-1)}^{n}*\frac{{(x - 1)}^{n + 1}}{n + 1}}{{(-1)}^{n - 1}*\frac{{(x - 1)}^{n}}{n}} = (-1)*(x - 1)*\frac{n}{n + 1}
Последнее выражение и использовано

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
ты присаживайся к нам, неведующим и невнимательным
Пивка хлебну и убегаю заказчики снова пришли по мою душу с просьбами а можно ещё то а можно ещё это а можно и пз заказать, уффф

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 17:46     Переделать код в рядах Тейлора #38
-=ЮрА=-, там требуется и рекурсия и рекуррентное отношение по ТЗ.

Не по теме:

Хех, а я только только заказ сдал, вот опять сюда вернулся)

-=ЮрА=-
12.06.2013, 17:51
  #39

Не по теме:

MrGluck, нет не требуется, это формулировка

Цитата Сообщение от MikeEl Посмотреть сообщение
завершения рекурсивного расчета
- для условия окончания процесса с рекуррентным соотношением, даже можно трактовать как очепятку либо недосмотрение. В любом случае ТС на днях сам увидит что скажет препод на его рекурсию вместо рекуррентного расчёта.

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

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

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
12.06.2013, 17:53     Переделать код в рядах Тейлора #40
У меня лишь сокращено, вместо прошлого элемента передается лишь его числитель. Наверное, это уже не рекуррентное соотношение, хоть и сделать его уже легко. Я кстати точно также на бумажке у себя записывал, прежде чем решить.
Вот с синусом лучше бы помог кубическим, там на самом деле с рекуррентными соотношениями не совсем приятно получается. -1 * x^2 * (3^(2n+1) - 3) / (3^(2n-1) - 3) / ((2n+1)! / (2n-1)!)
Жесть вышла, сейчас попробую в редакторе формул набрать

Добавлено через 41 секунду
-=ЮрА=-, по моему, там должно быть и то и то, т.е. рекурсивно считать пока точность не стала больше, чем eps
Yandex
Объявления
12.06.2013, 17:53     Переделать код в рядах Тейлора
Ответ Создать тему
Опции темы

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