Cálculo de Áreas

Objetivos: Resolver el problema de cálculo del área bajo la curva y utilizar subclases para poder formar una clase de biblioteca que realiza el cálculo.

Temas:


Cálculo de áreas

Uno de los problemas matamáticos más frecuentes es el cálculo del área que se forma al graficar una función. Por ejemplo, se necesita calcular el área A que aparece en la siguiente figura:

en donde la función f(x) y los valores a y b son conocidos.

En este tipo de problemas se pueden obtener dos tipos de soluciones:

Desde luego, la soluciones algebraicas son mejores que las numéricas, porque son exactas. Pero a veces, la complejidad de las funciones hace imposible (o difícil) obtener la solución algebraica, por lo que una solución numérica permite ahorrar tiempo.


Método de los trapecios

La estrategia más simple consiste en subdividir el intervalo pedido para el cálculo del área en n subintervalos de pequeño tamaño y aproximar el área como la suma de las área de los trapecios que se forman:

en donde delta=(a-b)/n. Si n es suficientemente grande (o equivalentemente delta es suficientemente pequeño), el área de los trapecios será aproximadamente el área pedida. El área de los trapecios se calcula de la siguiente forma:


Programación del método de los trapecios

Supongamos que la función eval evalúa la función f(x) (como se hizo cuando se calcularon la raíces de una función). Entonces la siguiente fórmula permite calcular el área de los trapecios:

area= delta*(f(a)/2+f(x1)+f(x2)+...+f(x(n-1))+f(b)/2)

Programa:

    double area(double a, double b, int n) {
      double delta= (b-a)/n;
      double sum= (eval(a)+eval(b))/2; // 1/2*(f(a)+f(b))
      double x= a;
      for (int i=1; i<n; i++) {        // + f(a+i*delta), con i=1 ... n-1
        x+= delta;
        sum+= eval(x);
      }
      return delta*sum;
    }
    double eval(double x) {
      ...
      return ...;
    }
Esta solución es análoga a la que se programó para buscar los ceros de una función. El problema de esta solución es que sucede cuando se requiere calcular la integral de varias funciones distintas. Hay que programar una función para calcular el área de cada función.


Cálculo del área de múltiples funciones en base a subclases

La idea consiste en crear objetos para evaluar las múltiples funciones. Cada uno de estos objetos poseerá un método eval para evaluar la función asignada. La definición del método se hará en una subclase de un clase base común a todas las funciones. Llamaremos a esta clase Funcion:

    class Funcion extends Program {
      double eval(double x) {
        return 0.0;
      }
      double area(double a, double b, int n) {
        // el mismo método de antes
        return ...;
      }
    }
Con esta clase ahora es posible calcular en un solo programa el área de sin(x), de exp(x) y de x^k:

    class FunSin extends Funcion {
      double eval(double x) {
        return sin(x);
      }
      // area se hereda
    }
    class FunExp extends Funcion {
      double eval(double x) {
        return exp(x);
      }
      // area se hereda
    }
    class FunXk extends Funcion {
      int k;
      FunXk(int k) {
        this.k= k;
      }
      double eval(double x) {
        return pow(x, k);
      }
      // area se hereda
    }
    ...
    void run() {
      println("area sin(x)= " + new FunSin().area(0.0, PI/2, 100));
      println("area exp(x)= " + new FunExp().area(0.0, 1.0, 100));
      println("area x^3= " + new FunXk(3).area(0.0, 1.0, 100));
    }
(Ver el programa completo en Trapecios.java.)

En la clase Funcion también se pueden incluir otros métodos para:


Método de Simpson

El método de los trapecios no es preciso en su resultado porque no es adecuado aproximar la curva por líneas rectas. Un método más preciso es el de Simpson que toma pares de subintervalos y aproxima la función en ese intervalo por un polinomio de grado 2 que pasa exactamente por los puntos que delimitan cada subintervalo.

Cada subintervalo entre xi y x(i+2), con i un entero par, se aproxima por un polinomio de la forma:

p(x)= ai*x²+bi*x+ci

en donde ai, bi y ci se calcula de tal forma que:

p(xi)=f(xi)

p(x(i+1))=f(x(i+1))

p(x(i+2))=f(x(i+2))

Al resolver el problema se llega a una formula bastante simple para el área:

area= delta/3*(f(a)+4*f(xi)+2*f(x(i+1))+4*f(x(i+2))+2*f(x(i+3))+...+4*f(x(n-1))+f(b))

Tarea:

Escriba el método simpson que calcula el área utilizando el método de simpson.

(Compare su solución con el programa Simpson.java.)