domingo, 11 de noviembre de 2012

Método de Newton-Raphson

Tal vez, dentro de los métodos para determinar el valor de las raíces de una función ya sea lineal o no lineal, el método de Newton es uno de los más utilizados. Si el valor inicial con el que se aproxima  la raíz es $x_i$, entonces se puede extender una tangente desde el punto $[x_i,f(x_i)]$ en donde $i=0,1,2,..,n$. De esta forma el punto de la tangente que corta al eje $x$ representa una aproximación mejorada de la raíz (ver la figura).

Figura: Ilustración del modo en que el método de Newton-Raphson se aproxima a la solución.


 El método de Newton-Raphson se puede deducir sobre la base de una interpretación geométrica (un método alterno basado en la serie de Taylor). Como podemos apreciar en la figura, la derivada de $x$ es equivalente a:
$$f'(x_i)=\frac{f(x_i)-0}{x_i-x_{i+1}}$$

Que se puede ordenar para obtener:

$$x_{i+1}=x_i-\frac{f(x_i)}{f'(x_i)}$$

Esta es la formula utilizada en el método de Newton-Raphson

Estimación del error

Para poder especificar un criterio de paro en el método de Newton-Raphson se suele utilizar la siguiente expresión para calcular el error en cada iteración:
$$error=\left | \frac{x_{i+1}-x_i}{x_{i+1}}\right | $$

Por otra parte si desarrollamos el modelo por medio de la serie de Taylor, esto nos proporciona una base teórica firme para poder estimar la velocidad de variación del error en cada iteración y así poder verificar la convergencia del método. Veamos:

La expansión de la serie de taylor se expresa de la siguiente manera:
$$f(x_{i+1})=f(x_i)+f'(x_i)(x_{i+1}-x_i)+\frac{f''(\xi)}{2!}(x_{i+1}-x_i)^2+... +\frac{f^n(\xi)}{n!}(x_{i+1}-x_i)^n\label{ref3}$$

En donde $\xi$ se encuentra en alguna parte en el intervalo entre $x_{i+1}$ y $x_i$. Si truncamos la serie de Taylor después del segundo termino derivado obtenemos la siguiente aproximación:

$$f(x_{i+1}) \cong f(x_i)+f'(x_i)(x_{i+1}-x_i)$$

En a intersección con el eje $x$ debemos tener $f(x_{i+1}))=0$, por lo tanto:

$$0 = f(x_i)+f'(x_i)(x_{i+1}-x_i)$$

