【问题标题】:Taylor series for arcsin(x), incorrect output C languagearcsin(x) 的泰勒级数,输出 C 语言不正确
【发布时间】:2013-01-21 06:42:20
【问题描述】:

我编写了一个程序,它从用户那里获取一个值 x 和一个整数 n,然后程序使用 taylor serie for arcsin 打印 arcsin(x) http://tedmuller.us/Math/img/Taylor-arcsin.gif

但由于某种原因它不起作用。当我输入 x=1 时,我得到 1.19 而不是 pi/2 的输出。

这是我的代码:

#include <stdio.h>
#include <conio.h>
void main()
{
    int i,n;
    double x,sum,last;
    printf("Please enter the x you wish to calculate arcsin(x) for \n");
    scanf("%lf",&x);
    printf("Enter n\n");
    scanf("%d",&n);
    last=x;
    sum=last;
    for(i=1;i<=n;i++)
    {
        last*=((x*x)*(2*i-1))/((2*i)*(2*i+1));
        sum+=last;
    }
    printf("arcsin(%lf) = %lf",x,sum);
    getch();
}

基本思想是这样的:last 和 sum 都以 x 的值开始。然后我最后前进成为系列中的下一个数字,将其添加到总和,再次前进,添加到总和...冲洗并重复 n 次。

【问题讨论】:

  • 您为n 输入了什么值?该系列一般收敛的速度有多快?您是否随时打印出条款(last 值)?为什么不呢?
  • 我输入了相当大的 n 值,10。所以答案应该非常准确,即使我输入 100 的 n,答案也不会相差太大。
  • 打印 last 的值并没有真正意义,因为 last 在任何给定点的值只是答案的一部分,而不是答案本身
  • 为什么?我该如何解决?
  • @OriaGruber:你的扩展也有错误。写下你生成的术语,你会发现它们与泰勒级数不匹配。

标签: c trigonometry calculus taylor-series


【解决方案1】:

您的扩展似乎有误。

试试这个: last*=((x*x)*(2*i-1)*(2*i-1))/((2*i)*(2*i+1))

你仍然需要很多条款。有 1000 个术语,我得到 arcsin(1.0) ~= 1.552963 。 (您的代码 1.194958)

10000 个术语 arcsin(1.0) ~= 1.565155。 (您的代码 1.194958)

【讨论】:

  • 你乘以 2i-1 两次,为什么??
  • @OriaGruber:取消上一期的常数。多看几集,你就搞错了。您的代码为每个术语的分母添加了两个常数因子,该系列只有一个。
【解决方案2】:

一个问题是,当 x=1 时,该级数以对数方式快速收敛。请注意,x=1 位于 arcsin 收敛半径的边界。因此,收敛速度极慢也就不足为奇了。

更大的问题是您实际上并没有实现您认为已经实现的系列。您正在对线性收敛的东西求和。看起来它可能是众所周知的东西的组成部分,但它肯定不是 arcsin。

【讨论】:

  • 我理解收敛的部分,1是arcsin的边界,我可以接受。但是你能解释一下为什么我计算的系列不是arcsin的系列吗?我看公式,我看我的算法,我看不出有什么区别。对于所有其他值(其中 |x|
【解决方案3】:

您扩展的泰勒级数对|x| &lt; .5 有六位精度,|x| &lt; .6 有五位精度,|x| &lt; .7 有四位精度,|x| &lt; .8 有三位精度,|x| &lt; .9 有两位精度.

当然,没有理由认为泰勒多项式是最好的 给定次数的多项式。欢迎来到数值分析。

要对|x| = 1 进行良好估计需要太多项,因为 arcsin(x) 的导数在x = 1 处有一个极点,因此 泰勒级数收敛非常缓慢。这意味着除了小 x 之外,泰勒展开式不是逼近 arcsin(x) 的有效方法。如果您在计算时打印展开式的每个项,您会发现使级数在合理的时间内收敛非常小。

为了您的帮助,Milton Abramowitz 和 Irene Stegun 在他们的书“数学函数手册”第 81 页推导出这个近似公式:

arcsin(x) = pi/2 - sqrt(1 - x)(a0 + a1*x + a2*x^2 + a3*x^3)

在哪里

a0 = 1.5707288
a1 = -0.2121144
a2 = 0.0742610
a3 = -0.0187293

在 1 附近表现更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2015-07-21
    • 2016-01-24
    • 2017-12-02
    • 2017-06-06
    • 2018-09-13
    • 2018-06-23
    相关资源
    最近更新 更多