Métodos numéricos

De MateWiki
Saltar a: navegación, buscar

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, o cuando el volumen de cálculos es demasiado grande para hacer un tratamiento manual.

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 una solución analítica 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 para resolver a mano

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 producido por usar una aproximación para que el algoritmo sea estable y genere 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 área 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 rayada indica el valor del área que hemos calculado en cada rectángulo; 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[/math] y [math]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, ya que el método puede proporcionar una respuesta totalmente incorrecta. Si no conocemos el método numérico, puede ser muy difícil evaluar si la solución que hemos obtenido es adecuada o no.

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 lo escribimos como 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:

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

En la cabecera función hemos incluido también la documentación de la función. Siempre que programemos una nueva función es importante 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:

1 A = 0;
2   h = (b-a)/n;
3 
4   for k=1:n
5    xk = a + h*k;     % Valor de x en el extremo del intervalo
6    A = A + f(xk)*h;  % Sumamos el área del rectángulo
7   end
8 end % Fin de la función

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

 1 function A = integrarConRectangulos(f, a, b, n)
 2 % Calcula el valor aproximado de la integral de f entre a y b,
 3 % usando n rectángulos.
 4 %
 5 % Uso: A = integrarConRectangulos(f, a, b, n)
 6 %
 7 % A     Valor aproximado de la integral
 8 % f     Función a integrar. Debe aceptar un único argumento y devolver un único argumento.
 9 % a,b   Extremos del intervalo de integración, siendo b mayor que a
10 % n     Número de rectángulos usados en la integración
11 %
12 % Ejemplo: Integral de x^2 entre 3 y 4 con 10 rectángulos
13 % integrarConRectangulos(@(x) x^2, 3, 4, 10)
14   
15   A = 0;
16   h = (b-a)/n;
17 
18   for k=1:n
19    xk = a + h*k;     % Valor de x en el extremo del intervalo
20    A = A + f(xk)*h;  % Sumamos el área del rectángulo
21   end
22 end % Fin de la función


2.1.1 Ejemplos de uso

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. El primer paso es definir la función, que llamaremos g. En Octave UPM existen diferentes maneras de crear una función. Podríamos crear un fichero g.m que aceptara un valor x y devolviera el valor de la función. Pero es más rápido crear un function handle, que permite crear funciones en la línea de comandos. Las funciones pueden tener varios argumentos de entrada pero están limitadas a un único valor de salida. Pero esta limitación no es inconveniente para usar handles con nuestras implementaciones de métodos numéricos, porque las funciones matemáticas normalmente devuelven siempre un único valor. El valor que se devuelve es siempre el último cálculo de la función. Creamos el function handle usando el símbolo @, seguido de las variables de entrada entre paréntesis, tal y como sigue:

>> g = @(x) x^2;

Al haber creado esta función, la podemos llamar con cualquier argumento. Por ejemplo

>> g(3)
ans = 9
>> g(5)
ans = 25

Ahora podemos llamar directamente a la función que calcula la aproximación de la integral:

>> integrarConRectangulos(g, 3, 4, 10)
ans =  12.6850000000000

Es decir, el error ha sido [math]12.685 - 12.333 = 0.352[/math], es decir un [math]2.8541\%[/math]. ¿Qué ocurrirá si usamos ahora 100 rectángulos?

>> integrarConRectangulos(g, 3, 4, 100)
ans =  12.3683500000000

El error es ahora [math]12.36835 - 12.33333 = 12.03505[/math], es decir un [math]0.2866\%[/math].

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. Es difícil encontrar ingenieros informáticos que tengan conocimientos de otras ramas de la ingeniería, pero es más fácil encontrar ingenieros especialistas en una rama con conocimientos de informática suficientes para programar un método numérico.

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 término multiplicado por [math]h[/math]. Por cada orden de magnitud que disminuyamos el valor de [math]h[/math], el error disminuirá en un orden 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 Áreas del análisis numérico

Los métodos numéricos se emplean en general en cualquier problema que sea difícil de resolver de manera analítica, o con un volumen de datos inmanejable sin medios automáticos. Entre otros problemas, se usan métodos numéricos para resolver:

  • Sistemas de ecuaciones lineales
    • Métodos exactos, que obtienen la solución exacta del sistema. Por ejemplo, la Factorización de Doolittle.
    • Métodos aproximados, que aproximan de manera iterativa la solución al sistema
  • Ecuaciones no lineales, con raíces reales y/o complejas
  • Integración numérica
  • Sistemas de ecuaciones no lineales
  • Ecuaciones diferenciales
    • Ecuaciones diferenciales ordinarias
    • Ecuaciones diferenciales en derivadas parciales
  • Autovalores y autovectores de una matriz

Los autovalores y autovectores de una matriz se usan para determinar la convergencia de los métodos iterativos de resolución de sistemas de ecuaciones. Muchos problemas de ingeniería necesitan también calcular los autovalores de una matriz. Por ejemplo, un puente es una estructura que puede resolverse por métodos matriciales. Pero más importante que las tensiones en las barras son las frecuencias de resonancia, que coinciden con los autovalores de la matriz del sistema[3].

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)
  3. K. Yusuf Billah and Robert H. Scanlan. Resonance, Tacoma Narrows bridge failure, and undergraduate physics textbooks. American Journal of Physics. Vol. 59, Issue 2, pp. 118. February 1991 (enlace a PDF sin suscripción)