Lorenz seltsamer Attraktor
Winfried@sunkiddance.de
02.06.2013
Herleitung
Der Lorenz-Attraktor wird durch ein System gewöhnlicher, nichtlinearer Differentialgleichungen definiert. Es beschreibt ein sehr vereinfachtes atmospärisches Konvektionsmodell: Von “unten” wird permanent Wärme zugeführt, von “oben” wird permanent gekühlt. Die Differentialgleichungen beschreiben nun die Positionsänderung Δ(x,y,z) eines Luftpunktes (dimensionslos) (x,y,z) in der Atmosphäre als Funktion der Zeit t. Je nach Temparaturdifferenz zwischen “unten” und “oben” und den gewählten Parametern entstehen unterschiedliche Luftwirbel oder auch stationäre Zustände. Der evolvierende Zustand des Systems ist sehr sensitiv bzgl. der Wahl des Anfangszustands: selbst eine winzige Abweichung in der Ausgangsposition kann zu gänzlich unterschiedlichem Systemverhalten führen. Das ist der berühmt-berüchtigte “Schmetterlingseffekt”.
Die Parameter, die zu “chaotischem” Verhalten führen sind die oben gewählten Werte von σ, ρ und β.
Die Startposition im dreimdimensionalen Raum, im sogenannten Phasenraum, wird durch xLorenz, yLorenz und zLorenz definiert.
Visualisierung
Wie sieht das Ergebnis mit den genannten Parametern und der Startposition aus?
Jeder Punkt auf diesen Bahnen ist eine Lösung des Differentialgleichungssystems.
Schmetterlingseffekt
Wir variieren den Startpunkt um Δ = 1/1000.
Die Trajektorien sind klar verändert, wenn auch die prinzipielle Struktur erhalten bleibt.
Daten mit R berechnet
Hier ist der Code, der den Lorenz-Attraktor mit R berechnet. Der Code benötigt das R-Paket “deSolve”. Der Code dieses Pakets ist der selbe, der in Los Alamos bei der Entwicklung der Atombombe beim Manhattan-Projekt verwendet wurde. Irgendwie gruselig...
Lorenz<-function(t, state, parameters)
{
with(as.list(c(state, parameters)),
{
# rate of change
dX <- lorenz.sigma*(lorenz.Y-lorenz.X)
dY <- lorenz.X*(lorenz.rho-lorenz.Z)-lorenz.Y
dZ <- lorenz.X*lorenz.Y-lorenz.beta*lorenz.Z
# return the rate of change
list(c(dX, dY, dZ))
}
) # end with(as.list...
}
## main
require(deSolve)
lorenz.parameters <- c(lorenz.sigma = 10, lorenz.rho =28, lorenz.beta = 8/3)
lorenz.state <- c(lorenz.X = 3, lorenz.Y = 15, lorenz.Z =1)
lorenz.times <-seq(0,100,by=0.01)
lorenz.time.elapsed <- system.time(lorenz.out <- as.data.frame(ode(y=lorenz.state,times=lorenz.times,func=Lorenz,
parms=lorenz.parameters, method = "rk4")))
# write file for display with gnuplot
lorenz.xyz <- data.frame(lorenz.out$lorenz.X, lorenz.out$lorenz.Y, lorenz.out$lorenz.Z)
names(lorenz.out) <- (c("t", "X", "Y", "Z"))
write.table(lorenz.out, file = "c:\\lorenz.out", row.names = F, col.names = F, sep =",")
cat("Time elapsed:", lorenz.time.elapsed, "\n")
Wir lesen die Daten ein und wir visualisieren das Ergebnis.
Anmerkungen
1 Die Angaben entstammen alle dem Wikipedia-Artikel zum Lorenz-Attraktor oder einer dort verlinkten Quelle.
Letzte Änderung: 05.06.2013