diff --git a/logistic.py b/logistic.py index e49d1c2..94d9ed2 100644 --- a/logistic.py +++ b/logistic.py @@ -1 +1,10 @@ # Your code goes here +def f(x,r): + return r*x*(1-x) + +def iterate_f(it,x,r): + results = [x] + for _ in range(it): + x = f(x, r) + results.append(x) + return results diff --git a/test_logistic.py b/test_logistic.py index 9391bee..be96279 100644 --- a/test_logistic.py +++ b/test_logistic.py @@ -1,16 +1,47 @@ from numpy.testing import assert_allclose - +import pytest from logistic import f +from logistic import iterate_f +import numpy as np + +# set the random seed for once here +SEED = np.random.randint(0, 2**31) +@pytest.fixture +def random_state(): + print(f'Using seed {SEED}') + random_state = np.random.RandomState(SEED) + return random_state # Add here your test for the logistic map +@pytest.mark.parametrize('x,r,expected', [(0, 1.1, 0), + (1, 3.7, 0),]) +def test_f_corner_cases(x,r,expected): + result = f(x, r) + assert_allclose(result, expected) + +@pytest.mark.parametrize('x,r,expected', [(0.1, 2.2, 0.198), + (0.2, 3.4, 0.544), + (0.5, 2, 0.5)]) +def test_f_generic_cases(x,r,expected): + result = f(x, r) + assert_allclose(result, expected) + + +@pytest.mark.parametrize('it, x, r, expected', [ + (1, 0.1, 2.2, [0.1, 0.198]), + (4, 0.2, 3.4, [0.2, 0.544, 0.843418, 0.449019, 0.841163]), + (3, 0.5, 2, [0.5, 0.5, 0.5, 0.5]), +]) +def test_iterate_f(it,x,r,expected): + result = iterate_f(it, x, r) + assert_allclose(result, expected, atol=0.00001) + -def test_f_corner_cases(): - # Test cases are (x, r, expected) - cases = [ - (0, 1.1, 0), - (1, 3.7, 0), - ] - for x, r, expected in cases: - result = f(x, r) - assert_allclose(result, expected) +def test_iterate_f_random(random_state): + for _ in range(100): + x0 = random_state.uniform(0.0001, 0.9999) + r= 1.5 + xs = iterate_f(it=1000, x=x0, r=r) + expected= 1/3 + assert_allclose(xs[-1], expected, atol=1e-6) \ No newline at end of file diff --git a/test_logistic_fit.py b/test_logistic_fit.py new file mode 100644 index 0000000..789567e --- /dev/null +++ b/test_logistic_fit.py @@ -0,0 +1,17 @@ +import math +import pytest + +from logistic import iterate_f +from logistic_fit import fit_r + + +@pytest.mark.parametrize("x0, r, it", [ + (0.3, 3.421, 23), + (0.1, 3.421, 23), + (0.3, 1.0, 23), + (0.3, 3.421, 5), +]) +def test_logistic_fit_recover_r(x0, r, it): + trajectory = iterate_f(it, x0, r) + fitted_r = fit_r(trajectory) + assert math.isclose(fitted_r, r)