Diferencia entre revisiones de «Métodos numéricos»

De MateWiki
Saltar a: navegación, buscar
(Implementación del método numérico)
(Implementación del método numérico)
Línea 81: Línea 81:
 
end % Fin de la función
 
end % Fin de la función
 
}}
 
}}
El código completo quedaría entonces:
+
El código completo, que se guardaría en un fichero de nombre ''integrarConRectangulos.m'', quedaría entonces:
 
{{matlab | codigo =
 
{{matlab | codigo =
 
function A = integrarConRectangulos(f, a, b, n)
 
function A = integrarConRectangulos(f, a, b, n)
Línea 106: Línea 106:
 
end % Fin de la función
 
end % Fin de la función
 
}}
 
}}
 +
Veamos dos ejemplos de uso de esta función. En primer lugar, vamos a calcular <math>\displaystyle \int_3^4 x^2dx = \frac{37}{3} = 12.\overline{3}</math> usando 10 rectángulos:
 +
 
=== Análisis numérico del método ===
 
=== Análisis numérico del método ===
  

Revisión del 14:05 20 ago 2013

Warning.png Este artículo está en versión beta. El autor de este artículo no lo ha terminado todavía, por favor no lo edites hasta que elimine este mensaje.

La mayoría de los métodos matemáticos empleados en ingeniería utilizan variables continuas. Cuando queremos trasladar estos métodos al ordenador, para facilitar su resolución, nos encontramos con que en un ordenador no es posible realizar cálculos en variable continua de manera eficiente. El ordenador trabaja con una representación de información discreta. Los métodos numéricos se encargan de adaptar métodos matemáticos en variable continua a un sistema de representación de información discreto. En ocasiones, también se emplean métodos numéricos cuando no es posible obtener una solución analítica de un problema.

1 Análisis numérico de algoritmos

Un método numérico es un algoritmo que intenta resolver una operación matemática compleja en un ordenador. Los motivos por los que se usa un método numérico en vez de intentar una solución analítica pueden ser varios:

  • El problema es muy complejo, y no se puede encontrar en la práctica
  • El problema no tiene solución analítica conocida, pero puede resolverse de manera numérica
  • El tamaño de la solución lo hace impracticable

El objetivo del análisis numérico es obtener un método para resolver el problema matemático en un ordenador. Hay que tener en cuenta que el ordenador solo es capaz de realizar operaciones matemáticas sencillas, y sobre todo, que los ordenadores usan un sistema discreto de representación de la información. En el desarrollo de un método numérico hay que tener en cuenta por tanto dos aspectos:

  • Es necesario traducir el problema a operaciones elementales (operaciones aritméticas)
  • Es necesario controlar el error para que el algoritmo sea estable, y produzca una solución cercana a la realidad

Algunos paquetes de software, como por ejemplo Octave UPM, poseen una biblioteca de métodos numéricos y de operaciones matemáticas que hacen más sencilla la implementación de un método numérico. Por ejemplo, aunque un ordenador no puede resolver un sistema de ecuaciones directamente, en Octave UPM la solución del sistema [math]A\cdot x = b[/math] se obtiene simplemente con

x = A\b;

En cuanto a controlar el error, existen dos fuentes principales de error:

Existen también diferentes conceptos que suelen aparecer relacionados con métodos numéricos:

  • Cuando hablamos de un método numérico, normalmente nos referimos a un algoritmo que resuelve un problema matemático y que se puede implementar en un ordenador.
  • En ocasiones, también se usa el término cálculo numérico, para denominar la actividad de resolver problemas matemáticos usando un ordenador.
  • Por último, el análisis numérico es una rama de la Matemática que se encarga del análisis de los algoritmos numéricos, con el fin de controlar el error y producir una solución fiel a la solución exacta.

2 Ejemplo de método numérico

Vamos a ver un ejemplo de método numérico sencillo. La integral de una función es un problema que a veces es complejo de resolver de manera analítica, o incluso, que puede no tener solución analítica. Sin embargo, es un problema relativamente sencillo de resolver numéricamente.

Área bajo la función

