Created
April 18, 2023 13:38
-
-
Save samclane/ab9873a06b6c7388fd60f6ba8b1a7a29 to your computer and use it in GitHub Desktop.
Simple gui for visualizing the lorenz attractor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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