【问题标题】:Simpson's double integral won't work in java辛普森的双积分在java中不起作用
【发布时间】:2020-07-18 07:42:27
【问题描述】:

所以我必须为辛普森的双积分编写一个算法,这样我才能以更快的方式找到答案。我有一个指南,显示了编写这个程序的步骤。在遵循本指南并在 netbeans 中运行它之后,我发现从程序中得出的值并没有真正接近真正的答案。这是我用java写的代码:

  //INPUT
        double a = 0,b = 1; // Endpoints
        int m = 8,n = 4;

        double K1 = 0, K2 = 0, K3 = 0;

        //OUPUT 

        //Step 1
        double h = (b - a) / n;
        double j1 = 0; //End terms
        double j2 = 0; //Even terms
        double j3 = 0; //Odd terms

        //Step 2
        for(int i = 0; i <= n; i++){
            //Step 3
            double x = a + (i * h);

            double hX = (d(x) - c(x)) / m;
             K1 = f(x, c(x)) + f(x, d(x)); // End terms


             //Step 4
             for (int j = 1; j < (m-1); j++){
                 //Step 5
                 double y = c(x) + (j * hX);
                 double q = f(x,y);


                 //Step 6
                 if (j % 2 == 0){
                     K2 = K2 + q;
                 }
                 else
                     K3 = K3 + q;
             }

             //Step 7 
             double l = (K1 + (2*K2) + (4*K3)) * (hX / 3);

             //Step 8
             if (i == 0 || i == n)
                 j1 = j1 + l;
             else if (i % 2 == 0)
                 j2 = j2 + l;
             else
                 j3 = j3 + l;

        }

        double j = h * (j1 + (2 * j2) + (4 * j3)) / 3;
        System.out.println("j = " + j);

    }


    public static double c(double x){
        return x;
    }

    public static double d(double x){
        return 2 * x;
    }

    public static double f(double x, double y){
        return (Math.pow(y, 2) + Math.pow(x, 3));
    }

我尝试了几次调试程序,但我还没有找到我遇到这个错误的原因。如果您在我的代码中发现任何错误,请告诉我是否可以修复它。对于给定的示例,我得到的值是 0.9069281684027777,而不是正确的值 0.7838542。谢谢您的帮助。您还可以查看我为创建此程序而遵循的指南。

【问题讨论】:

  • 你试过调试你的代码吗?
  • @Stultuske 是的,我尝试过,但我不知道为什么它没有正确完成
  • 第 4 步下面的 for 循环应该是

标签: java netbeans integral numerical-analysis simpsons-rule


【解决方案1】:

我没有检查数学,大错误似乎表明实现的算法有错误。边界是可疑的。并且存在浮点错误。

与其将分数乘以运行索引(这将乘以分数中的浮点近似误差),不如这样做:

改为:

    double h = (b - a) / n;
    for (int i = 0; i <= n; i++) {
        double x = a + (i * h);

    for (int i = 0; i < n; i++) {
        double x = a + i * (b - a) / n;

    for (int i = 0; i <= n; i++) {
        double x = a + i * (b - a) / (n + 1);

边界 n 对我来说有点不清楚。

【讨论】:

  • 在尝试了您建议的解决方案后,我在运行代码时仍然得到相同的结果。
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 2016-02-16
  • 2019-04-25
  • 2013-08-15
  • 2018-05-20
  • 2013-12-21
  • 2020-02-26
  • 2012-04-10
相关资源
最近更新 更多