El problema que vamos a resolver es el siguiente: [math]\displaystyle D = \int_a^b f(x) dx[/math] Se trata de calcular el valor de D, que es el área bajo la curva f(x) entre los puntos x=a y x=b. Suponemos que f(x) es una función continua en [a,b]. La imagen de la derecha ilustra el problema.

Aproximación del area bajo la función usando rectángulos

Al integrar una función en un intervalo dado, estamos sumando pedazos del área de ancho infinitesimal. La suma contiene infinitos elementos, y su resultado es el valor de la integral, que coincide con la del área. En un ordenador, no podemos tener pedazos de área infinitesimal, por lo que será necesario discretizar el problema, y calcular el área aproximando por rectángulos de alguna longitud dada. Por ejemplo, en la imagen de la derecha hemos aproximado el área usando cinco rectángulos.

Es decir, hemos realizado la siguiente aproximación: [math]\displaystyle \int_a^b f(x) dx \approx \sum_{i=1}^5 A_i = \sum_{i=1}^5 f(x_i)\cdot h[/math] donde [math]h=2[/math] en la figura, y [math]x_1 = 12, \ \ x_2=14, \ \ \dots[/math], es decir [math]x_{i+1} = x_i + h[/math].

Es obvio que la aproximación supone un error en el cálculo. En el caso de la figura de la derecha, la zona roja de los rectángulos nos indica el error que estamos cometiendo en la aproximación. En los rectángulos [math]A_1, A_2, A_4 y A_5[/math] el error es positivo; es decir, nuestra aproximación supone una estimación superior al valor del área bajo la curva. En el caso del rectángulo [math]A_3[/math], el error es negativo, ya que hemos realizado una estimación inferior al valor del área bajo la curva en ese intervalo. Este error negativo se resta de la suma de los errores positivos, y mejora ligeramente nuestra estimación.

Si hiciéramos el valor de h más pequeño, el error cometido sería probablemente más pequeño. Pero no se puede disminuir h hasta valores arbitrariamente pequeños, ya que en algún momento alcanzaremos los límites de precisión de la máquina, y obtendremos errores de redondeo demasiado grandes. En el ejemplo, está claro que h=2 es demasiado burdo; el valor se ha elegido únicamente con fines ilustrativos.

Otro ejemplo de método numérico que se puede encontrar en MateWiki es la Factorización de Doolittle, que se usa para resolver sistemas de ecuaciones lineales, para el cálculo de la matriz inversa y otras aplicaciones.

2.1 Implementación del método numérico

La mayoría de paquetes informáticos empleados en Ingeniería, como Octave UPM, suelen incluir funciones para aplicar los métodos numéricos más conocidos sin que sea necesario programarlos directamente. Sin embargo, la mejor manera de averiguar si entendemos bien un método numérico en concreto es intentar implementarlo. Solo cuando seamos capaz de escribirlo en un programa, podremos estar seguros de que entendemos cómo funciona. Aplicar un método numérico sin entenderlo completamente es la mejor manera de obtener un resultado erróneo, y es además peligroso si se trata de un problema de ingeniería.

Cuando implementemos un método numérico, es importante intentar escribir nuestro programa de manera que sea reutilizable. En el caso de Octave UPM, es más fácil reutilizar un programa si es una función en un fichero .m separado. En el caso de este método numérico, la función devolverá el valor del área, y aceptará como argumentos de entrada los siguientes:

  • Función que vamos a integrar
  • Extremos del intervalo, a y b
  • Número de rectángulos que va a emplear

Por tanto, la cabecera de la función quedaría como sigue:

function A = integrarConRectangulos(f, a, b, n)
% Calcula el valor aproximado de la integral de f entre a y b,
% usando n rectángulos.
%
% Uso: A = integrarConRectangulos(f, a, b, n)
%
% A     Valor aproximado de la integral
% f     Función a integrar. Debe aceptar un único argumento y devolver un único argumento.
% a,b   Extremos del intervalo de integración, siendo b mayor que a
% n     Número de rectángulos usados en la integración
%
% Ejemplo: Integral de x^2 entre 3 y 4 con 10 rectángulos
% integrarConRectangulos(@(x) x^2, 3, 4, 10)

