Creando fractales con el método de Newton

9
Creando fractales con el método de Newton Pablo Santamaría v0.1 (Junio 2009) El método de Newton, ideado por Isacc Newton alrededor de 1670, constituye una de las técnicas numéricas más poderosas para aproximar raíces de una ecuación f (x)=0. El método comienza con una aproximación inicial x 0 para la raíz y genera una sucesión de aproximaciones x 1 ,x 2 ,... según la fórmula x n+1 = x n - f (x n ) f (x n ) , n =1, 2,... sucesión que converge rápidamente a la raíz si la aproximación inicial se encuentra suficientemente próxima a la misma. Nótese que el método no está restringido a los números reales, sino que, de hecho, puede ser aplicado por igual a funciones sobre el campo complejo. Consideremos en particular la ecuación z 4 - 1=0. En el campo real la misma sólo tiene una raíz, a saber, 1. Pero en el campo complejo, la ecuación tiene cuatro raíces: ζ 1 =1, ζ 2 = -1, ζ 3 = i, ζ 4 = -i. Supongamos que, entonces, aplicamos el método de Newton a esta ecuación. En 1876, Arthur Cayley propuso el siguiente problema: dado un valor inicial z 0 cualquiera del plano complejo, ¿a cual de las cuatro raíces convergerá el método de Newton? La respuesta a este problema conduce sorprendentemente a una figura de naturaleza fractal. Para ver ésto procederemos como sigue: En el cuadrado [-2, 2]×[-2, 2] consideramos un gran número de valores iniciales z 0 escogidos al azar. Aplicamos el método de Newton a la ecuación z 4 - 1=0 para cada valor z 0 escogido. Coloreamos el punto z 0 en el plano complejo ya sea de rojo, verde, azul o magenta según a que raíz ζ 1 2 3 o ζ 4 , respectivamente, ha convergido el método. Un programa en Fortran 77 para realizar tal procedimiento es dado a continuación. En apuntes anteriores ya hemos implementado el método de Newton en sendas subrutinas de Fortran 77 y Fortran 95 1 . Llevar tal subrutina al campo complejo no reviste mayor dificultad que reemplazar las correspondientes variables reales por variables complejas. Esto conduce a la siguiente subrutina. SUBROUTINE NEWTON(F,DF,XX0,NMAX,TOL,RAIZ,ICLAVE) * --------------------------------------------------- * METODO DE NEWTON-RAPHSON para encontrar una * solución de f(x)=0 dada la función derivable * f y una aproximación inicial x0. * --------------------------------------------------- * Bloque de identificación de argumentos 1 Ver los apuntes Subrutinas para la resolución de ecuaciones de una variable o Subrutinas en Fortran 95 para la resolución de ecuaciones de una variable 1

Transcript of Creando fractales con el método de Newton

Page 1: Creando fractales con el método de Newton

Creando fractales con el método de Newton

Pablo Santamaría

v0.1 (Junio 2009)

El método de Newton, ideado por Isacc Newton alrededor de 1670, constituye una de lastécnicas numéricas más poderosas para aproximar raíces de una ecuación f(x) = 0. El métodocomienza con una aproximación inicial x0 para la raíz y genera una sucesión de aproximacionesx1, x2, . . . según la fórmula

xn+1 = xn −f(xn)f ′(xn)

, n = 1, 2, . . .

sucesión que converge rápidamente a la raíz si la aproximación inicial se encuentra suficientementepróxima a la misma. Nótese que el método no está restringido a los números reales, sino que,de hecho, puede ser aplicado por igual a funciones sobre el campo complejo. Consideremos enparticular la ecuación

z4 − 1 = 0.

En el campo real la misma sólo tiene una raíz, a saber, 1. Pero en el campo complejo, la ecuacióntiene cuatro raíces:

ζ1 = 1, ζ2 = −1, ζ3 = i, ζ4 = −i.

Supongamos que, entonces, aplicamos el método de Newton a esta ecuación. En 1876, ArthurCayley propuso el siguiente problema: dado un valor inicial z0 cualquiera del plano complejo, ¿acual de las cuatro raíces convergerá el método de Newton? La respuesta a este problema conducesorprendentemente a una figura de naturaleza fractal. Para ver ésto procederemos como sigue:

