【问题标题】:Alternative way to do Taylor series in C在 C 中做泰勒级数的另一种方法
【发布时间】:2017-06-29 02:08:58
【问题描述】:

在我的课堂上,我的教授希望我们使用函数来求解 sinX、cosX 和 expX 的泰勒级数。

我解决它的速度相对较快,但是当我上交它时,他说他希望我先使用除法而不是乘法,基本上结合了我的 powerfact 函数。我不知道他为什么要这样做,因为我得到了正确的答案,但在我这样做之前他不会接受任务。

我尝试了几次来弄清楚这个解决方案,但我不是 Comp Sci 专业的,而且已经 6 年多没有学过数学了,所以它在我的大脑中转动齿轮非常困难。任何帮助将不胜感激。

double power(double x, int n)
{
    int     i = 0;
    double  prod = 1.;

    for ( ; i++ < n; )
        prod = prod * x;

    return prod;
}

double fact (int n)
{
    int     i;
    double prod = 1.;

    for (i = 1; i <= n; i++)
        prod = prod * i;

    return prod;
}

double mySin(double x)
{
    int     i, sign;
    double  sum = 0;

    for (i = 0, sign = 1; i < 21; i++, sign = -sign)
        sum = sum + sign * power(x, 2 * i + 1)/ fact(2 * i + 1);
    return sum;
}

double myCos(double x)
{
    int     i, sign;
    double  sum = 0;

    for(i = 0, sign = 1; i < 21; i++, sign = -sign)
        sum = sum + sign *power(x,2 * i)/ fact(2 * i);
    return sum;
}

double myExp(double x)
{
    int     i, sign;
    double  sum = 0;

    for(i = 0, sign = 1; i < 21; i++, sign = sign)
        sum = sum + sign * power(x, i)/ fact(i);
    return sum;
 }

【问题讨论】:

  • 嗯...除法周围的括号?
  • “我不知道他为什么要这样做” - 你问了吗?
  • 一定要喜欢“6 年没学过数学了,所以我大脑里的齿轮转动得很厉害”,因为我已经 6*6 年没有学过数学了,但齿轮看起来还不错。
  • @chux Gears 需要定期维护。
  • 您可以通过计算一次指数来优化这一点,而不是在powerfract 调用中。比如mySinint exp = 2 * i + 1;sum = sum + sign * (power(x, exp) / fact(exp));

标签: c taylor-series


【解决方案1】:

幂函数和阶乘函数的使用效率低下。对于每个术语,您每次都在计算同一组产品。您还在构建可能导致精度损失的大量数字。

看看每个系列的定义(这里^表示幂,!表示阶乘):

e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...
sin(x) = x - x^3/3! + x^5/5! - + x^7/7! + ...
cos(x) = 1 - x^2/2! + x^4/4! - + x^6/6! + ...

对于e^x,每个术语是x/n 乘以最后一个,其中n 是术语编号。同样,对于sin(x)cos(x),每个术语是- x^2/((2n-1)*2n) 乘以最后一个。使用它而不是幂函数和阶乘函数来计算每个连续项。

还有一个很好的技巧,它涉及到一个数学上没有意义的比较,但由于浮点数的精度有限,无法知道何时停止计算项。看看你能不能弄明白。

【讨论】:

  • 这种方法可能会导致数值问题:将非常小的数字添加到可能很大的数字中会很早就失去精度。最好“由内而外”进行计算,也就是 en.wikipedia.org/wiki/Horner%27s_method
  • @user58697 这是我提到的技巧的一部分。每个连续的术语都会变小,直到添加该术语不会导致任何变化。那是你停下来的时候。
  • 我想你没抓住我的意思。由于规范化时的浮点下溢,大数和 非常 小数的总和不准确。您应该先从小数开始求和,即从右到左。 Horner 方法避免处理非常小的数字。
  • @user58697 但是使用这种方法,没有大数字,因为不需要幂和阶乘计算。
  • @user58697 ...虽然我明白你的意思。也许这些术语可以存储在一个数组中,然后从右到左求和。
猜你喜欢
  • 2011-11-04
  • 2012-02-07
  • 2014-02-23
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2013-01-10
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多