2013-02-06 113 views
1

我写一个程序,来自用户的值x和整数n增加时,该程序然后打印反正弦(x)的使用泰勒系列为ARCSIN http://tedmuller.us/Math/img/Taylor-arcsin.gif泰勒级数为反正弦(x)时,不正确的输出C语言

但由于某种原因,它不工作。当我输入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(); 
} 

基本思路是这样的:最后,总结双方开始与x的值。然后我提前最后成为系列中的下一个数字,将它加上总和,再次提前,再加上...冲洗并重复n次。

+1

你有什么价值为'n'而努力?一般来说,这个系列会有多快?你是否打印了条款('最后'值)?为什么不? –

+0

我输入了相当大的n,10的值。所以答案应该非常准确,即使我输入100的n,答案也不会有太大差异。 –

+0

印刷最后的价值没有实际意义,因为任何给定点的最后价值只是答案的一部分,而不是答案本身 –

回答

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)

+0

你乘以2i-1两次,为什么? –

+1

@OriaGruber:取消上一个术语的常量。在这个系列中再多注意一点,你有一个错误。您的代码为每个学期的分母添加了两个常数因子,该系列只有一个。 –

+0

啊,这是正确的!我现在明白了。非常非常感谢你! –

2

一个问题是,当x = 1时,该序列以对数方式快速收敛。注意x = 1在arcsin的收敛半径的边界。所以你会收敛得非常慢,这并不奇怪。

更大的问题是,您没有实际执行您认为已实施的系列。你正在总结线性收敛的东西。看起来它可能是一个完美的东西的组成部分,但它肯定不是弧形的。

+0

我明白收敛的部分和1是arcsin的边界,我对此很好。但是,请你解释为什么我计算的系列不是arcsin的系列之一?我看公式,我看看我的算法,我看不出有什么不同。也为所有其他值(其中| x | <1)我得到一个正确的答案arcsinx –

2

您展开泰勒级数有|x| < .5六个地方的准确性,五个地方|x| < .6,四个地方|x| < .7,三个地方|x| < .8,和两个地方|x| < .9

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

它需要太多的条件,以获得良好的估计|x| = 1,因为反正弦(X)的衍生物具有x = 1一个极点,使泰勒级数收敛速度非常缓慢。这意味着泰勒展开不是近似arcsin(x)的有效方式,除了小x。如果您在计算扩展的每一项时打印出来,您会发现它非常小,从而使该系列在一段合理的时间内收敛。

对于你的帮助,米尔顿阿布拉莫维茨和伊雷内·施特贡在他们的著作“手册的数学函数”,第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.

0
float x; 
float v; 
    cout<<"Enter Value For X \n"; 
    cin>>x; 
    v=x; 
    x=(x*3.141592654)/180; 
    float a,b,c,d,e,sum=0.0; 
    a=x; 
    b=(x*x*x)/6; 
    c=3*(x*x*x*x*x)/40; 
    d=15*(x*x*x*x*x*x*x)/336; 
    e=105*(x*x*x*x*x*x*x*x*x)/1152; 
    sum=a+b+c+d+e; 
    sum=(sum*180)/3.141592654; 
    cout<<"arcsin("<<v<<") = "<<sum; 
+1

这显然是C++而不是C – Ian