Es importante resaltar que siempre que programemos una nueva función, es fundamental incluir la documentación explicando qué hace y cómo se usa. Un ejemplo de uso también ayuda a clarificar cómo llamar a la función. De lo contrario, será complicado reutilizarla por otras personas, o incluso por nosotros mismos en el futuro, cuando ya no recordemos cómo escribimos el programa.

Vamos ahora a escribir el código. Como nuestro método calcula el área de cada rectángulo, y obtiene el valor total como la suma de todos los rectángulos, necesitaremos usar un bucle dentro del programa. Además, el valor del área tendrá que usar una variable que acumule el valor de cada rectángulo. También será necesario calcular el valor de h, usando el número de rectángulos:

A = 0;
  h = (b-a)/n;

  for k=1:n
   xk = a + h*k;     % Valor de x en el extremo del intervalo
   A = A + f(xk)*h;  % Sumamos el área del rectángulo
  end
end % Fin de la función

El código completo, que se guardaría en un fichero de nombre integrarConRectangulos.m, quedaría entonces:

function A = integrarConRectangulos(f, a, b, n)
% Calcula el valor aproximado de la integral de f entre a y b,
% usando n rectángulos.
%
% Uso: A = integrarConRectangulos(f, a, b, n)
%
% A     Valor aproximado de la integral
% f     Función a integrar. Debe aceptar un único argumento y devolver un único argumento.
% a,b   Extremos del intervalo de integración, siendo b mayor que a
% n     Número de rectángulos usados en la integración
%
% Ejemplo: Integral de x^2 entre 3 y 4 con 10 rectángulos
% integrarConRectangulos(@(x) x^2, 3, 4, 10)
  
  A = 0;
  h = (b-a)/n;

  for k=1:n
   xk = a + h*k;     % Valor de x en el extremo del intervalo
   A = A + f(xk)*h;  % Sumamos el área del rectángulo
  end
end % Fin de la función

Veamos dos ejemplos de uso de esta función. En primer lugar, vamos a calcular [math]\displaystyle \int_3^4 x^2dx = \frac{37}{3} = 12.\overline{3}[/math] usando 10 rectángulos:

2.2 Análisis numérico del método

El análisis numérico suele ser una tarea de matemáticos. Los ingenieros seleccionan el método que mejor se adapta a un problema particular, y lo aplican. Por ejemplo, un ingeniero civil puede seleccionar el mejor método de resolución de un sistema de ecuaciones lineales para calcular una estructura usando un método matricial. En ocasiones, los mismos ingenieros son los que implementan también el método, ya que para muchos problemas es más importante ser experto en el problema de ingeniería que se resuelve, más que un experto en programación o Informática. En esta sección incluimos un ejemplo de análisis numérico del algoritmo propuesto anteriormente, para ilustrar que aunque sea una tarea de matemáticos, un ingeniero también puede analizar si un algoritmo es adecuado para el problema que quiere resolver.

En el caso de integración numérica, la preocupación principal es cuál es el error de la aproximación. Como estamos discretizando el intervalo de integración, la pregunta es cuál es el mejor valor de [math]h[/math] para obtener una solución satisfactoria. No basta con hacer el valor de [math]h[/math]muy pequeño, ya que eso provocaría errores de redondeo en la máquina. Además, incluso si fuera muy pequeño, podría no ser adecuado para el problema que queremos resolver. Si obtenemos una expresión del error, es posible seleccionar un valor de [math]h[/math] que cometa poco error, pero sea lo suficientemente grande para evitar los errores de redondeo en el ordenador, y también para que el tiempo de ejecución sea el menor posible.

Aplicando el análisis numérico es posible obtener una expresión del error en función de h. El error de la aproximación es: [math]\displaystyle E = \sum_{i=1}^5 A_i - \int_a^b f(x)dx = \sum_{i=1}^5 f(x_i) h - \int_a^b f(x)dx[/math]

