我正在尝试在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;
}
输出:
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 :(得分:3)
“fact”必须重置为1。它应该是局部变量而不是类变量。
当“事实”是一个类可变,并且你让“阶乘”改变它,比如6,这意味着当你第二次调用“阶乘”时它将具有vaule 6。这只会变得更糟。删除你的“事实”声明并改为使用它:
>>> 334453647687345435634784453567231654765 ** 4.0
1.2512490121794596e+154
>>> 334453647687345435634784453567231654765 ** 4
125124901217945966595797084130108863452053981325370920366144
719991392270482919860036990488994139314813986665699000071678
41534843695972182197917378267300625
答案 1 :(得分:3)
是的,你的逻辑在某处不正确。
如Dan所说,每次计算阶乘时都必须将fact
重置为1。您甚至可以将其设置为factorial
函数的本地。
在computeE
的返回语句中,您将总和乘以e
,您不需要这样做。总和已经是e ^ x的泰勒近似值。
关于0
的e ^ x的泰勒系列是和_i = 0 ^ i =无穷大(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
,以便以数学方式解决。
(当您computeE
时,sum
函数还计算了x_0 = 1
的正确值。您已将sum
初始化为std :: pow (e,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
。
答案 2 :(得分:1)
少写代码。
不要使用阶乘。
这是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;
}
}