c++ - 当 x_0 = 1 时尝试计算 e^x

标签 c++ math taylor-series

我正在尝试计算 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/

相关文章:

c++ - 如何将 std::string 写入 UTF-8 文本文件

带偏移量的 C++ 冒泡排序?

proof - 代码应该简短/简洁吗?

Python:计算泰勒级数的误差

python - cosine x 的泰勒级数使用 python 在运行时给出逻辑错误

c++ - 在makefile中添加头文件和相关修改

c++ - 如何在 VS2017 中编译一个不带/Za 的文件(其余带/Za)?

arrays - 找到成本函数比率的最佳方法

algorithm - 查找给定范围之间的最大不同数字

python - 针对小任意浮点值的 arcsin 函数的最快可能方法