From 8c4236217ccbce3d1fb1259c11966de98c989cd2 Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 29 Aug 2023 12:00:50 +0300 Subject: [PATCH 1/6] ex1 solution --- logistic.py | 3 +++ test_logistic.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/logistic.py b/logistic.py index e49d1c2..ebaa7d1 100644 --- a/logistic.py +++ b/logistic.py @@ -1 +1,4 @@ # Your code goes here +def f(x,r): + return r*x*(1-x) + \ No newline at end of file diff --git a/test_logistic.py b/test_logistic.py index 9391bee..f6bf3d0 100644 --- a/test_logistic.py +++ b/test_logistic.py @@ -4,6 +4,16 @@ # Add here your test for the logistic map +def test_f_general(): + cases = [ + (0.1, 2.2, 0.198), + (0.2, 3.4, 0.544), + (0.5, 2, 0.5), + ] + for x, r, expected in cases: + result = f(x, r) + assert_allclose(result, expected) + def test_f_corner_cases(): # Test cases are (x, r, expected) From e0f1bdd991b371583268e32ed19336e0d725250c Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 29 Aug 2023 12:27:31 +0300 Subject: [PATCH 2/6] parametrize --- test_logistic.py | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/test_logistic.py b/test_logistic.py index f6bf3d0..0608d04 100644 --- a/test_logistic.py +++ b/test_logistic.py @@ -1,26 +1,32 @@ from numpy.testing import assert_allclose - from logistic import f - +import pytest +from math import isclose # Add here your test for the logistic map -def test_f_general(): - cases = [ - (0.1, 2.2, 0.198), - (0.2, 3.4, 0.544), - (0.5, 2, 0.5), - ] - for x, r, expected in cases: - result = f(x, r) - assert_allclose(result, expected) +# def test_f_general(): +# cases = [ +# (0.1, 2.2, 0.198), +# (0.2, 3.4, 0.544), +# (0.5, 2, 0.5), +# ] +# for x, r, expected in cases: +# result = f(x, r) +# assert_allclose(result, expected) + + +# 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_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) +@pytest.mark.parametrize('x,r,expected',[(0.1,2.2,0.198),(0.2,3.4,0.544),(0.5,2,0.5),(0,1.1,0),(1,3.7,0)]) +def test_f(x,r,expected): + result = f(x,r) + assert isclose(result,expected) \ No newline at end of file From ab5a495199bd5fa81e96039aa67d325a323ee864 Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 29 Aug 2023 12:59:10 +0300 Subject: [PATCH 3/6] plotting function --- logistic.py | 15 ++++++++++++++- plot_logistic.py | 17 ++++++++++++++--- single_trajectory.png | Bin 0 -> 20700 bytes test_logistic.py | 17 ++++++++++++----- 4 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 single_trajectory.png diff --git a/logistic.py b/logistic.py index ebaa7d1..6983207 100644 --- a/logistic.py +++ b/logistic.py @@ -1,4 +1,17 @@ # Your code goes here def f(x,r): return r*x*(1-x) - \ No newline at end of file + +def iterate_f(x0,r,it): + iteration_timecourse = [] + + iteration_timecourse.append(x0) + + x = f(x0,r) + iteration_timecourse.append(x) + + for i in range(it-1): + x = f(x,r) + iteration_timecourse.append(x) + + return iteration_timecourse \ No newline at end of file diff --git a/plot_logistic.py b/plot_logistic.py index 6227b5f..03bd185 100644 --- a/plot_logistic.py +++ b/plot_logistic.py @@ -10,7 +10,7 @@ from logistic import iterate_f -def plot_trajectory(n, r, x0, fname="single_trajectory.png"): +def plot_trajectory(x0,r,n, fname="single_trajectory.png"): """ Saves a plot of a single trajectory of the logistic function @@ -23,9 +23,9 @@ def plot_trajectory(n, r, x0, fname="single_trajectory.png"): returns fig, ax (matplotlib objects) """ - xs = iterate_f(n, x0, r) + xs = iterate_f(x0, r, n) fig, ax = plt.subplots(figsize=(10, 5)) - ax.plot(list(range(n)), xs) + ax.plot(list(range(n+1)), xs) fig.suptitle('Logistic Function') fig.savefig(fname) @@ -68,3 +68,14 @@ def plot_bifurcation(start, end, step, fname="bifurcation.png", it=100000, ax.set_xlabel("r") fig.savefig(fname) return fig, ax + + + + + +x0=0.1 +r=1.5 +n=20 + +plot_trajectory(x0, r, n) + \ No newline at end of file diff --git a/single_trajectory.png b/single_trajectory.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4a274e9370a386d5f1371207c75f848a1af41b GIT binary patch literal 20700 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%0A~s6)dh}yO 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 Date: Tue, 29 Aug 2023 14:46:42 +0300 Subject: [PATCH 4/6] added test for logistic fit --- logistic_fit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logistic_fit.py b/logistic_fit.py index 1d38ac7..55ee1f0 100644 --- a/logistic_fit.py +++ b/logistic_fit.py @@ -24,7 +24,7 @@ def fit_r(xs): it = len(xs) - 1 def error(r): - return np.linalg.norm(xs - iterate_f(it, x0, r)) + return np.linalg.norm(xs - iterate_f(x0, r, it)) errors = [] for r in np.linspace(0, 4, 4001): From 90111e4dcc338c90becb9ec17c87bffa1195f6e6 Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 29 Aug 2023 15:13:07 +0300 Subject: [PATCH 5/6] add test for convergence of iterate_f --- test_logistic.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/test_logistic.py b/test_logistic.py index 811e305..84fd6f5 100644 --- a/test_logistic.py +++ b/test_logistic.py @@ -2,6 +2,9 @@ from logistic import f, iterate_f import pytest from math import isclose +import numpy as np + +SEED = 42 # Add here your test for the logistic map # def test_f_general(): @@ -33,7 +36,20 @@ -@pytest.mark.parametrize('x,r,it,expected',[(0.1,2.2,1,[0.1,0.198]),(0.2,3.4,4,[0.2,0.544,0.843418,0.449019,0.841163]),(0.5,2,3,[0.5,0.5,0.5,0.5])]) -def test_iterate_f(x,r,it,expected): - result = iterate_f(x,r,it) - assert_allclose(result,expected,atol=0.001) \ No newline at end of file +# @pytest.mark.parametrize('x,r,it,expected',[(0.1,2.2,1,[0.1,0.198]),(0.2,3.4,4,[0.2,0.544,0.843418,0.449019,0.841163]),(0.5,2,3,[0.5,0.5,0.5,0.5])]) +# def test_iterate_f(x,r,it,expected): +# result = iterate_f(x,r,it) +# assert_allclose(result,expected,atol=0.001) + +def test_random_starting_point_convergence(): + random_state = np.random.RandomState(SEED) + r = 1.5 + n = 100 + it = 30 + n_convergence_datapoints = 10 + for _ in range(n): + x0 = random_state.uniform(0.0001, 0.9999) + xs = iterate_f(x0,r,it) + for i in range(1, n_convergence_datapoints+1): + assert np.isclose(xs[-i], 1/3, atol=0.001) + \ No newline at end of file From 4d4aab7b6541a73d10349cda398f8555842053e6 Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 29 Aug 2023 15:35:09 +0300 Subject: [PATCH 6/6] random fixture --- test_logistic.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/test_logistic.py b/test_logistic.py index 84fd6f5..1904ede 100644 --- a/test_logistic.py +++ b/test_logistic.py @@ -4,7 +4,7 @@ from math import isclose import numpy as np -SEED = 42 +SEED = np.random.randint(0, 2**31) # Add here your test for the logistic map # def test_f_general(): @@ -41,12 +41,17 @@ # result = iterate_f(x,r,it) # assert_allclose(result,expected,atol=0.001) -def test_random_starting_point_convergence(): +@pytest.fixture +def random_state(): + print(f'\nUsing Seed: {SEED}') random_state = np.random.RandomState(SEED) + return random_state + +def test_random_starting_point_convergence(random_state): r = 1.5 n = 100 it = 30 - n_convergence_datapoints = 10 + n_convergence_datapoints = 3 for _ in range(n): x0 = random_state.uniform(0.0001, 0.9999) xs = iterate_f(x0,r,it)