En el cuadrado [−2, 2 ]×[−2, 2 ] consideramos un gran número de valores iniciales z0 escogidosal azar.

Aplicamos el método de Newton a la ecuación z4 − 1 = 0 para cada valor z0 escogido.

Coloreamos el punto z0 en el plano complejo ya sea de rojo, verde, azul o magenta según aque raíz ζ1, ζ2, ζ3 o ζ4, respectivamente, ha convergido el método.

Un programa en Fortran 77 para realizar tal procedimiento es dado a continuación. En apuntesanteriores ya hemos implementado el método de Newton en sendas subrutinas de Fortran 77 yFortran 951. Llevar tal subrutina al campo complejo no reviste mayor dificultad que reemplazar lascorrespondientes variables reales por variables complejas. Esto conduce a la siguiente subrutina.

SUBROUTINE NEWTON(F,DF,XX0,NMAX,TOL,RAIZ,ICLAVE)* ---------------------------------------------------* METODO DE NEWTON-RAPHSON para encontrar una* solución de f(x)=0 dada la función derivable* f y una aproximación inicial x0.* ---------------------------------------------------* Bloque de identificación de argumentos

1Ver los apuntes Subrutinas para la resolución de ecuaciones de una variable o Subrutinas en Fortran 95 parala resolución de ecuaciones de una variable

1

Page 2: Creando fractales con el método de Newton

* ---------------------------------------------------* F = Función que define la ecuación (arg entrada)* DF = Función derivada de F (arg entrada)* XX0 = Aproximación inicial (arg entrada)* NMAX = Número máximo de iteraciones (arg entrada)* TOL = Tolerancia del error relativo (arg entrada)* RAIZ = Estimación de la solución (arg salida)* ICLAVE = Clave de éxito (arg salida)* 0 = éxito* 1 = iteraciones excedidas* ---------------------------------------------------* Bloque de declaración de tipo* ---------------------------------------------------

IMPLICIT NONEINTEGER NMAX, ICLAVEDOUBLE COMPLEX F, DF, XX0, RAIZDOUBLE PRECISION TOL

* ---------------------------------------------------INTEGER IDOUBLE COMPLEX X0

* ---------------------------------------------------* Bloque de procesamiento* ---------------------------------------------------

ICLAVE = 0X0 = XX0DO I=1,NMAX

RAIZ = X0 - F(X0)/DF(X0)IF (ABS((RAIZ-X0)/RAIZ).LT.TOL) RETURNX0 = RAIZ

END DOICLAVE = 1RETURNEND

* ---------------------------------------------------

El método de Newton requiere de la función que define a la ecuación y su derivada, las cuales sonimplementadas en apropiadas FUNCTION complejas.

DOUBLE COMPLEX FUNCTION F(Z)IMPLICIT NONEDOUBLE COMPLEX ZF = Z**4 -(1.0D0,0.0D0)RETURNEND

DOUBLE COMPLEX FUNCTION DF(Z)IMPLICIT NONEDOUBLE COMPLEX ZDF = (4.0D0,0.0D0)*Z**3RETURNEND

Finalmente consideremos el programa principal. En el cuadrado de semilado A = 2, conteniendo elorigen, generamos NPOINTS = 50 0000 números complejos Z0 = (X0,Y0) como condiciones inicialespara el método de Newton. Para ello utilizamos un generador de números aleatorios, provistopor las subrutinas intrínsecas RANDOM_SEED, que inicializa el generador, y RANDOM_NUMBER, la cualdevuelve un número al azar entre 0 y 1. Puesto que nosotros queremos números aleatorios en elrango [-A:A] efectuamos una simple transformación lineal para llevarlos a tal rango. Con el fin dedistinguir a cual de las cuatro raíces converge el método creamos cuatro archivos, uno para cada

2

Page 3: Creando fractales con el método de Newton

raíz. Entonces dependiendo la solución obtenida con el método de Newton, la condición inicial esguardada en el archivo que corresponde a la raíz a la cual ha convergido.

PROGRAM FRACTAL_NEWTON* -------------------------------------------------------------------

IMPLICIT NONE

