Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当x_0=1时尝试计算e^x_C++_Math_Taylor Series - Fatal编程技术网

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

C++ 当x_0=1时尝试计算e^x,c++,math,taylor-series,C++,Math,Taylor Series,我试图计算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:

我试图计算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;
}
In 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使用标准::exp:2.71828计算

当我更改为x_0=0时。 在x_0=0时计算的E:7.03102 E使用标准::exp:2.71828计算


我做错了什么?我的泰勒级数执行得不正确吗?我的逻辑有什么地方不正确吗

每次计算阶乘时,事实必须重置为1。它应该是局部变量而不是类变量

当fact是一个类变量,并且您让factorial将其更改为,比如6,这意味着当您第二次调用factorial时,它将具有值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;
}

是的,你的逻辑有点不正确

就像丹说的,每次计算阶乘时,都必须将事实重置为1。您甚至可以将其设置为阶乘函数的局部

在computeE的return语句中,将总和乘以e,这是不需要的。这个和已经是e^x的泰勒近似

e^x约为0的泰勒级数是和_i=0^i=无穷大x^i/i!,所以x_0在你的程序中应该是0

从技术上讲,当x_0=0时,您的计算机计算出正确的总和值,但这有点奇怪。泰勒级数从i=0开始,但循环从i=1开始。然而,泰勒级数的第一项是x^0/0!=1,然后将sum初始化为std::powe,x_0=std::powe,0=1,这样就可以从数学上计算出来

当x_0=1时,computeE函数还计算了sum的正确值。您将sum初始化为std::powe,1=e,然后for循环根本没有更改其值,因为x-x_0=0

但是,正如我所说的,在任何一种情况下,您都不需要在return语句中将它乘以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。

写更少的代码

不要使用阶乘

这里是Java。将其转换为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;
    }
}

我已经更改了它,所以事实是在int E::factorialint n的顶部,我仍然收到相同的输出7.38752。那么,你能解释一下,为什么在对输出没有影响的情况下,需要进行更改?我希望这个问题没有回答得很糟糕;内部阶乘函数体。否则,您将使用上一个事实值作为下一个函数的起始值call@MBo,我已经正式搬过来了。感谢您的澄清。请下行投票人解释一下他们的理由好吗?您的阶乘函数容易溢出。首先不要计算它:而是计算一个运行的除数。计算更稳定,速度更快。此外,为什么你要使用硬编码的e值,并用std::pow的幂来提高它,而不是使用?@Bathsheba,你能给我一个运行除数的例子吗?@AlgirdasPreidžius,当x_0等于1时,我试图近似e^x。我需要事先知道e,因为当x_0等于1时的泰勒级数展开式是:e^x_0*n=0到inf x-x_0^n/n!的和!。我提出了它,所以我已经有了第一个学期。谢谢你的回答。我想我这样开始的原因是因为我想在x_0=1时计算e^x,而不是x_0=0。将泰勒级数从n=0的和变成无穷大x^n/n!e乘以n=0的和到无穷大x-1^n/n!我想不出别的办法来做这件事。并对这张照片的格式表示歉意。我不确定SO是否支持数学表示法。如果你试图用泰勒级数计算e,大约1,那么正如你所说的,每个项都乘以e,所以你需要知道e的值。好的,这就是我要努力的地方。那么我不应该删除e吗?当我去掉e时,我得到的输出是2.71799,我相信我所要做的只是近似的e^x。当我设置x_0=0时,我得到了预期的输出2.71828。那么这仍然是错误的吗?@jcarcenter e^x0更准确地说,因为它是参数化的