Tomaremos [math]x_0=10, \ x_1=12, \ x_2=14 \ \dots \ x_n=20[/math]. En cada rectángulo, estamos sustituyendo la función por un valor constante en el extremo del intervalo. Es decir, estamos usando un polinomio interpolador de grado 0. En general, el error que se comete en la interpolación se puede aproximar suponiendo que los rectángulos que usamos para interpolar son el polinomio de Taylor de grado 0 de la función. Es decir, en el intervalo [math][x_{i-1}, x_i][/math] tenemos que: [math]\displaystyle f(t) = f(x_{i}) + f'(c_i)(t-x_{i-1})[/math] donde [math]c_i[/math] es algún punto intermedio en el intervalo. El segundo término es el error que comete la aproximación de Taylor, y en nuestro caso, el error que cometemos al sustituir la función por un valor constante.

Si nos centramos en un rectángulo [math]A_i[/math], el error cometido en ese rectángulo [math]E_i[/math] vendrá dado por: [math]\displaystyle E_i = f(x_i)h - \int_{x_{i-1}}^{x_i} f(t)dt = f(x_i)h - \int_{x_{i-1}}^{x_i} (f(x_i) + f'(c_i)(t-x_{i-1}))dt[/math] Es decir: [math]\displaystyle E_i = f(x_i)h - (f(x_i)+f'(c_i))\int_{x_{i-1}}^{x_i} (t-x_{i-1})dt = f(x_i)h - (f(x_i)+f'(c_i))\frac{h^2}{2}[/math] El error que cometemos al aproximar el rectángulo varía con el cuadrado de [math]h[/math], y depende también del valor de la función en el extremo. Si sumamos todos los rectángulos: [math]\displaystyle E = \sum_i E_i = \sum_i f(x_i)h - \sum_i (f(x_i)+f'(c_i)\frac{h^2}{2} = h\sum_i f(x_i) - \frac{h^2}{2}\sum_i (f(x_i) + f'(c_i))[/math] Esta expresión nos permite extraer algunas conclusiones. El término dominante del error es el cuadrado de [math]h[/math]. Por cada orden de magnitud que disminuyamos el valor de [math]h[/math], el error disminuirá en dos órdenes de magnitud.

Vemos también que hay términos que suman y restan en el error. Es decir, aunque el método cometa error, algunas veces lo hace por arriba y otras por abajo, por lo que el error total podría compensarse y ser pequeño. Observamos también que el error depende de los valores de la función en los puntos que hemos seleccionado en el intervalo, y del valor de la derivada de la función. Nuestro método comete error incluso integrando una línea recta (de derivada constante), por lo que no parece un buen método numérico[1].

3 Orígenes del análisis numérico

Desde los comienzos de la Informática, los ordenadores se han dedicado a resolver problemas matemáticos que no era posible resolver a mano. Al principio, estos problemas no eran necesariamente complejos. Por ejemplo, muchas grandes empresas empezaron a usar ordenadores para el cálculo automático de las nóminas de sus empleados, aprovechando que el ordenador podía tratar grandes cantidades de información.

Sin embargo, la necesidad de resolver problemas complejos de ingeniería extendió pronto el rango de aplicaciones de los ordenadores, y empezaron a usarse para cálculos complejos, que no se adaptaban bien a un ordenador. Uno de los primeros ejemplos es la resolución de sistemas de ecuaciones lineales. En un principio, se intentaban adaptar métodos conocidos para su uso en un ordenador, pero no siempre proporcionaban un resultado correcto. El análisis rigurosos de los algoritmos y de las fuentes de error en un ordenador proporcionó respuesta a por qué en ocasiones los métodos numéricos no funcionaban, y supuso el nacimiento del análisis numérico, que es en la actualidad una rama de la Matemática[2]

4 Aŕeas del análisis numérico

5 Referencias

  1. Obviamente, existen métodos de integración numérica más sofisticados y que cometen un error mucho menor. Este método es solo un ejemplo ilustrativo de cómo es un método numérico y cómo se analiza. Véase Integración numérica (Wikipedia ES) para más detalles sobre mejores métodos de integración numérica.
  2. Grcar, Joseph F. John von Neumann's Analysis of Gaussian Elimination and the Origins of Modern Numerical Analysis. SIAM Review, 53(4), pp. 607–682, 2011. (enlace a PDF sin suscripción)