INTEGER NROOTS ! Número de raícesINTEGER NPOINTS ! Número de aproximaciones inicialesINTEGER NMAX ! Número máximo de iteraciones en NewtonREAL A ! Semilado del cuadrado [-A:A][-A:A]DOUBLE PRECISION TOL ! Cota para el error relativo en NewtonPARAMETER (NROOTS = 4,

& NPOINTS = 500000,& NMAX = 100,& A = 2.0,& TOL = 1.0D-8)

DOUBLE COMPLEX ROOTS(NROOTS) ! Raíces de la ecuaciónDATA ROOTS/( 1.0D0, 0.0D0), ! 1

& (-1.0D0, 0.0D0), ! -1& ( 0.0D0, 1.0D0), ! i& ( 0.0D0,-1.0D0)/ ! -i

INTEGER CLAVE ! Clave de error de la subrutina NewtonINTEGER UNIDAD ! Número de unidad para archivos de salidaINTEGER I,J

DOUBLE COMPLEX F,DF ! Funcion y derivada de la ecuaciónEXTERNAL F,DF

DOUBLE COMPLEX Z0,RAIZ ! Aproximación inicial y soluciónDOUBLE PRECISION X0,Y0 ! Parte real e imaginaria de la aprox. inicialREAL R ! Número al azar entre 0 y 1

CHARACTER(7) ARCHIVOCHARACTER(2) NUMSTRINGLOGICAL SEGUIR

* -------------------------------------------------------------------* Crear archivos de salida para cada una de las raíces* -------------------------------------------------------------------

DO J=1,NROOTSUNIDAD = 10+JWRITE(NUMSTRING,’(I2.2)’) JARCHIVO = ’raiz-’ // NUMSTRINGOPEN(UNIDAD,FILE=ARCHIVO)

ENDDO* -------------------------------------------------------------------* Proceder* -------------------------------------------------------------------

CALL RANDOM_SEED() ! Inicializar semilla

DO I = 1,NPOINTS* ----------------------------------------------------------------* Construir una aproximación inicial compleja dentro del* del cuadrado [-A:A][-A:A]* ----------------------------------------------------------------

CALL RANDOM_NUMBER(R)X0 = DBLE(-A+2.0*A*R)

3

Page 4: Creando fractales con el método de Newton

CALL RANDOM_NUMBER(R)Y0 = DBLE(-A+2.0*A*R)Z0 = COMPLEX(X0,Y0)

* ----------------------------------------------------------------* Resolver la ecuación con el método de Newton con tal aproximación* ----------------------------------------------------------------

CLAVE = 0CALL NEWTON(F,DF,Z0,NMAX,TOL,RAIZ,CLAVE)

* ----------------------------------------------------------------* Imprimir la condición inicial en el archivo correspondiente* según la raíz obtenida* ----------------------------------------------------------------

IF (CLAVE.EQ.0) THENJ = 1SEGUIR = .TRUE.DO WHILE(SEGUIR.AND.J.LE.NROOTS)

IF (ABS(RAIZ-ROOTS(J)).LE.TOL) THENUNIDAD = 10 + JWRITE (UNIDAD,*) X0, Y0SEGUIR = .FALSE.

ENDIFJ = J + 1

ENDDOENDIF

END DO* ----------------------------------------------------------------* Cerrar archivos de salida y terminar* ----------------------------------------------------------------

DO J=1,NROOTSUNIDAD = 10+JCLOSE(UNIDAD)

END DOSTOPEND

Con los cuatro archivos, raiz-01, raiz-02, raiz-03 y raiz-04, generados por la ejecución delprograma, utilizamos las siguientes sentencias en el programa gnuplot para obtener el mapa deaproximaciones.

gnuplot> set size squaregnuplot> set xrange [-2:2]gnuplot> set yrange [-2:2]gnuplot> plot "raiz-01" w d, "raiz-02" w d, "raiz-03" w d, "raiz-04" w d

El resultado obtenido se ilustra en la figura 1. Las amplias regiones de un solo color correspondena puntos que convergen rápidamente a la respectiva raíz. Pero entre tales áreas de convergenciaobtenemos estructuras fractales donde la convergencia no está bien comportada. Estructuras frac-tales similares resultan para otras ecuaciones. Por ejemplo, la figura 2 ilustra la distribución delas aproximaciones iniciales para la ecuación z3 − 1 = 0, cuyas raíces son 1, −1/2± i

