Arcin(x)的泰勒级数,C语言输出不正确

Arcin(x)的泰勒级数,C语言输出不正确,c,trigonometry,calculus,taylor-series,C,Trigonometry,Calculus,Taylor Series,我编写了一个程序,从用户那里得到一个值x和一个整数n,然后该程序使用arcsin的泰勒级数打印arcsinx 但由于某些原因,它不起作用。当我输入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

我编写了一个程序,从用户那里得到一个值x和一个整数n,然后该程序使用arcsin的泰勒级数打印arcsinx

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

一个问题是,当x=1时,级数对数收敛得很快。请注意,x=1位于Arcin收敛半径的边界处。因此,收敛速度非常慢也就不足为奇了


一个更大的问题是,您没有真正实现您认为已经实现的系列。你在对线性收敛的东西求和。看起来它可能是某个东西的积分,但它肯定不是Arcin。

一个问题是,当x=1时,该级数对数收敛得很快。请注意,x=1位于Arcin收敛半径的边界处。因此,收敛速度非常慢也就不足为奇了


一个更大的问题是,您没有真正实现您认为已经实现的系列。你在对线性收敛的东西求和。它看起来可能是某个东西的积分,但它肯定不是Arcin。

看起来你的展开有错误

试试这个: 最后一个*=x*x*2*i-1*2*i-1/2*i*2*i+1

你还需要很多条款。有了1000个术语,我得到了arcin1.0~=1.552963。你的代码是1.194958


10000项Arcin1.0~=1.565155。您的代码1.194958

看起来您的扩展出错了

试试这个: 最后一个*=x*x*2*i-1*2*i-1/2*i*2*i+1

你还需要很多条款。有了1000个术语,我得到了arcin1.0~=1.552963。你的代码是1.194958


10000项Arcin1.0~=1.565155。你的代码1.194958

你展开的泰勒级数的精度为| x |<.5,五位为| x |<.6,四位为| x |<.7,三位为| x |<.8,两位为| x |<.9

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

需要太多的项才能得到| x |=1的良好估计,因为arcsinx的导数在x=1处有一个极点,所以它的泰勒级数收敛得非常慢。这意味着泰勒展开不是一种有效的逼近arcinx的方法,除了小x。如果在计算时打印出展开式的每个项,您会发现它非常小,无法使序列在合理的时间内收敛

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

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


你展开的泰勒级数在1附近的精度要高得多。

你展开的泰勒级数在| x |<.5处有六位精度,在| x |<.6处有五位精度,在| x |<.7处有四位精度,在| x |<.8处有三位精度,在| x | 9处有两位精度

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

需要太多的项才能得到| x |=1的良好估计,因为arcsinx的导数在x=1处有一个极点,所以它的泰勒级数收敛得非常慢。这意味着泰勒展开不是一种有效的逼近arcinx的方法,除了小x。如果在计算时打印出展开式的每个项,您会发现它非常小,无法使序列在合理的时间内收敛

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

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


哪一个在接近1时性能更好。

您输入的n值是多少?这个序列的收敛速度一般有多快?您是否已打印出术语“最后一个值”?为什么不呢?我输入了一个相当大的值n,10。所以答案应该是非常准确的,即使我输入n为100,答案也不会有太大差异。而且打印last的值没有实际意义,因为在任何给定点上last的值只是答案的一部分,而不是答案本身为什么?“我该如何修复它呢?”奥里亚格罗布:你的扩展也有一个错误。写下你生成的项,你会发现它们与泰勒级数不匹配。你输入的n值是多少?这个序列的收敛速度一般有多快?您是否已打印出术语“最后一个值”?为什么不呢?我输入了一个相当大的值n,10。所以答案应该是非常准确的,即使我输入n为100,答案也不会有太大差异。而且打印last的值没有实际意义,因为在任何给定点上last的值只是答案的一部分,而不是答案本身为什么?我该怎么做呢
九是吗?@OriaGruber:你的扩展也有一个错误。写下你正在生成的项,你会发现它们与泰勒级数不匹配。我理解收敛的部分,1是弧心的边界,我同意。但是你能解释一下为什么我计算的序列不是Arcin的序列吗?我看公式,看算法,看不出有什么区别。同样对于所有其他值,其中| x |我理解收敛部分,1是弧心的边界,我同意。但是你能解释一下为什么我计算的序列不是Arcin的序列吗?我看公式,看算法,看不出有什么区别。同样,对于所有其他值,其中| x |乘以2i-1两次,为什么??@OriaGruber:取消前一项中的常数。再多看一眼这个系列,你就错了。您的代码为每个项的分母添加了两个常量因子,该序列只有一个。您将2i-1乘以两次,为什么??@OriaGruber:取消上一项的常量。再多看一眼这个系列,你就错了。您的代码为每个项的分母添加两个常量因子,序列只有一个。