Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53

Вычислить значения функций заданных разложением в ряд Тейлора

29.12.2024, 02:06. Показов 6636. Ответов 88
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите составить код функции с факториалом и экспонентой программированием в С++, не используя готовые математические функции.
Составить функцию в C++,
вывести на экран таблицу значений этой функции для x, изменяющегося от а до b с шагом h = (b-a)/10, если а = 0,1, b= 1,0 и k = 120. Готовые математические функции не использовать. Для вычисления факториала и экспоненты составить отдельные функции:

N!= 1 * 2 * 3*…*N , ⅇ^x=1+x+x^2/2!+x^3/3!+x^4/4!+⋯+x^n/n!+⋯+

Название: Screenshot_4.png
Просмотров: 305

Размер: 2.4 Кб

У меня код такой. Но я не уверена в его правильности
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 <iomanip>
#include <cmath>
 
// Функция для вычисления факториала
double factorial(int n) {
    double result = 1.0; // Используем double для избежания переполнения
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}
 
// Функция для вычисления экспоненты
double exponential(double x, int terms) {
    double result = 1.0; // Начальное значение для e^x
    double term = 1.0;   // Текущий член ряда
    for (int n = 1; n <= terms; ++n) {
        term *= x / n;   // Вычисляем n-й член
        result += term;  // Добавляем к результату
    }
    return result;
}
 
// Функция для вычисления y(x, k)
double y(double x, int k) {
    double sum = 0.0;
    double e_neg_x = exponential(x, k); // e^(x)
    for (int n = 0; n <= k; ++n) {
        sum += (pow(2, n) * pow(e_neg_x, n)) / factorial(n);
    }
    return sum;
}
 
int main() {
    double a = 0.1;
    double b = 1.0;
    int k = 120;
    double h = (b - a) / 10;
 
    std::cout << std::fixed << std::setprecision(6);
    std::cout << "x\t\t y(x, " << k << ")\n";
    std::cout << "-------------------------\n";
 
    for (double x = a; x <= b; x += h) {
        std::cout << x << "\t " << y(x, k) << "\n";
    }
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2024, 02:06
Ответы с готовыми решениями:

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

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

Вычислить значения функции, заданной разложением в ряд Тейлора
Формулы и задачу надо ПЕРЕПИСЫВАТЬ! Редактор формул внизу страницы

88
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
01.01.2025, 21:48  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Это твой код из первого поста такой ответ выдает. Нужно только две ошибки исправить.
Такой результат выдал код:
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
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
// Функция для вычисления факториала
double factorial(int n) {
    double result = 1.0;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}
 
// Функция для вычисления e^x с использованием разложения в ряд Тейлора
double exp_taylor(double x, int n_terms = 100) {
    double result = 1.0;  // Начинаем с 1 (x^0/0! = 1)
    double term = 1.0;     // Изначально x^0 = 1
 
    for (int n = 1; n <= n_terms; ++n) {
        term *= x;            // x^n
        result += term / factorial(n); // Добавляем x^n / n!
    }
    return result;
}
 
// Основная функция y(x, k)
double y(double x, int k) {
    double sum_result = 0.0;
    double exp_x = exp_taylor(x);
 
    for (int n = 0; n <= k; ++n) {
        sum_result += pow(2, n) * pow(-exp_x, n) / factorial(n);
    }
    return sum_result;
}
 
void table(double a, double b, int k) {
    double h = (b - a) / 10.0;
    double x = a;
 
    cout << "    x     |    y(x, " << k << ")" << endl;
    cout << "----------|---------------------" << endl;
 
    cout << fixed << setprecision(10);
    while (x <= b) {
        cout << setw(8) << setprecision(2) << x << "  |  "
             << setw(20) << setprecision(10) << y(x, k) << endl;
        x += h;
    }
}
 
int main() {
    double a = 0.1;
    double b = 1.0;
    int k = 120;
 
    table(a, b, k);
 
    return 0;
}
Добавлено через 3 минуты
Я к вам за помощью, а вы ругаете!
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.01.2025, 21:51
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
к вам за помощью, а вы ругаете!
Мы просто пьяные.
Не обращай внимания...
0
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
01.01.2025, 21:55  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Ты ж здоровая девка, тебе работать надо... работать тебе надо... А ты ведёшь себя, как чёрт знает что.
Господин Verevkin! Не ругайтесь!
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.01.2025, 22:00
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Господин Verevkin! Не ругайтесь!
Ну, как ты себя ведёшь? Ну, посмотри на себя! Бланш у тебя под глазом. Как тебе не стыдно?
0
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
02.01.2025, 01:03  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Ну, как ты себя ведёшь? Ну, посмотри на себя! Бланш у тебя под глазом. Как тебе не стыдно?
Сегодня я так поняла программисты "отдыхают"....
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
02.01.2025, 01:19
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Сегодня я так поняла программисты "отдыхают"....
Маня!
Ну надо же! Наконец-то до тебя дошло, что программисты - тоже люди.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
02.01.2025, 10:03
Nelli Matveeva, как я понял, предполагается использование "собственных" функций на полную катушку.
Кстати, для вычисления exp через ряд нужно (по логике) использовать код для факториала.
Еще добавил вычисление целочисленной степени через функцию.
Результаты совпадают с ранее полученными.
И выходит, что не нужна длинная арифметика.

Код:
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
#include <iostream>
using namespace std;
 
long double fact (int n)
{
  long double res = 1;
  for (int i = 1; i <= n; i++)
    res *= i;
  return res;
}
 
long double my_pow (double num, int pw)
{
  long double res = 1;
  for (int i = 1; i <= pw; i++)
    res *= num;
  return res;
}
 
long double expo (double x, double eps = 1e-6)
{
  long double sum = 0, memb = 1;
  int n = 0;
  while (fabs(memb) >= eps)
  {
    sum += memb;
    n++;
    memb = my_pow(x, n) / fact(n);
  }
  return sum;
}
 
long double func_y (double x, int k = 120)
{
  long double sum = 0;
  for (int n = 0; n <= k; n++)
    sum += my_pow(2, n) * my_pow(-expo(x), n) / fact(n);
  return sum;
}
 
int main()
{
  double x, a = 0.1, b = 1, h = (b - a) / 10;
  cout << "x\ty\n";
  for (x = a; x <= b; x += h)
    cout << x << "\t" << func_y(x) << endl;
  system("pause");
  return 0;
}
Преподаватель-извращенец должен быть доволен.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
02.01.2025, 10:52
Цитата Сообщение от gunslinger Посмотреть сообщение
my_pow(2, n)
(1<<n)
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
02.01.2025, 11:08
Цитата Сообщение от gunslinger Посмотреть сообщение
long double res = 1;
В кои то веки факториал стал дробным.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,454
02.01.2025, 11:38
gunslinger, для этой задачи double достаточно, нет смысла использовать long double.

Добавлено через 6 минут
CoderHuligan, в С++ нет натуральных, целых, рациональных, вещественных, комплексных и т.д. чисел. А есть int, float, double и т.д. Соответственно, натуральное число ты можешь представить как угодно: в виде int, double, float и т.д. Более того, никто не помешает обобщать факториал до гамма-функции.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
02.01.2025, 15:05
повар1, как вариант (если это вдруг не считается у кого-то готовой мат. функцией).

CoderHuligan, дело не в дробности, а в том, влезет число или нет. В long long 120! не поместится.
long can define a long (32-bit) integer or a long (80-bit or extended) floating-point variable if used as a modifier for double.
long long is introduced by ISO C99 and defines a 64-bit integer.
Royal_X, сделал так на всякий случай (перестраховался). Хотя да, точности вполне хватает и без long.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
02.01.2025, 15:42
Цитата Сообщение от gunslinger Посмотреть сообщение
дело не в дробности, а в том, влезет число или нет. В long long 120! не поместится.
Ага. Как буд-то в double поместится. Double уже на !14 показывает неверный результат, а unsigned long long верный до !20. Как говорится почувствуйте разницу.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
02.01.2025, 16:15
CoderHuligan, 120! в double "помещается", но с потерей точности (а в uint64 просто никак не влезет).
Потому я и использовал long double, но long оказался излишним.
Но на итоговый результат это не влияет (почему - не знаю, это уже вопрос к знатокам).
Может играет роль порядок степеней или еще что - я хз.
В данной ситуации double вполне хватает. Других вариантов (если нужна "полная точность"), кроме длинной арифметики, не вижу.
Только если "нормальное вычисление" (пост №11), но этот (логичный) способ нельзя использовать.
Короче, какое задание, такое и решение (через одно место). Вопросы надо задавать автору задачи (и желательно с помощью "подручных средств").

P.S.: 37-ю строку кода из поста 67 можно заменить на
C++
37
    sum += my_pow(-2 * expo(x), n) / fact(n);
И тогда можно обойтись без (1 << n).
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,454
02.01.2025, 16:28
gunslinger, еще осталось заменить fabs в коде из поста 67, чтобы cmath не подключать. Ты, кстати, и не подключал этот заголовок, видимо, пишешь в билдере или где-то еще. Но язык С++ требует этот заголовок для fabs. Заменить данную функцию на велосипед не составит труда.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
02.01.2025, 16:58
Royal_X, кстати, да.
Пишу в билдере, там подключать не надо.
Но это уже "мелочи", пусть ТС что-то тоже сделает.
Хотя в условиях текущей задачи fabs можно вообще убрать (он в данном случае излишен / не требуется).

Итоговый код (еще функцию expo подкорректировал):
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
#include <iostream>
using namespace std;
 
double fact (int n)
{
  double res = 1;
  for (int i = 1; i <= n; i++)
    res *= i;
  return res;
}
 
double my_pow (double num, int pw)
{
  double res = 1;
  for (int i = 1; i <= pw; i++)
    res *= num;
  return res;
}
 
double expo (double x, double eps = 1e-6)
{
  double sum = 0, memb = 1;
  int n = 0;
  while (memb >= eps)
    sum += memb, memb = my_pow(x, ++n) / fact(n);
  return sum;
}
 
double func_y (double x, int k = 120)
{
  double sum = 0;
  for (int n = 0; n <= k; n++)
    sum += my_pow(-2 * expo(x), n) / fact(n);
  return sum;
}
 
int main()
{
  double x, a = 0.1, b = 1, h = (b - a) / 10;
  cout << "x\ty\n";
  for (x = a; x <= b; x += h)
    cout << x << "\t" << func_y(x) << endl;
  system("pause");
  return 0;
}
2
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
02.01.2025, 22:27  [ТС]
Цитата Сообщение от gunslinger Посмотреть сообщение
Royal_X, кстати, да.
Пишу в билдере, там подключать не надо.
Но это уже "мелочи", пусть ТС что-то тоже сделает.
Хотя в условиях текущей задачи fabs можно вообще убрать (он в данном случае излишен / не требуется).

Итоговый код (еще функцию expo подкорректировал):
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
#include <iostream>
using namespace std;
 
double fact (int n)
{
  double res = 1;
  for (int i = 1; i <= n; i++)
    res *= i;
  return res;
}
 
double my_pow (double num, int pw)
{
  double res = 1;
  for (int i = 1; i <= pw; i++)
    res *= num;
  return res;
}
 
double expo (double x, double eps = 1e-6)
{
  double sum = 0, memb = 1;
  int n = 0;
  while (memb >= eps)
    sum += memb, memb = my_pow(x, ++n) / fact(n);
  return sum;
}
 
double func_y (double x, int k = 120)
{
  double sum = 0;
  for (int n = 0; n <= k; n++)
    sum += my_pow(-2 * expo(x), n) / fact(n);
  return sum;
}
 
int main()
{
  double x, a = 0.1, b = 1, h = (b - a) / 10;
  cout << "x\ty\n";
  for (x = a; x <= b; x += h)
    cout << x << "\t" << func_y(x) << endl;
  system("pause");
  return 0;
}
Код решил задачу успешно, но при этом выдал ошибку:

sh: 1: pause: not found

Не подскажите, что это значит?
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
02.01.2025, 22:31
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Не подскажите, что это значит?
В линупсе нет команды pause.
0
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
02.01.2025, 22:38  [ТС]
Убрала строку 43, ошибка ушла.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
02.01.2025, 22:43
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Убрала строку 43, ошибка ушла.
иди сдавай.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
02.01.2025, 22:44
Nelli Matveeva, можно убрать эту строку (если она не нужна) либо заменить на getchar() или что там есть из команд, которые не дают закрыться консоли сразу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2025, 22:44

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

Вычислить значения функции заданной разложением в ряд Тейлора
Для каждого х, изменяющегося от а до b с шагом h, найти значения функции Y(x), суммы S(x) и Y(x)-S(x) и вывести в виде таблицы. Значения...

Вычисление функций разложением в ряд Тейлора
Формулы надо переписывать! Редактор внизу страницы

Вычисление функций разложением в ряд Тейлора
1. Напишите программу для вычисления значения функции, заданной с помощью ряда Тейлора, в точке Х с заданной точностью. 2. В дополнение...

Вычисление функций разложением в ряд Тейлора
. Написать функцию 1, которая для любого заданного Х вычисляет с заданной точностью e значение Y как сумму членов бесконечного ряда....


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru