当前位置: 首页 > 知识库问答 >
问题:

Java中sin(x)泰勒级数展开的发散性

羿昊英
2023-03-14

我试着做x正弦的泰勒展开,但是如果x大于150度,函数就会发散。

这是我的代码:

package TaylorJ;
import java.math.*;


public class SeriesSin {

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

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)的Taylor(Maclaurin)级数展开式

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;
}

}

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

谢谢

共有1个答案

荆钱明
2023-03-14

这个错误很可能是数值过度/未定义的涟漪效应。请注意,在计算中用作中间结果的阶乘函数的值增长相当快。使用标准浮点数表示,你将很快失去计算的准确性。

然而,你的每个求和项都可以通过乘以系列中的前一项和一个合适的因子来计算。这样你就可以避免太大或太小的中期结果。

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

在代码中,用以下代码替换循环:

    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);
 类似资料:
  • 我有一个作业,教授要我们用泰勒级数计算sin(x)。他希望我们在两个连续分数之间的差小于10^-6时停止迭代。 最后,我说,例如x^5/5!与(x^3/3!)*相同(x^2/4*5),所有分数都是如此。所以我可以保留之前计算的分数,并在下一次迭代中使用。问题是,我最终得到的数字与它的实际罪过有点偏差,我不知道为什么。提前谢谢。这是我的代码:

  • 这是我的代码: 但它不起作用并显示此错误:

  • 我需要对我的递归方法的一些洞察力来计算辛泰勒级数,它不能正常工作。该方法调用了另外两个递归方法,即递归pow方法和递归阶乘方法。我将我的发现与迭代罪方法进行了比较,给了我正确的解决方案。我的递归罪方法中缺少什么? sin(x)= x - x^3/3的近似值!x^5/5!-x^7/7!...

  • 在数学中,泰勒级数对于用低次多项式逼近函数是很重要的。 我想看看这样的近似如何有帮助,例如为了加快计算速度。让我们使用著名的泰勒级数: 从道德上讲,计算2次多项式的值应该比计算快得多。 因此,一个测试代码: 为什么多项式法比实际测井慢10倍?我期待的正好相反。 PS:这个问题可能在SO和math.SE.

  • 我使用泰勒级数来计算< code>sin()。对原罪的泰勒级数是: 我使用的实现如下所示: 据我所知,该代码是多项式的项的近似(换句话说,该近似是从零到 系列编写相同类型的实现。 你能帮我理解一下吗?

  • sin() 方法 sin() -- 返回数的正弦值 语法: Math.sin( x ); 参数说明: x -- Number 类型的弧度( 将角度乘以 0.017453293 (2PI/360)即可转换为弧度 )。 返回值: x 的正弦值。返回值在 -1.0 到 1.0 之间。 示例: console.log( Math.sin( 2 ) ); console.log( Math.s