Skip to content

Instantly share code, notes, and snippets.

@samclane
Created April 18, 2023 13:38
Show Gist options
  • Save samclane/ab9873a06b6c7388fd60f6ba8b1a7a29 to your computer and use it in GitHub Desktop.
Save samclane/ab9873a06b6c7388fd60f6ba8b1a7a29 to your computer and use it in GitHub Desktop.
Simple gui for visualizing the lorenz attractor
import tkinter as tk
from tkinter import ttk
import numpy as np
from scipy.integrate import solve_ivp
# Lorenz system equations
def lorenz_system(t, xyz, sigma, rho, beta):
x, y, z = xyz
return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]
# Update and draw the Lorenz Attractor
def draw_lorenz_attractor(*args):
global lorenz_points
canvas.delete("all")
sigma = float(sigma_var.get())
rho = float(rho_var.get())
beta = float(beta_var.get())
sol = solve_ivp(lorenz_system, (0, 50), [1, 1, 1], args=(sigma, rho, beta), t_eval=np.linspace(0, 50, 10000))
lorenz_points = sol.y.T
for i in range(1, len(lorenz_points)):
x1, y1, _ = lorenz_points[i - 1]
x2, y2, _ = lorenz_points[i]
canvas.create_line(250 + 10 * x1, 250 + 10 * y1, 250 + 10 * x2, 250 + 10 * y2, fill="blue")
# Debounce updates to the Lorenz Attractor
def schedule_draw_lorenz_attractor(*args):
global debounce_id
if debounce_id:
root.after_cancel(debounce_id)
debounce_id = root.after(200, draw_lorenz_attractor)
# Create the main window
root = tk.Tk()
root.title("Lorenz Attractor Visualizer")
# Create the adjustable parameter panel
parameter_frame = ttk.Frame(root)
parameter_frame.grid(row=0, column=0, padx=10, pady=10)
sigma_var = tk.DoubleVar(value=10.0)
rho_var = tk.DoubleVar(value=28.0)
beta_var = tk.DoubleVar(value=8/3)
# Create the canvas to draw the Lorenz Attractor
canvas = tk.Canvas(root, width=500, height=500, bg="white")
canvas.grid(row=0, column=1, padx=10, pady=10)
debounce_id = None
ttk.Label(parameter_frame, text="Sigma:").grid(row=0, column=0)
sigma_slider = ttk.Scale(parameter_frame, from_=0.1, to=50, variable=sigma_var, command=schedule_draw_lorenz_attractor)
sigma_slider.grid(row=0, column=1)
sigma_slider.set(sigma_var.get())
sigma_label = ttk.Label(parameter_frame, textvariable=sigma_var)
sigma_label.grid(row=0, column=2)
ttk.Label(parameter_frame, text="Rho:").grid(row=1, column=0)
rho_slider = ttk.Scale(parameter_frame, from_=0.1, to=50, variable=rho_var, command=schedule_draw_lorenz_attractor)
rho_slider.grid(row=1, column=1)
rho_slider.set(rho_var.get())
rho_label = ttk.Label(parameter_frame, textvariable=rho_var)
rho_label.grid(row=1, column=2)
ttk.Label(parameter_frame, text="Beta:").grid(row=2, column=0)
beta_slider = ttk.Scale(parameter_frame, from_=0.1, to=10, variable=beta_var, command=schedule_draw_lorenz_attractor)
beta_slider.grid(row=2, column=1)
beta_slider.set(beta_var.get())
beta_label = ttk.Label(parameter_frame, textvariable=beta_var)
beta_label.grid(row=2, column=2)
# Draw the initial Lorenz Attractor
draw_lorenz_attractor()
# Run the main loop
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment