33 lines
737 B
Python
33 lines
737 B
Python
|
import numpy as np
|
||
|
|
||
|
from logistic import iterate_f
|
||
|
|
||
|
|
||
|
def fit_r(xs):
|
||
|
""" Takes a population trajectory and returns the value of r that generated it.
|
||
|
|
||
|
By far not the most efficient method, but it always finds the optimal value of r with 1/1000
|
||
|
precision.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
xs : list of float
|
||
|
A population trajectory.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
r: float
|
||
|
The value of r that generated the population trajectory.
|
||
|
"""
|
||
|
xs = np.asarray(xs)
|
||
|
x0 = xs[0]
|
||
|
it = len(xs) - 1
|
||
|
|
||
|
def error(r):
|
||
|
return np.linalg.norm(xs - iterate_f(it, x0, r))
|
||
|
|
||
|
errors = []
|
||
|
for r in np.linspace(0, 4, 4001):
|
||
|
errors.append((r, error(r)))
|
||
|
return min(errors, key=lambda x: x[1])[0]
|