我编写了一个程序,它从用户那里得到一个值x和一个整数n,程序然后使用taylor serie为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次。
答案 0 :(得分:2)
一个问题是当x = 1时,该系列会以对数方式快速收敛。请注意,x = 1位于arcsin收敛半径的边界。因此,收敛速度极慢并不奇怪。
更大的问题是你没有实际实现你认为已经实现的系列。你总结了线性收敛的东西。它看起来可能是一个很好的结构,但它肯定不是arcsin。
答案 1 :(得分: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)
答案 2 :(得分:2)
您展开的泰勒系列的|x| < .5
精确度为六位,|x| < .6
为五位,|x| < .7
为四位,|x| < .8
为三位,和|x| < .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附近表现得更好。
答案 3 :(得分: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;