Java中sin(x)泰勒级数展开式的散度

  • 本文关键字:展开式 sin Java java
  • 更新时间 :
  • 英文 :


我试图对sinx进行泰勒展开式,但如果x大于150度,函数就发散了

下面是我的代码:

package TaylorJ;
import java.math.*;

public class SeriesSin {

这里我将自治领绑定为[0,2 pi]。

public static double Dominion(double x) {
double dpi = 2*Math.PI;
double dmx = 0;
if((x>=0 && x<=dpi)) {
dmx = x;
}

else if(x<0) {
dmx = dpi+(x%dpi);
}
else {
dmx = x%dpi;
}

return dmx;
}

这里,我定义了一个阶乘函数

public static int Factorial(int n) {
n = Math.abs(n);
int a = 1;
int b = 1;
if(n==0 || n == 1) {
return 1;
}
else {
for(int i=n; i>1;i--) {
b *=i;
}
return b;
}
}

这是sin(x)的泰勒(麦克劳林)级数展开

public static double Sin(double x) {
if(x%Math.PI == 0) {
x = Dominion(x);
}
else {
x = Dominion(Math.abs(Math.toRadians(x)));
}
int j = 0;
double nmu = 0;
double d1 = 10;
double d2 = 0;




do {
d1 = nmu;
nmu = nmu+ Math.pow(-1,j)*((Math.pow(x, ((2*j)+1)))/(Factorial((2*j)+1)));
d2 = nmu;


j = j+1;




}while((Math.abs(Math.abs(d2)-Math.abs(d1))>0.0001));
return nmu;
}

}

问题是它必须被定义为x在[0,2]内,所以我不知道该怎么做

感谢

这个错误很可能是数值over/undeflows的连锁反应。注意,在计算中用作中间结果的阶乘函数的值增长得相当快。使用标准的浮点数表示,您将很快失去计算的准确性。

但是,每个求和项都可以通过将序列中的前一项与合适的因子相乘来计算。这样可以避免中期结果过大或过小。

任何关于数值分析的文本都应该提供更详细和严格的讨论。

在你的代码中,用以下代码替换循环:
double asummandj = x;
do {
d1 = nmu;
nmu = nmu + Math.pow(-1,j) * asummandj;
d2 = nmu;
j = j+1;
asummandj = asummandj * (x / (2*j)) * (x / (2*j+1));
} while(Math.abs( d2 - d1 ) > 0.0001);

最新更新