71 lines
2 KiB
Python
71 lines
2 KiB
Python
|
"""Usage:
|
||
|
```
|
||
|
plot_trajectory(100, 3.6, 0.1)
|
||
|
plot_bifurcation(2.5, 4.2, 0.001)
|
||
|
```
|
||
|
"""
|
||
|
import numpy as np
|
||
|
from matplotlib import pyplot as plt
|
||
|
|
||
|
from logistic import iterate_f
|
||
|
|
||
|
|
||
|
def plot_trajectory(n, r, x0, fname="single_trajectory.png"):
|
||
|
"""
|
||
|
Saves a plot of a single trajectory of the logistic function
|
||
|
|
||
|
inputs
|
||
|
n: int (number of iterations)
|
||
|
r: float (r value for the logistic function)
|
||
|
x0: float (between 0 and 1, starting point for the iteration)
|
||
|
fname: str (filename to which to save the image)
|
||
|
|
||
|
returns
|
||
|
fig, ax (matplotlib objects)
|
||
|
"""
|
||
|
xs = iterate_f(n, x0, r)
|
||
|
fig, ax = plt.subplots(figsize=(10, 5))
|
||
|
ax.plot(list(range(n)), xs)
|
||
|
fig.suptitle('Logistic Function')
|
||
|
|
||
|
fig.savefig(fname)
|
||
|
return fig, ax
|
||
|
|
||
|
|
||
|
def plot_bifurcation(start, end, step, fname="bifurcation.png", it=100000,
|
||
|
last=300):
|
||
|
"""
|
||
|
Saves a plot of the bifurcation diagram of the logistic function. The
|
||
|
`start`, `end`, and `step` parameters define for which r values to
|
||
|
calculate the logistic function. If you space them too closely, it might
|
||
|
take a very long time, if you dont plot enough, your bifurcation diagram
|
||
|
won't be informative. Choose wisely!
|
||
|
|
||
|
inputs
|
||
|
start, end, step: float (which r values to calculate the logistic
|
||
|
function for)
|
||
|
fname: str (filename to which to save the image)
|
||
|
it: int (how many iterations to run for each r value)
|
||
|
last: int (how many of the last iterates to plot)
|
||
|
|
||
|
|
||
|
returns
|
||
|
fig, ax (matplotlib objects)
|
||
|
"""
|
||
|
r_range = np.arange(start, end, step)
|
||
|
x = []
|
||
|
y = []
|
||
|
|
||
|
for r in r_range:
|
||
|
xs = iterate_f(it, 0.1, r)
|
||
|
all_xs = xs[len(xs) - last::].copy()
|
||
|
unique_xs = np.unique(all_xs)
|
||
|
y.extend(unique_xs)
|
||
|
x.extend(np.ones(len(unique_xs)) * r)
|
||
|
|
||
|
fig, ax = plt.subplots(figsize=(20, 10))
|
||
|
ax.scatter(x, y, s=0.1, color='k')
|
||
|
ax.set_xlabel("r")
|
||
|
fig.savefig(fname)
|
||
|
return fig, ax
|