2013-04-18 4 views
0

Вот мой код Римана Integrator:Римана Integrator Sum Выпуск

public class RiemannIntegrator { 

    public static void main (String [] args) 
    { 
     double lower = Double.parseDouble(args[args.length -2]); 
     double higher = Double.parseDouble(args[args.length -1]); 

     double[] coefficients = new double[args.length - 3]; 

     if (args[0].equals("poly")) 
     { 
      for (int i = 1; i < args.length - 2; i++) 
      { 
       coefficients[i-1] = Double.parseDouble(args[i]); 
      } 

      System.out.println(integral("poly", coefficients, lower, higher)); 
     } 
    } 

    private static double integral(String s, double[] function, double lowBound, double highBound) 
    { 

     double area = 0; // Area of the rectangle 
     double sumOfArea = 0; // Sum of the area of the rectangles 
     double width = highBound - lowBound; 

      if (s.equals("poly")) 
      { 
       for (int i = 1; i <= ((highBound - lowBound)/width); i++) // Represents # of rectangles 
       { 
        System.out.println("Rectangles:" + i); 
        for (int j = 0; j < function.length; j++) // Goes through all the coefficients 
        { 
         area = width * function[j] * Math.pow ((double)((i * width + lowBound + (i -1.0) * width + highBound)/2.0),function.length- 1- j); 
         /*Above code computes area of each rectangle */ 

         sumOfArea += area; 
        } 
       } 
      } 
      width = width/2.0; 
      System.out.println("polynomial, function (of any length), lower boundary, higher boundary."); 
      function.toString(); 
      System.out.println("Lower Bound:" + lowBound + ", Higher Bound: " + highBound + "."); 
      System.out.println("The integral is:"); 
      return sumOfArea; 
    } 



} 

Он работает по большей части, однако, математика неправильно чаще, чем нет, и я не знаю, куда я пошел неправильно. Например, если я хочу найти сумму функции x^3 + 2x^2 + 3x, я получаю 2.416667 на моем калькуляторе и на Wolfram Alpha. Но в моей программе это говорит мне, что я получаю 6. Я думаю, что это может иметь какое-то отношение к числу прямоугольников, потому что всегда говорит мне, что я получаю один прямоугольник. Может ли кто-нибудь помочь?

ответ

0

Вам нужен другой цикл, то вдоль линий

double width = highBound - lowBound; 
double epsilon = .001; // This determines how accurate you want the solution to be, closer to zero = more accurate 
double prevValue = -1.0; 
double curValue = -1.0; // initialize curValue to a negative value with greater magnitude than epsilon - this ensures that the while loop evaluates to true on the first pass 
do { 
    ... // this is where your for loop goes 
    prevValue = curValue; 
    curValue = sumOfArea; 
    width /= 2.0; 
} while(Math.abs(prevValue - curValue) > epsilon); 

Идея заключается в том, что вы сохраняете уменьшения ширины rectancles' пока sumOfArea с шириной = ш является более или менее то же самое (то есть в пределах epsilon) как sumOfArea с шириной = 2w.

Существуют более быстрые и точные алгоритмы интеграции, например. Newton-Cotes, но я предполагаю, что у вас нет выбора в этом вопросе.

+0

Это правильно. У меня нет выбора в этом вопросе. – 2013-04-18 03:24:25

 Смежные вопросы

  • Нет связанных вопросов^_^