【问题标题】:Taylor Series Expansions of Exponential Function指数函数的泰勒级数展开
【发布时间】:2017-06-14 01:24:30
【问题描述】:

我必须用 C 编写一个程序,计算 pow(a,x) 函数的扩展。我确定我的代码是错误的,有人可以帮助我吗?

扩展:

1 + x log(a) + 1/2 x^2 log^2(a) + 1/6 x^3 log^3(a) + 1/24 x^4 log^4(a) + 1/120 x^5 log^5(a) +...

不使用 pow 函数。下一个表达式必须根据前一个表达式计算。

这是我设法带来的:

double series(double x)
{
int i;
double s,w,x2;
s=x;
w=x;
    for(i=1;i<LWS;i++)
{
    w=(w*x/(i+1))*log10(x);
    s+=w;
}
return s;
}

我已经有了剩下的代码。

【问题讨论】:

  • 你忘了问问题

标签: c taylor-series


【解决方案1】:

log a 只需要计算一次。一个体面的编译器会为你做这件事,但以防万一。

现在每个学期都是 1/ i! * x^i *loga^i

1/i! term 增长很快,意味着在几次迭代中,除非 x 很大,否则误差可以忽略不计。

如果需要,您可以继续运行因子,如果 (i 阶乘) 乘以 i(确保它是双精度数,而不是整数),xp(x 幂)在每次交互时乘以 x 并且相同碰巧loga。

我实际上不记得扩展 pow 系列,所以我只是假设您的公式是正确的。看起来基本正确。我们使用自然对数(数学符号中的ln,C中的log)哪种与阶乘项相抵消,这与e^x有关。

【讨论】:

  • 先测试一下,打印出条款。对于 a 和 x 的合理值,它们会很快收敛到零吗?如果没有产生正确的答案,它是由什么引起的?你确保 i 阶乘是双倍的吗?在您的代码中,它将评估为 0,因为存储为整数。
【解决方案2】:

基本上,您所做的是:a^x = e^(x * ln(a)),然后使用泰勒级数展开式 e

您的代码中有一些错误:

  1. 由于您使用的是e 的扩展,因此您需要使用自然对数(以e 为底),而不是以10 为底的对数。
  2. 循环外s的初始值必须设置为1。这是因为a^x = 1 when x=0(如果a != 0)。
  3. 在循环之外,w 必须设置为 1。这是为了拥有一组很好的x * ln(a) 权力。早先使用w=xx 的幂将比ln(a) 的幂多一。
  4. i 必须从 i=0 开始循环。这是为了在进行上述更改后立即获得阶乘。

所以代码变成了:

double series(double x)
{
    int i;
    double s,w,x2;
    s=1.0;
    w=1.0;
    for(i=0;i<LWS;i++)
    {
        w=(w*x/(i+1))*log(x);
        s+=w;
    }
    return s;
}

【讨论】:

  • 但问题是,公式的起始值必须是1。
  • @adrian1337 很高兴听到这个消息。如果您认为此处或网站上其他地方的任何答案对您有所帮助,请不要忘记投票。还要确保接受答案。
猜你喜欢
  • 2013-10-09
  • 2014-04-03
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2017-04-02
相关资源
最近更新 更多