Por lo que obtenemos la formula utilizada en el Método de Newton-Raphson
\begin{equation}
x_{i+1}=x_i-\frac{f(x_i)}{f'(x_i)} \label{ref1}
\end{equation}
Ahora si analizamos el error. Para esto hacemos $x_{i+1}=x_r$ en la ecuación \eqref{ref3}, en donde $x_r$ representa el valor real de la raiz y a la vez $f(x_r)=0$ :

$$0=f(x_i)+f'(x_i)(x_r-x_i)+\frac{f''(\xi)}{2!}(x_r-x_i)^2 \label{ref4}$$

y truncando  la ecuación \eqref{ref3} hasta el tercer termino:

$$f(x_{i+1}) \cong f(x_i)+f'(x_i)(x_{i+1}-x_i)+\frac{f''(\xi)}{2!}(x_{i+1}-x_i)^2 \label{ref2}$$

Luego restamos \eqref{ref4} de \eqref{ref2}:


$$0=f'(x_i)(x_r-x_{i+1})+\frac{f''(\xi)}{2!}(x_r-x_i)^2 \label{ref5}$$

Ahora sabiendo que el error entre la aproximación del método y el valor real es igual a la direfencia entre $x_{i+1}$ y $x_r$:

$$E_{t,i+1}=x_r-x_{i+1}$$
entonces:

$$0=f'(x_i)E_{t,i+1}+\frac{f''(\xi)}{2!}E_{t,i}^2 \label{ref6}$$

Si se supone que el método efectivamente converge a una solución, se podría decir entonces que tanto $x_i, \xi \longrightarrow x_r$, de esta manera la ecuación \eqref{ref6} quedaría así:

$$E_{t,i+1}=\frac{-f''(x_r)}{2f'(x_r)}E_{t.i}^2 \label{ref7}$$



Por lo que podemos ver en la ecuación \eqref{ref7} el error es proporcional al cuadrado del error anterior, este es uno de los motivos por los cuales en el caso de que la solución converja lo hace de una manera bastante rápida, sólo después de un par de iteraciones. A este comportamiento se le conoce como convergencia cuadrática.

A continuación les dejo un código que hice en MATLAB con la implementación del método.

Function Newton-Raphson

Function Newton-Raphson


%%%/////////////////////////////////////////////////
% /          Función Newton-Raphson            ///
%/        Desarrollada por Jorge De La Cruz     ///
%/                                             ///
%////////////////////////////////////////////////
% La función 'fun' debe ser introducida como un string
% x: representa el valor inicial necesario para iniciar
% las iteraciones.
% tol: La tolerancia deseada.
% imax: máximo número de iteraciones, evita que el
% programa se quede en un bucle infinito en caso de que
% el método no converja.
function [xr]=newton(fun,x,tol,imax)
err=100;
n=1;
while (tol<=err)&&(n<imax)
    xr = x-eval(fun)/(eval(diff(sym(fun))));
    err=abs((xr-x)/xr);
    error=err*100;
    x=xr;
    fprintf('Iteración: %d, Error: %f, Raiz: %f\n',n,error,xr)
    n=n+1;
end
x=-2:0.001:xr+1;
y=eval(fun);
plot(x,y)
title('METODO DE NEWTON-RAPHSON')
xlabel('$x$','interpreter','latex','fontsize',18)
ylabel('$y$','interpreter','latex','fontsize',18)
grid on
end
Y el código en Scilab sería:
0001  //Función a la cual se le desea determinar la raiz, fun.sci
0002  function y=fun(x)
0003      y=exp(-x)-x;
0004  endfunction

0001  //FUnción Newton-Raphson en otro archivo llamado newton.sci
0002  function xr=newton(d, tol, imax)
0003      err=100;
0004      n=1;
0005      while (tol<=err)&(imax>n)
0006          xr=d-(fun(d)/(derivative(fun,d)));
0007          n=n+1;
0008          err=abs((xr-d)/xr);
0009          e=err*100;
0010          d=xr;
0011          printf("iter: %i, error: %f, raiz: %f\n",n,e,xr)
0012      end
0013      x=xr-2:0.001:xr+2;
0014      y=fun(x);
0015      plot(x,y)
0016  endfunction

Licencia de Creative Commons
Newton-Raphson by Jorge De La Cruz is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

martes, 17 de noviembre de 2009

Compilar FORTRAN 77 desde Matlab

Para los que en algún momento han necesitado compilar un código escrito en FORTRAN 77 desde Matlab, les presento una manera de realizar esta importante tarea.

Dentro del entorno de Matlab existe una función la cual nos permite poder compilar programas escritos en otros lenguajes de programación distintos a los escritos con extención .m en Matlab, pudiendo de esta manera ser ejecutados desde la pantalla de comandos de Matlab como si estuviéramos ejecutando una función *.m. La función que nos proporciona Matlab para poder realizar esta operación es la función mex, la cual en forma general se especifica de la siguiente forma:

>> mex [option] [file]

La función mex utiliza un compilador para lograr su ojetivo de compilar codigos escritos ya sea en C o en FORTRAN, por lo cual es necesario especificarle a la función mex el compilador más apropiado para la tarea a realizar. Lo anterior se logra tipiando, desde la pantalla de comandos de Matlab, la siguiente linea:

>> mex -setup

Matlab por defecto trae un compilador llamado lcc el cual permite desde la pantalla de comandos de Matlab, compilar codigos escritos C. Pero existe un problema, al parecer este compilador no es capaz de compilar códigos escritos en FORTRAN 77. Siendo necesario, para el caso en que se quiera compilar archivos escritos en FORTRAN, utilizar otro tipo de compilador distinto a el lcc, estamos hablando de los compiladores de la familia Intel Visual Fortran, compilador el cual no es gratuito.

Para poder hacer uso de este magnífico compilador, es necesario descargar la aplicación MinGW la cual nos ayuda a realizar una instalación guiada de distintos compiladores utilizados en las distribuciones Linux. Dentro de los compiladore disponibles se encuentran el gcc, g++ y g77. Para efectuar esta instalación se debe de descargar MinGW desde la siguiente dirección: www.mingw.org. En dicha dirección seleccionar "Downloads" y después "Sourceforge File Release" . De la lista de archivos descargar "Automated MinGW Installer" , luego ejecutarlo e instalar el compilador g77 y si es necesario tambien los demás.

jueves, 12 de noviembre de 2009

Kubuntu 9.10 Netbook

Aqui les presento la primera versión de kubuntu Netbook, el escritotio desarrollado en Kde, dirigido a optimizar los recursos de las netbook. En lo personal me parece que tiene muy buen aspecto. Además puedes implemantar muchos efectos con un uso minimo de memoria RAM, lo cual es suuumamente importante!!

También es cierto que a pesar que cuenta con en plasma para netbook diferente y agradable, al estar este en sus primeras versiones, me parece que se le pueden realizar mejoras a implementar en proyectos futuros...

lunes, 1 de junio de 2009

Ecuación Diferencial de Conducción de Calor

El proceso de conducción de calor es un evento el cual se describe a través de una ecuación diferencial en derivadas parciales, la cual es de segundo orden en las variables espaciales y de primer orden en la variable temporal. Esta ecuación diferencial se expresa de la siguiente forma:



Siendo la ecuación (1), la ecuación diferencial en tres dimensiones con generación de calor en estado transitorio, mientras que la ecuación (2) es la ecuaciónn diferencial en tres dimensiones en régimen transitorio sin generación de calor.
En esta sección nos limitaremos a trabajar con la ecuación de conducción de calor en una dimensión, transitoria, homogénea y con condiciones de frontera no Homogéneas. En este caso las condiciones de frontera serán especificadas de la siguiente manera:


Siendo la condición de frontera (3), tipo I o condición de frontera de Dirichlet. Mientras que (4), condición tipo II o de Neumann, y (5) condición de frontera tipo III o de Robbin. Las condiciones de frontera tipo III son una combinación lineal de las condiciones tipo I y tipo II.

Operador Nabla (Operador Diferencial)

El operador nabla es un operador diferencial muy utilizado en multiples problemas de ingeniería, en este caso especifico en el área de Transferencia de Calor.

El operador nabla opera sobre tensores, vectores y escalares y apuntando siempre en la dirección máxima de cambio de la variable indicando así una derivada direccional.
  • En el caso de que nabla opere sobre un escalar (tensor de rango 0), como producto interno obviamente, recibe el nombre de gradiente.
  • Nabla operando sobre un vector (tensor de rango 1), en este caso nabla puede operar como producto interno o producto vectorial. En el primero de los casos recibe el nombre de divergencia (el cual está asociado a un balance de flujo del vector sobre el cual opera), mientras que en el segundo de los casos (producto vectorial) recibe del nombre de rotacional.
  • Nabla operando sobre un tensor de rango 2 o mayor. Nabla opera sobre tensores de rango 2 o mayores en forma de producto interno, especificando de esta forma un gradiente del tensor, con dimensiones iguales a la del tensor sobre el cual opere.

ECUACIÓN DE CONTINUIDAD

En una de los casos donde vemos al operador nabla, es en el caso de la derivación de la ecuación de continuidad la cual es sumamente utilizada en el área de Mecánica de Fluidos.
Partiremos de la ley de la conservación de la materia dentro de un dominio V en un tiempo o momento dado, la cual se expresa de la siguiente manera:

La conservación de masa requiere que la derivada material de "m" sea igual a 0, dicho de otra forma:



De tal modo que tenemos lo siguiente:



Para el caso de fluidos incompresibles no vamos a tener variación en la densidad, por ende el termino de derivada material de la densidad (6) es igual a cero y despejando de la ecuación (7), tenemos:


De esta manera la ecuación (8) es la ecuación de continuidad para flujo incompresible, la cual expresa un balance de flujo del vector velocidad.