√3/2.

Es fácil generalizar el programa para analizar la convergencia de las aproximaciones inicialesz0 para una ecuación algebraica cualquiera dados los n ceros ζi, i = 1, . . . , n de la misma:

f(z) =n∏

i=1

(z − ζi) = 0.

En este caso, aplicando la regla de derivación de un producto tenemos que:

f ′(z) =n∑

i=1

∏j 6=i

(z − ζj) =n∑

i=1

1(z − ζi)

n∏j=1

(z − ζj) = f(z)n∑

i=1

1(z − ζi)

4

Page 5: Creando fractales con el método de Newton

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

Figura 1. Distribución en el plano complejo de las aproximacionesiniciales z0 para la ecuación z4 − 1 = 0 según la convergencia por elmétodo de Newton a la raíz ζ1 = 1 (en rojo), ζ2 = −1 (en verde),ζ3 = i (en azul) o ζ4 = −i (en magenta).

con lo cual, un paso del método de Newton puede ser calculado en forma simple como:

xn+1 = xn −f(xn)f ′(xn)

= xn −[ n∑

i=1

1(xn − ζi)

]−1

.

De este modo no se requiere especificar la función f ni su derivada, sino que simplemente se necesitaespecificar los ceros. A continuación presentamos el programa que hace uso de este resultado, dondela subrutina que implementa el método de Newton ha sido modificada para éste propósito. Comocaso particular consideramos la ecuación:

(z − 3)(z − 2)(z − 1)(z + 1)(z + 2)(z + 3) = 0, (1)

la cual tiene 6 raíces. La estructura fractal obtenida, ilustrada en la figura 3, es mucho más pequeñacomparada con la estructura general, sin embargo, en los bordes de las zonas de convergencia biencomportada, ésta se presenta nuevamente.

PROGRAM FRACTAL_NEWTON* -------------------------------------------------------------------

IMPLICIT NONE

INTEGER NROOTS ! Número de raícesINTEGER NPOINTS ! Número de aproximaciones inicialesINTEGER NMAX ! Número máximo de iteraciones en Newton

5

Page 6: Creando fractales con el método de Newton

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

Figura 2. Distribución en el plano complejo de las aproximacionesiniciales z0 para la ecuación z3 − 1 = 0 según la convergencia por elmétodo de Newton a la raíz ζ1 = 1 (en rojo), ζ2 = −1/2+ i

√3/2 (en

verde) ó ζ3 = −1/2− i√

3/2 (en azul).

REAL A ! Semilado del cuadrado [-A:A][-A:A]DOUBLE PRECISION TOL ! Cota para el error relativo en NewtonPARAMETER (NROOTS = 6,

& NPOINTS = 500000,& NMAX = 100,& A = 3.0,& TOL = 1.0D-8)

DOUBLE COMPLEX ROOTS(NROOTS) ! Raíces de la ecuaciónDATA ROOTS/( 3.0D0, 0.0D0),

& ( 2.0D0, 0.0D0),& ( 1.0D0, 0.0D0),& (-1.0D0, 0.0D0),& (-2.0D0, 0.0D0),& (-3.0D0, 0.0D0)/

INTEGER CLAVE ! Clave de error de la subrutina NewtonINTEGER UNIDAD ! Número de unidad para archivos de salidaINTEGER I,J

DOUBLE COMPLEX Z0,RAIZ ! Aproximación inicial y soluciónDOUBLE PRECISION X0,Y0 ! Parte real e imaginaria de la aprox. inicialREAL R ! Número al azar entre 0 y 1

6

Page 7: Creando fractales con el método de Newton

CHARACTER(7) ARCHIVOCHARACTER(2) NUMSTRINGLOGICAL SEGUIR

* -------------------------------------------------------------------* Crear archivos de salida para cada una de las raíces* -------------------------------------------------------------------

DO J=1,NROOTSUNIDAD = 10+JWRITE(NUMSTRING,’(I2.2)’) JARCHIVO = ’raiz-’ // NUMSTRINGOPEN(UNIDAD,FILE=ARCHIVO)

