En física y matemáticas , el mapa de Ikeda es un sistema dinámico de tiempo discreto dado por el mapa complejo
El mapa original fue propuesto por primera vez por Kensuke Ikeda como un modelo de luz que circula a través de un resonador óptico no lineal ( cavidad anular que contiene un medio dieléctrico no lineal ) en una forma más general. Ikeda, Daido y Akimoto lo redujeron a la forma "normal" simplificada anterior [1] [2] representa el campo eléctrico dentro del resonador en el paso n-ésimo de rotación en el resonador, y y son parámetros que indican la luz láser aplicada desde el exterior y la fase lineal a través del resonador, respectivamente. En particular, el parámetro se llama parámetro de disipación que caracteriza la pérdida del resonador y, en el límite del mapa de Ikeda, se convierte en un mapa conservador.
El mapa original de Ikeda se utiliza a menudo en otra forma modificada para tener en cuenta el efecto de saturación del medio dieléctrico no lineal:
Un ejemplo real 2D de la forma anterior es: donde u es un parámetro y
Porque este sistema tiene un atractor caótico .
Esta animación muestra cómo cambia el atractor del sistema a medida que el parámetro varía de 0,0 a 1,0 en pasos de 0,01. El sistema dinámico de Ikeda se simula durante 500 pasos, a partir de 20 000 puntos de inicio colocados aleatoriamente. Los últimos 20 puntos de cada trayectoria se representan gráficamente para representar el atractor . Nótese la bifurcación de los puntos atractores a medida que aumenta.
Los gráficos que se muestran a continuación muestran trayectorias de 200 puntos aleatorios para distintos valores de . El gráfico insertado a la izquierda muestra una estimación del atractor, mientras que el gráfico insertado a la derecha muestra una vista ampliada del gráfico de trayectoria principal.
El código Octave/MATLAB para generar estos gráficos se proporciona a continuación:
% u = parámetro ikeda % opción = qué graficar % 'trajectory' - grafica la trayectoria de puntos de inicio aleatorios % 'limit' - grafica las últimas iteraciones de puntos de inicio aleatorios function ikeda ( u, option ) P = 200 ; % cuántos puntos de inicio N = 1000 ; % cuántas iteraciones Nlimit = 20 ; % grafica estos últimos puntos para la opción 'limit' x = randn ( 1 , P ) * 10 ; % los puntos de inicio aleatorios y = randn ( 1 , P ) * 10 ; para n = 1 : P , X = calculate_ikeda_trajectory ( u , x ( n ), y ( n ), N ); cambiar opción case 'trajectory' % grafica las trayectorias de un grupo de puntos plot_ikeda_trajectory ( X ); esperar ; caso 'limit' plot_limit ( X , Nlimit ) ; mantener ; de lo contrario disp ( 'No implementado' ); fin fin eje apretado ; eje igual texto ( - 25 , - 15 , [ 'u = ' num2str ( u )]); texto ( - 25 , - 18 , [ 'N = ' num2str ( N ) ' iteraciones' ]); fin % Graficar los últimos n puntos de la curva - para ver el punto final o la función límite del ciclo plot_limit ( X, n ) plot ( X ( end - n : end , 1 ), X ( end - n : end , 2 ), 'ko' ); end % Trazar la función de trayectoria completa plot_ikeda_trajectory ( X ) plot ( X (:, 1 ), X (:, 2 ), 'k' ); % mantener; plot(X(1,1), X(1,2), 'bo', 'markerfacecolor', 'g'); mantener al final % u es el parámetro ikeda % x,y es el punto de partida % N es el número de iteraciones función [X] = calculate_ikeda_trajectory ( u, x, y, N ) X = zeros ( N , 2 ); X ( 1 , :) = [ x y ]; para n = 2 : N t = 0.4 - 6 / ( 1 + x ^ 2 + y ^ 2 ); x1 = 1 + u * ( x * cos ( t ) - y * sin ( t )); y1 = u * ( x * sin ( t ) + y * cos ( t )); x = x1 ; y = y1 ; X ( n , :) = [ x y ]; fin fin
importar matemáticasimportar matplotlib.pyplot como plt importar numpy como npdef main ( u : float , points = 200 , iterations = 1000 , nlim = 20 , limit = False , title = True ): """ Args: u:float parámetro ikeda points:int número de puntos de partida iterations:int número de iteraciones nlim:int grafica estos últimos puntos para la opción 'limit'. Graficará todos los puntos si se establece en cero limit:bool graficará las últimas iteraciones de puntos de partida aleatorios si es Verdadero. De lo contrario, Graficará trayectorias. title:[str, NoneType] mostrará el nombre del gráfico si el valor es afirmativo """ x = 10 * np . random . randn ( puntos , 1 ) y = 10 * np . random . randn ( puntos , 1 ) para n en el rango ( puntos ): X = calculate_ikeda_trajectory ( u , x [ n ][ 0 ], y [ n ][ 0 ], iteraciones ) si límite : plot_limit ( X , nlim ) tx , ty = 2.5 , - 1.8 de lo contrario : plot_ikeda_trajectory ( X ) tx , ty = - 30 , - 26 plt . título ( f "Mapa de Ikeda ( { u =: .2g } , { iteraciones =} )" ) si título de lo contrario Ninguno devolver pltdef calculate_ikeda_trajectory ( u : float , x : float , y : float , N : int ): """Calcular una trayectoria completa Args: u - es el parámetro ikeda x, y - coordenadas del punto de partida N - el número de iteraciones Devuelve: Una matriz. """ X = np . ceros (( N , 2 )) para n en el rango ( N ): X [ n ] = np . array (( x , y )) t = 0,4 - 6 / ( 1 + x ** 2 + y ** 2 ) x1 = 1 + u * ( x * math . cos ( t ) - y * math . sen ( t )) y1 = u * ( x * math . sen ( t ) + y * math . cos ( t )) x = x1 y = y1 devolver Xdef plot_limit ( X , n : int ) -> None : """ Grafica los últimos n puntos de la curva - para ver el punto final o el ciclo límite Args: X: np.array trayectoria de un punto de inicio asociado n: int número de "últimos" puntos a graficar """ plt . plot ( X [ - n :, 0 ], X [ - n :, 1 ], 'ko' )def plot_ikeda_trajectory ( X ) -> None : """ Traza la trayectoria completa Args: X: np.array trayectoria de un punto de inicio asociado """ plt . plot ( X [:, 0 ], X [:, 1 ], "k" )si __name__ == "__main__" : main ( 0.9 , limit = True , nlim = 0 ) .show ( )