-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3D_lorenz_eq_plot.py
38 lines (31 loc) · 1001 Bytes
/
3D_lorenz_eq_plot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import numpy as np
import matplotlib.pyplot as plt
def lorenz_rhs(u, *, sigma, rho, beta):
x, y, z = u
x_dot = sigma * (y - x)
y_dot = x * (rho - z) - y
z_dot = x * y - beta * z
u_dot = np.array([x_dot, y_dot, z_dot])
return u_dot
class LorenzStepperRK4:
def __init__(self, dt=0.01, *, sigma=10, rho=28, beta=8/3):
self.dt = dt
self.sigma = sigma
self.rho = rho
self.beta = beta
def __call__(self, u_prev):
lorenz_rhs_fixed = lambda u: lorenz_rhs(
u,
sigma=self.sigma,
rho=self.rho,
beta=self.beta,
)
k_1 = lorenz_rhs_fixed(u_prev)
k_2 = lorenz_rhs_fixed(u_prev + 0.5 * self.dt * k_1)
k_3 = lorenz_rhs_fixed(u_prev + 0.5 * self.dt * k_2)
k_4 = lorenz_rhs_fixed(u_prev + self.dt * k_3)
u_next = u_prev + self.dt * (k_1 + 2*k_2 + 2*k_3 + k_4)/6
return u_next
lorenz_stepper = LorenzStepperRK4()
u_0 = np.ones(3)
u_0