Integral de Riemann

De ChuWiki

Para calcular una integral desde código, se pueden hacer dos cosas.

En primer lugar, hacer el código necesario capaz de calcular la función primitiva de una función dada. Esto no sabemos hacerlo los humanos en todos los casos, así que difícilmente se lo vamos a contar a un ordenador por medio de un programa. Hay programas capaces de calcular algunas primitivas, pero desde luego no de todas las funciones.

La otra opción es conformarse con calcular el valor de la integral definida entre dos valores. Esto, desde un programa java, se puede hacer de forma aproximada. La integral definida de una función entre dos valores representa el área entre esa función y el eje de las x, entre los dos valores y que digamos.

Para calcular este área, se puede aproximar por la suma de las áreas de un montón de rectángulos. Cada rectángulo tendrá una altura y=f(x) y será de un ancho lo más estrecho posible.

Un código java que puede calcular esto podría ser como el siguiente.

En primer lugar, una interface para representar una función y=f(x), de forma que nuestro código tratará con estas interfaces

package chuidiang.metodos_numericos;

public interface InterfaceFuncion {
   public double getY (double x);
}

La clase Riemann será la que calcule la aproximación del área -de la integral definida-. Su código puede ser así

package chuidiang.metodos_numericos;

public class Riemann {
   public static double calculaIntegral (
      InterfaceFuncion funcion, 
      double xInicial, 
      double xFinal, 
      int numeroPasos)
   {
      double resultado = 0.0;
		
      double incremento = (xFinal-xInicial)/numeroPasos;
      double semiIncremento = incremento/2;
      double x = xInicial;
		
      for (int i=0;i<numeroPasos;i++)
      {
         resultado += incremento * funcion.getY(x+semiIncremento);
         x+=incremento;
      }
		
      return resultado;
   }
}

A este método le pasaríamos

  • La función a integrar
  • El valor xInicial de la integral
  • El valor xFinal de la integral
  • El número de rectángulos por el que queremos aproximar la integral. Cuanto más grande, más exactitud, aunque tardará más la cuenta.

Aquí un pequeño ejemplo de cómo llamaríamos a este método para calcular la integral definida de y=x*x entre 0 y 1

package chuidiang.metodos_numericos;

public class MainEjemplo {
   public static void main(String [] args)
   {
      InterfaceFuncion f = new InterfaceFuncion() {
         public double getY(double x) {
            return x*x;
         }
      };
		
      System.out.println(Riemann.calculaIntegral(f, 0.0, 1.0, 1000));
   }
}