我正在尝试计算 x_0 = 1 处 e^x 的泰勒级数展开。我很难理解它到底在寻找什么。我很确定我正在尝试找到当 x_0 = 1 时的 e^x 的小数近似值。但是,当我在 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;
}
输出:
在 x_0 = 1 处计算的 E:7.38752
E 用 std::exp 计算:2.71828
当我更改为 x_0 = 0 时。
在 x_0 = 0 处计算的 E:7.03102
E 用 std::exp 计算:2.71828
我做错了什么?我是否错误地实现了泰勒级数?我的逻辑在某处不正确吗?
最佳答案
是的,你的逻辑某处不正确。
正如 Dan 所说,每次计算阶乘时都必须将 fact
重置为 1。您甚至可以将其设为 factorial
函数的本地。
在 computeE
的返回语句中,您将总和乘以 e
,您不需要这样做。总和已经是 e^x 的泰勒近似。
关于 0
的 e^x 的泰勒级数是 sum _i=0 ^i=infinity (x^i/i!),所以 x_0
确实应该是 0在你的程序中。
从技术上讲,当 x_0=0 时,您的 computeE
会为 sum
计算正确的值,但这有点奇怪。泰勒级数从 i=0
开始,但您从 i=1
开始循环。但是,泰勒级数的第一项是 x^0/0! = 1
然后将 sum
初始化为 std::pow(e, x_0) = std::pow(e, 0) = 1
这样就可以了数学上。
(当您有 x_0 = 1
时,您的 computeE
函数也计算了 sum
的正确值。您将 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
。
关于c++ - 当 x_0 = 1 时尝试计算 e^x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148579/