desde pylab import * import subprocess import sys import osfigformat = '.png' seterr ( dividir = 'ignorar' ) rcParams [ 'font.size' ] = 9#define un mapa de color que sea transparente para valores bajos y azul oscuro para valores altos. # ponderado para mostrar probabilidades bajas bien cdic = { 'rojo' : [( 0 , 0 , 0 ), ( 1 , 0 , 0 )], 'verde' : [( 0 , 0 , 0 ), ( 1 , 0 , 0 )], 'azul' : [( 0 , 0,7 , 0,7 ), ( 1 , 0,7 , 0,7)], 'alfa' : [( 0 , 0 , 0 ), ( 0,1 , 0,4 , 0,4 ), ( 0,2 , 0,6 , 0,6 ), ( 0,4 , 0,8 , 0,8 ), ( 0,6 , 0,9 , 0,9 ), ( 1 , 1 , 1 )]} cm_prob = matplotlib . colores . LinearSegmentedColormap ( 'problema' ,cdic , N = 640 )### Sistemas dinámicos #### potencial es un polinomio potencial_coefs = matriz ([ 1 , 0 , 0 , 4 , - 5 , - 4 , 0 ], 'd' ) def potencial ( x , t ): return polyval ( potencial_coefs , x )# función de fuerza es su derivada. force_coefs = ( potencial_coefs * arange ( len ( potencial_coefs ) - 1 , - 1 , - 1 )) [: - 1 ] def fuerza ( x , t ): "" "derivada de potencial (x)" "" return polyval ( fuerza_coefs , x ) invmass = 1.0 dt = 0.03def motion ( t , x , p ): "" "devuelve dx / dt, dp / dt" "" return p * invmass , - force ( x , t )cur_x = - 0.1 cur_p = 0def rkky_step ( t , x_i , p_i , dt ): kx1 , kp1 = movimiento ( t , x_i , p_i ) dt2 = 0.5 * dt kx2 , kp2 = movimiento ( t + dt2 , x_i + dt2 * kx1 , p_i + dt2 * kp1 ) kx3 , kp3 = movimiento (t + dt2 , x_i + dt2 * kx2 , p_i + dt2 * kp2 ) kx4 , kp4 = movimiento ( t + dt , x_i + dt * kx3 , p_i + dt * kp3 ) newx = x_i + ( dt / 6.0 ) * ( kx1 + 2.0 * kx2 + 2.0 *kx3 + kx4 ) newp = p_i + ( dt / 6.0 ) * ( kp1 + 2.0 * kp2 + 2.0 * kp3 + kp4 ) return newx , newp### Configurar puntos de conjunto #### la mayoría se eligen al azar x = 0 + 0.5 * rand ( 20000 ) p = - 1.0 + 2.0 * rand ( 20000 )# los puntos piloto se configuran manualmente x [ 0 ] = 0 ; p [ 0 ] = 0 x [ 1 ] = 0,4 ; p [ 1 ] = 0.0 pilotos = [ 0 , 1 ] pilot_colors = { 0 : ( 0 , 0.7 , 0 ), 1 : ( 0.7 , 0 , 0 )} E = potencial ( x , 0 ) + 0.5 * invmass * p ** 2### configurar límites de trazado y contenedores de histograma ### xedges = linspace ( - 2.1 , 1.7 , 151 ) pedges = linspace ( - 7.5 , 7.5 , 151 ) Eedges = linspace ( - 9 , 9 , 151 ) pix = 150 extensión = [ xedges [ 0 ], xedges [ - 1 ], pedges [ -1 ], pedges [ 0 ]] H = histogram2d ( x , p , bins = [ xedges , pedges ]) [ 0 ] . transponer () cmax = amax ( H ) * 0.8extenten = [ xedges [ 0 ], xedges [ - 1 ], Eedges [ - 1 ], Eedges [ 0 ]] Hen = histogram2d ( x , E , bins = [ xedges , Eedges ]) [ 0 ] . transpose () cmaxen = amax ( Hen ) * 0.3fig = figura ( 1 ) ysize = 2.6 xsize = 1.3 fig . set_size_inches ( tamaño x , tamaño y )### Preparar la gráfica inferior ### axen = axes (( 0.2 / xsize , 0.2 / ysize , 1.0 / xsize , 1.0 / ysize ), frameon = True ) axen . xaxis . set_ticks ([]) eje . xaxis . labelpad = 2 ejes . yaxis . set_ticks ([]) eje . yaxis . labelpad = 2xlim ( - 2.1 , 1.7 ) ylim ( - 9 , 9 ) xlabel ( 'posición $ x $' ) ylabel ( 'energía' ) potx = linspace ( - 2.1 , 1.7 , 151 )### Preparar el gráfico superior ### ax = axes (( 0.2 / xsize , 1.5 / ysize , 1.0 / xsize , 1.0 / ysize ), frameon = True ) ax . xaxis . set_ticks ([]) ax . xaxis . labelpad = 2 ax . yaxis . set_ticks ([]) ax . yaxis . labelpad = 2 xlim( - 2.1 , 1.7 ) ylim ( - 7.5 , 7.5 ) xlabel ( 'posición $ x $' ) ylabel ( 'impulso $ p $' )### Comienza a ejecutar la simulación ### frames = list () delays = list () framemod = 5 frame = "frames / background" + figformat savefig ( frame , dpi = pix ) frames . añadir retrasos ( fotogramas ) . añadir ( 16 )imprimir "generando marcos ... 0%" , sys . stdout . flush () saveteps = rango ( 0 , 401 , framemod ) + [ 600 , 1000 , 2000 , 6000 ] retrasos + = [ 10 ] * len ( saveteps ) retrasos [ 1 ] = 200 retrasos [ - 5 :] = [ 100, 200 , 200 , 200 , 400 ] totalsteps = max ( saveteps ) + 1 para el paso en el rango ( totalsteps ): if step % 20 == 0 : print " \ b \ b \ b \ b \ b {0: 3} % " . formato ( int ( round ( paso * 100.0 / totalsteps ))), sys . stdout .flush () si paso en los pasos guardados : # Cada varios fotogramas, haz un trazado remlist = list () sca ( ax ) H = histogram2d ( x , p , bins = [ xedges , pedges ]) [ 0 ] . transpose () remlist . append ( imshow ( H , extensión = extensión , cmap = cm_prob , interpolación = 'ninguno' , aspecto = 'auto' )) lista de rem [ - 1 ]. set_clim ( 0 , cmax ) para i en pilotos : remlist + = plot ( x [ i ], p [ i ], '.' , color = pilot_colors [ i ], markersize = 3 ) E = potencial ( x , paso * dt ) + 0.5 * invmass * p ** 2 sca ( axen ) pot = potencial ( potx , step * dt ) remlist + = plot ( potx , pot , color = 'r' , zorder = 0 ) Gallina = histograma2d ( x , E, bins = [ xedges , Eedges ]) [ 0 ] . transpose () remlist . append ( imshow ( Hen , extensión = extenten , cmap = cm_prob , interpolación = 'ninguno' , aspecto = 'auto' , zorder = 1 )) remlist [ - 1 ] . set_clim ( 0 , cmaxen ) para i en pilotos : remlist + = plot ( x [ i ], E [ i ], '.' , color = pilot_colors [ i ], markersize = 3 ) frame = "frames / frame" + str ( paso ) + figformat savefig ( frame , dpi = pix ) frames . append ( frame ) # Limpiar las cosas actualizadas. para r en remlist : r . remove () x , p = rkky_step ( paso * dt , x , p , dt ) print "\ b \ b \ b \ b \ b hecho "afirmar ( len ( retrasos ) == len ( fotogramas ))### Ensamblar animación usando ImageMagick ### calllist = 'convertir -dispose Background' . split () para retraso , marco en zip ( retrasos , marcos ): lista de llamadas + = [ '-delay' , str ( demora )] lista de llamadas + = [ marco ] lista de llamadas + = '-loop 0 -layers Optimizar _animation.gif' . split () f = open ( 'anim_command.txt' , 'w' )f . escribir ( '' . join (lista de llamadas ) + ' \ n ' ) f . cerrar ()imprimir "componiendo en gif animado ..." , sys . stdout . subproceso flush () . llamar (lista de llamadas ) imprimir "hecho" os . renombrar ( '_animation.gif' , 'animation.gif' )