Попытка вычислить е ^ х, когда х_0 = 1

Я пытаюсь вычислить разложение в ряд Тейлора для e ^ x при x_0 = 1. Мне очень трудно понять, что же на самом деле я ищу. Я почти уверен, что пытаюсь найти десятичное приближение для случая, когда e ^ x, когда x_0 = 1. Однако когда я запускаю этот код, когда x_0 = 0, я получаю неправильный вывод. Что заставляет меня верить, что я вычисляю это неправильно.

Вот мой класс e.hpp

#ifndef E_HPP
#define E_HPP

class E
{
public:
int factorial(int n);
double computeE();

private:
int fact = 1;
int x_0 = 1;
int x = 1;
int N = 10;
double e = 2.718;
double sum = 0.0;

};

Вот мой e.cpp

#include "e.hpp"#include <cmath>
#include <iostream>

int E::factorial(int n)
{
if(n == 0) return 1;
for(int i = 1; i <= n; ++i)
{
fact = fact * i;
}

return fact;
}

double E::computeE()
{
sum = std::pow(e,x_0);

for(int i = 1; i < N; ++i)
{
sum += ((std::pow(x-x_0,i))/factorial(i));
}
return e * sum;
}

В main.cpp

#include "e.hpp"#include <iostream>
#include <cmath>

int main()
{
E a;
std::cout << "E calculated at x_0 = 1: " << a.computeE() << std::endl;
std::cout << "E Calculated with std::exp: " << std::exp(1) << std::endl;
}

Выход:
E calculated at x_0 = 1: 7.38752
E calculated with std::exp: 2.71828

Когда я изменяю на x_0 = 0.
E calculated at x_0 = 0: 7.03102
E calculated with std::exp: 2.71828

Что я делаю неправильно? Я неправильно внедряю серию Тейлора? Моя логика где-то неверна?

0

Решение

Да, ваша логика где-то неверна.

Как говорит Дэн, нужно сбросить fact 1 каждый раз, когда вы рассчитываете факториал. Вы можете даже сделать его локальным для factorial функция.

В ответном заявлении computeE вы умножаете сумму на e, что вам не нужно делать. Сумма уже является тейлоровским приближением е ^ х.

Ряд Тейлора для е ^ х о 0 сумма _i = 0 ^ i = бесконечность (x ^ i / i!), так x_0 действительно должно быть 0 в вашей программе.

Технически ваш computeE вычисляет правильное значение для sum когда у вас есть x_0 = 0, но это немного странно. Серия Тейлор начинается в i=0, но вы начинаете цикл с i=1, Тем не менее, первый член ряда Тейлора x^0 / 0! = 1 и вы инициализируете sum в std::pow(e, x_0) = std::pow(e, 0) = 1 так что получается математически.

(Ваш computeE функция также вычислил правильное значение для sum когда ты имел x_0 = 1, Вы инициализированы sum в std :: pow (e, 1) = e, и тогда цикл for вообще не изменил своего значения, потому что x — x_0 = 0.)

Однако, как я уже сказал, в любом случае вам не нужно умножать его на e в ответном заявлении.

Я бы поменял computeE код к этому:

double E::computeE()
{
sum = 0;
for(int i = 0; i < N; ++i)
{
sum += ((std::pow(x-x_0,i))/factorial(i));
cout << sum << endl;
}
return sum;
}

и установить x_0 = 0,

3

Другие решения

«Факт» должен быть сброшен в 1 каждый раз, когда вы вычисляете факториал. Это должна быть локальная переменная, а не переменная класса.

Когда «факт» является классом varable, и вы позволяете «факториалу» изменить его, скажем, на 6, это означает, что у него будет значение 6, когда вы вызовете «факториал» во второй раз. И это будет только хуже. Удалите декларацию «факт» и используйте вместо этого:

int E::factorial(int n)
{
int fact = 1;
if(n == 0) return 1;
for(int i = 1; i <= n; ++i)
{
fact = fact * i;
}

return fact;
}
3

Напишите меньше кода.

Не используйте факториал.

Вот это на Яве. У вас не должно быть проблем с преобразованием этого в C ++:

/**
* @link https://stackoverflow.com/questions/46148579/trying-to-compute-ex-when-x-0-1
* @link https://en.wikipedia.org/wiki/Taylor_series
*/
public class TaylorSeries {

private static final int DEFAULT_NUM_TERMS = 50;

public static void main(String[] args) {
int xmax = (args.length > 0) ? Integer.valueOf(args[0]) : 10;
for (int i = 0; i < xmax; ++i) {
System.out.println(String.format("x: %10.5f series exp(x): %10.5f function exp(x): %10.5f", (double)i, exp(i), Math.exp(i)));
}
}

public static double exp(double x) {
return exp(DEFAULT_NUM_TERMS, x);
}

// This is the Taylor series for exp that you want to port to C++
public static double exp(int n, double x) {
double value = 1.0;
double term = 1.0;
for (int i = 1; i <= n; ++i) {
term *= x/i;
value += term;
}
return value;
}
}
1
По вопросам рекламы [email protected]