Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
1

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

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

Author24 — интернет-сервис помощи студентам
есть код для этого задания:
Провести программную реализацию расчета приблизительного значения функции 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 ();
}
но мне оченьочень нужно , чтобы считало эту формулу(второй снимок).
на днях сдавать, а сделать еще кучу работы нужно, помогите, пожалуйста.
Миниатюры
Переделать код в рядах Тейлора   Переделать код в рядах Тейлора  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2013, 22:39
Ответы с готовыми решениями:

Ошибка в рядах Тейлора
Помогите найти ошибку в этом задании: адача состоит в проведении программной реализации расчета...

Переделать ряд Тейлора
Вычислить и вывести на экран в виде таблицы значение функции, заданной с помощью ряда Тейлора на...

Код написан в Dev C. Не работает в Visual. Как нужно переделать код?
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт...

Разложение ряд в ряд Тейлора.Переделать программу
Написать программу вычисления и вывода на экран в виде таблицы значений функции, заданной с помощью...

56
1 / 1 / 0
Регистрация: 27.03.2012
Сообщений: 52
12.06.2013, 16:16  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от MrGluck Посмотреть сообщение
ну я прям даже не знаю
все вежливые)

так что скажете по поводу разницы в ответах?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 16:21 22
Цитата Сообщение от MikeEl Посмотреть сообщение
так что скажете по поводу разницы в ответах?
я до конца не понял, какой разности?
Вы уверены, что eps должна быть равна 1?
0
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
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 16:34 24
MikeEl, во втором столбике это значения, посчитанные непосредственно библиотечной функцией

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

Добавлено через 6 минут
C++
1
<< std::setprecision(log10(1/step) + 1) << x << ") = "
И все.
С логарифмом не до конца значения совпадают - погрешность вычисления. Была бы ошибка - не совпадало бы везде и значения уходили бы в невесть куда.
0
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");
}
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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");
}
хоть и не нравится мне эта погрешность...
0
-=ЮрА=-
12.06.2013, 16:49
  #27

Не по теме:

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

0
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");
}
хоть и не нравится мне эта погрешность...
у Волкодава она вообще другая)
0
-=ЮрА=-
12.06.2013, 16:54
  #29

Не по теме:

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

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

Не по теме:

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

а что там не так?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 17:03 31
Знаю, там где синус кубический вычисляется я даже так и написал, что сначала сделал через рекуррентное соотношение, а потом потер. С логарифмом я лишь упростил задачу, фактически там используется лишь числитель прошлого элемента последовательности. Ну слава Богу, сейчас пришел Юра и всех спас.

Пролей свет на нас, невежд)
0
Заблокирован
Автор 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;
}
Миниатюры
Переделать код в рядах Тейлора  
2
-=ЮрА=-
12.06.2013, 17:08
  #33

Не по теме:

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

1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 17:09 34
-=ЮрА=-,
Цитата Сообщение от MikeEl Посмотреть сообщение
определяющая условие завершения рекурсивного расчета
ты присаживайся к нам, неведующим и невнимательным
0
Заблокирован
Автор FAQ
12.06.2013, 17:11 35
Итератор (рекуррентное соотношение) для логорифма натурального
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = {(-1)}^{n - 1}*\frac{{(x - 1)}^{n}}{n}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = {(-1)}^{n}*\frac{{(x - 1)}^{n + 1}}{n + 1}
https://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}
Последнее выражение и использовано
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 17:15 36
-=ЮрА=-, я не про то, я про
Цитата Сообщение от MrGluck Посмотреть сообщение
рекурсивного расчета
0
Заблокирован
Автор 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;
}
- опять же рекурсия а не рекуррентное соотношение

рекуррентное соотношение и его вывод выше
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Итератор (рекуррентное соотношение) для логорифма натурального
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = {(-1)}^{n - 1}*\frac{{(x - 1)}^{n}}{n}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} = {(-1)}^{n}*\frac{{(x - 1)}^{n + 1}}{n + 1}
https://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 Посмотреть сообщение
ты присаживайся к нам, неведующим и невнимательным
Пивка хлебну:beer2: и убегаю заказчики снова пришли по мою душу с просьбами а можно ещё то а можно ещё это а можно и пз заказать, уффф O_o

0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 17:46 38
-=ЮрА=-, там требуется и рекурсия и рекуррентное отношение по ТЗ.

Не по теме:

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

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

Не по теме:

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

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

0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.06.2013, 17:53 40
У меня лишь сокращено, вместо прошлого элемента передается лишь его числитель. Наверное, это уже не рекуррентное соотношение, хоть и сделать его уже легко. Я кстати точно также на бумажке у себя записывал, прежде чем решить.
Вот с синусом лучше бы помог кубическим, там на самом деле с рекуррентными соотношениями не совсем приятно получается. -1 * x^2 * (3^(2n+1) - 3) / (3^(2n-1) - 3) / ((2n+1)! / (2n-1)!)
Жесть вышла, сейчас попробую в редакторе формул набрать

Добавлено через 41 секунду
-=ЮрА=-, по моему, там должно быть и то и то, т.е. рекурсивно считать пока точность не стала больше, чем eps
0
12.06.2013, 17:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2013, 17:53
Помогаю со студенческими работами здесь

Ряд Тейлора - исправить код
Я написал программу, а она вроде дает результат но не правильный. Программа высчитывает значение...

Разложение в ряд Тейлора(код есть, но ошибочный)
Передо мной стоит такая задача: http://imagepost.ru/?v=238/uBbB7Cp.png Я написала программу....

Переделать код на код с рекурсией
Привет. Есть готовый код, нужно переделать его на код с рекурсией. Само задание для кода звучало...

Переделать код С++ в СИ
Помогите,пожалуйста, переделать код С++ в СИ #include &lt;conio.h&gt; #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru