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

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

29.12.2024, 02:06. Показов 6983. Ответов 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
Заблокирован
01.01.2025, 21:51
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
к вам за помощью, а вы ругаете!
Мы просто пьяные.
Не обращай внимания...
0
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
01.01.2025, 21:55  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Ты ж здоровая девка, тебе работать надо... работать тебе надо... А ты ведёшь себя, как чёрт знает что.
Господин Verevkin! Не ругайтесь!
0
Заблокирован
01.01.2025, 22:00
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Господин Verevkin! Не ругайтесь!
Ну, как ты себя ведёшь? Ну, посмотри на себя! Бланш у тебя под глазом. Как тебе не стыдно?
0
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
02.01.2025, 01:03  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Ну, как ты себя ведёшь? Ну, посмотри на себя! Бланш у тебя под глазом. Как тебе не стыдно?
Сегодня я так поняла программисты "отдыхают"....
0
Заблокирован
02.01.2025, 01:19
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Сегодня я так поняла программисты "отдыхают"....
Маня!
Ну надо же! Наконец-то до тебя дошло, что программисты - тоже люди.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
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
1754 / 1020 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
02.01.2025, 11:08
Цитата Сообщение от gunslinger Посмотреть сообщение
long double res = 1;
В кои то веки факториал стал дробным.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6702 / 3121 / 1064
Регистрация: 01.06.2021
Сообщений: 12,082
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,028
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
1754 / 1020 / 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,028
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
6702 / 3121 / 1064
Регистрация: 01.06.2021
Сообщений: 12,082
02.01.2025, 16:28
gunslinger, еще осталось заменить fabs в коде из поста 67, чтобы cmath не подключать. Ты, кстати, и не подключал этот заголовок, видимо, пишешь в билдере или где-то еще. Но язык С++ требует этот заголовок для fabs. Заменить данную функцию на велосипед не составит труда.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
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
Заблокирован
02.01.2025, 22:31
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Не подскажите, что это значит?
В линупсе нет команды pause.
0
1 / 1 / 0
Регистрация: 28.11.2024
Сообщений: 53
02.01.2025, 22:38  [ТС]
Убрала строку 43, ошибка ушла.
0
Заблокирован
02.01.2025, 22:43
Цитата Сообщение от Nelli Matveeva Посмотреть сообщение
Убрала строку 43, ошибка ушла.
иди сдавай.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
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
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru