1

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

但由于某种原因它不起作用。当我输入 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 次。

4

3 回答 3

2

看起来你的扩展有错误。

尝试这个: 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)

于 2013-02-06T06:43:36.830 回答
2

您扩展的泰勒级数具有 6 位精度|x| < .5、 5位精度|x| < .6、 4位精度、 |x| < .73位精度和 2|x| < .8位精度|x| < .9

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

需要太多项才能对 进行良好估计|x| = 1,因为 arcsin(x) 的导数在 处有一个极点x = 1,因此泰勒级数收敛非常缓慢。这意味着泰勒展开不是逼近 arcsin(x) 的有效方法,除了小 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 附近表现更好。

于 2013-02-06T06:44:21.327 回答
2

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

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

于 2013-02-06T06:28:05.387 回答