ENDDO* -------------------------------------------------------------------* Proceder* -------------------------------------------------------------------

CALL RANDOM_SEED() ! Inicializar semilla

DO I = 1,NPOINTS* ----------------------------------------------------------------* Construir una aproximación inicial compleja dentro del* del cuadrado [-A:A][-A:A]* ----------------------------------------------------------------

CALL RANDOM_NUMBER(R)X0 = DBLE(-A+2.0*A*R)CALL RANDOM_NUMBER(R)Y0 = DBLE(-A+2.0*A*R)Z0 = COMPLEX(X0,Y0)

* ----------------------------------------------------------------* Resolver la ecuación con el método de Newton con tal aproximación* ----------------------------------------------------------------

CLAVE = 0CALL NEWTON(ROOTS,NROOTS,Z0,NMAX,TOL,RAIZ,CLAVE)

* ----------------------------------------------------------------* Imprimir la condición inicial en el archivo correspondiente* según la raíz obtenida* ----------------------------------------------------------------

IF (CLAVE.EQ.0) THENJ = 1SEGUIR = .TRUE.DO WHILE(SEGUIR.AND.J.LE.NROOTS)

IF (ABS(RAIZ-ROOTS(J)).LE.TOL) THENUNIDAD = 10 + JWRITE (UNIDAD,*) X0, Y0SEGUIR = .FALSE.

ENDIFJ = J + 1

ENDDOENDIF

END DO* ----------------------------------------------------------------* Cerrar archivos de salida y terminar* ----------------------------------------------------------------

DO J=1,NROOTSUNIDAD = 10+JCLOSE(UNIDAD)

END DOSTOP

7

Page 8: Creando fractales con el método de Newton

END

SUBROUTINE NEWTON(ROOTS,NROOTS,XX0,NMAX,TOL,RAIZ,ICLAVE)* ---------------------------------------------------* METODO DE NEWTON-RAPHSON para encontrar la* solución de f(x)=(x -x1)...(x-xN) = 0 dadas los* N ceros de la ecuación a la cual conduce la* aproximación inicial.* ---------------------------------------------------* Bloque de identificación de argumentos* ---------------------------------------------------* NROOTS = Número de raices (arg entrada)* ROOTS(NROOTS) = Vector de raíces (arg entrada)* XX0 = Aproximación inicial (arg entrada)* NMAX = Número máximo de iteraciones (arg entrada)* TOL = Tolerancia del error relativo (arg entrada)* RAIZ = Estimación de la solución (arg salida)* ICLAVE = Clave de éxito (arg salida)* 0 = éxito* 1 = iteraciones excedidas* ---------------------------------------------------* Bloque de declaración de tipo* ---------------------------------------------------

IMPLICIT NONEINTEGER NROOTS,NMAX,ICLAVEDOUBLE COMPLEX ROOTS(NROOTS)DOUBLE COMPLEX XX0,RAIZDOUBLE PRECISION TOL

* ---------------------------------------------------INTEGER I,JDOUBLE COMPLEX X0,SUMA

* ---------------------------------------------------* Bloque de procesamiento* ---------------------------------------------------

ICLAVE = 0X0 = XX0DO I=1,NMAX

SUMA = (0.0D0,0.0D0)DO J = 1,NROOTS

SUMA = SUMA + (1.0D0,0.0D0)/(X0 - ROOTS(J))ENDDORAIZ = X0 - (1.0D0,0.0D0)/SUMAIF (ABS((RAIZ-X0)/RAIZ).LT.TOL) RETURNX0 = RAIZ

END DOICLAVE = 1RETURNEND

* ---------------------------------------------------

8

Page 9: Creando fractales con el método de Newton

-3

-2

-1

0

1

2

3

-3 -2 -1 0 1 2 3

Figura 3. Distribución en el plano complejo de las aproximacionesiniciales z0 para la ecuación (z − 3)(z − 2)(z − 1)(z + 1)(z + 2)(z +3) = 0 según la convergencia por el método de Newton a la raízcorrespondiente ( 3 en rojo, 2 en verde, 1 en azul, −1 en magenta,−2 cian, −3 amarillo.)

9