Двойной интеграл Симпсона не будет работать в java - PullRequest
1 голос
/ 06 апреля 2020

This is an image of the guideImage2 Поэтому мне пришлось написать алгоритм для двойного интеграла Симпсона, чтобы я мог найти ответ гораздо быстрее. У меня было руководство, которое показало шаги для написания этой программы. Следуя этому руководству и запустив его в 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. Спасибо за помощь. Вы также можете просмотреть руководство, которому я следовал, чтобы создать эту программу.

1 Ответ

0 голосов
/ 06 апреля 2020

Я не проверял математику, большая ошибка, кажется, указывает на ошибку в реализованном алгоритме. Для сомнений сомнительны. И существуют ошибки с плавающей запятой.

Вместо умножения дроби на текущий индекс (который умножит ошибку аппроксимации с плавающей запятой в дроби), лучше сделать:

Вместо:

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

do

    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 мне немного неясна.

...