C++ 当x_0=1时尝试计算e^x
我试图计算e^x在x_0=1时的泰勒级数展开式。我很难理解我到底在寻找什么。我很确定我在试图找到当e^x,当x_0=1时的十进制近似值。但是,当我在x_0=0时运行这段代码时,我得到了错误的输出。这让我相信我的计算是错误的 这是我的e级hppC++ 当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:
#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更准确地说,因为它是参数化的