Anar al contingut

Atractor de Lorenz

De L'Enciclopèdia, la wikipedia en valencià
Archiu:A Trajectory Through Phase Space in a Lorenz Attractor.gif
Atractor de Lorenz
Archiu:Lorenz attractor yb.svg
El atractor de Lorenz, en valors b = 28, a = 10, c = 8/3
Archiu:LorenzAttractor.png
Proyecció d'un atractor de Lorenz tridimensional

El atractor de Lorenz és un concepte introduït per Edward Lorenz en 1963. Es tracta d'un sistema dinàmic determinista tridimensional no llineal derivat de les equacions simplificades de rolls de convecció que es produïxen en les equacions dinàmiques de l'atmòsfera terrestre.

Per a certs valors dels paràmetros a, b, c, el sistema exhibix un comportament caòtic i mostra lo que actualment es diu un atractor estrany; açò va ser provat per Warwick Tucker en 2002.[1] El atractor estrany en este cas és un fractal de dimensió de Hausdorff entre 2 i 3. Grassberger (1983) ha estimat la dimensió de Hausdorff en 2,06 ± 0,01 i la dimensió de correlació en 2,05 ± 0,01.

El sistema apareix en làserés, en generadors elèctrics i en determinades rodes d'aigua.[2]

dxdt=a(yx)
dydt=x(bz)y
dzdt=xycz

a on a és cridat el número de Prandtl i b es diu el número de Rayleigh.

a,b,c>0, pero és usualment a=10, c=8/3 i b és variat. El sistema exhibix un comportament caòtic per a b=28 pero mostra òrbites periòdiques per a atres valors de b; per eixemple, en b=99,96 es convertix en un nuc tórico cridat T(3;2).

La forma de palometa del atractor de Lorenz pot haver inspirat el nom del efecte palometa en la teoria del caos.

Anàlisis

[editar | editar còdic]
Archiu:Lorenz atractor julia glmakie.gif
Simulació feta en Julia.

Simulació en Julia

[editar | editar còdic]
using GLMakie

Base.kwdef mutable struct Lorenz
    dt::Float64 = 0.01
    σ::Float64 = 10
    ρ::Float64 = 28
    β::Float64 = 8/3
    x::Float64 = 1
    i::Float64 = 1
    z::Float64 = 1
end

function step!(l::Lorenz)
    dx = l.σ * (l.i - l.x)
    dy = l.x * (l.ρ - l.z) - l.i
    dz = l.x * l.i - l.β * l.z
    l.x += l.dt * dx
    l.i += l.dt * dy
    l.z += l.dt * dz
    Point3f(l.x, l.i, l.z)
end

attractor = Lorenz()

points = Point3f[]
colors = Int[]

set_theme!(theme_black())

fig, ax, l = lines(points, color = colors,
    colormap = :inferno, transparency = true,
    axis = (;type = Axis3, 
            protrusions = (0, 0, 0, 0),
            viewmode = :fit, 
            limits = (-30, 30, -30, 30, 0, 50)))

record(fig, "lorenz.gif", 1:120) do frame
    for i in 1:50
        push!(points, step!(attractor))
        push!(colors, frame)
    end
    ax.azimuth[] = 1.7pi + 0.3 * sense(2pi * frame / 120)
    Makie.update!(l, arg1 = points, color = colors)
    l.colorrange = (0, frame)
end

Simulació en MATLAB

[editar | editar còdic]
% Resoldre per a l'interval de temps [0,100] en condicions inicials [1,1,1]
% ''f'' és un conjunt d'equacions diferencials
% ''a'' és un apany que conté variables x, i, z
% ''t'' és la variable de temps

sigma = 10;
beta = 8/3;
rho = 28;
f = (t,a) [-sigmaa(1) + sigmaa(2); rhoa(1) - a(2) - a(1)a(3); -betaa(3) + a(1)a(2)];
[t,a] = ode45(f,[0 100],[1 1 1]);     % Solució de EDO de Runge-Kutta de 4.º/5.º orde
plot3(a(:,1),a(:,2),a(:,3))

Simulació en Python

[editar | editar còdic]
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from mpl_toolkits.mplot3d import Axes3D

rho = 28.0
sigma = 10.0
beta = 8.0 / 3.0

def f(state, t):
    x, i, z = state  # Desempaqueta el vector d'estat
    return sigma * (i - x), x * (rho - z) - i, x * i - beta * z  # Derivades

state0 = [1.0, 1.0, 1.0]
t = np.arange(0.0, 40.0, 0.01)

states = odeint(f, state0, t)

fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot(states[:, 0], states[:, 1], states[:, 2])
plt.show()
Simulació del Sistema de Lorenz en R
Simulació en R

Simulació en R

[editar | editar còdic]
library(deSolve)
library(plotly)
# paràmetros:
#  en el text:   a                     b c

prm <-  list(   sigma = 10, rho = 28, beta = 8/3   ) 
# valors inicials
varini <- c(
  X = 1,
  I = 1, 
  Z = 1
)

Lorenz <- function (t, vars, prm) {
  with(as.list(vars), {
    dX <- prm&#36;sigma*(I - X)
    dY <- X*(prm&#36;rho - Z) - I
    dZ <- XI - prm&#36;beta*Z
    return(list(c(dX, dY, dZ)))
   })
}

claves <- seq(from = 0, to = 100, by = 0.01)
# cridat del resolvedor d'equacions diferencials ordinàries (ode)
out <- ode(i = varini, claves = claves, func = Lorenz,
           parms = prm)

# per a assignar-li color als punts:
gfill <- function (repArr, long) {
  rep(repArr, ceiling(long/length(repArr)))[1:long]
}

dout <- as.data.frame(out)

dout&#36;color <- gfill(rainbow(10), nrow(dout))

# Producció de la gràfica en Plotly:
plot_ly(
  data=dout, x = X, i = I, z = Z,
  type = 'scatter3d', mode = 'lines',
  opacity = 1, line = list(width = 6, color = color, reverscale = FALSE)
)

Vore també

[editar | editar còdic]

Referències

[editar | editar còdic]

Bibliografia

[editar | editar còdic]
  • Lorenz, E. N.(1963).J. Atmos. Sci..20 p. 130-141
  • Frøyland, J., Alfsen, K. H.(1984).Phys. Rev. A.29 p. 2928–2931
  • Strogatz, Steven H. (1994). Perseus publishing (ed.). Nonlinear Systems and Chaos.
  • Jonas Bergman, Knots in the Lorentz system, Undergraduate thesis, Uppsala University 2004.
  • A Rigorous ODE Solver and Smale's 14th Problem” (2002). Foundations of Computational Mathematics 2 (1): 53–117. doi:10.1007/s002080010018.


Referències

[editar | editar còdic]