import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy.integrate import odeint
# Discretise x for plotting nullclines
x_vec=np.linspace(0.01,6,100)
# COmpute quantities needed for pahse plane
def ComputeBrusselatorSol(a,b,x_vec):
t = np.linspace(0, 10, 1000)
# Define different ICs
init_cond1=[0.75,0.75]
init_cond2=[4.55,4.15]
init_cond3=[2.5,0.5]
# steady state
ss=[a,b/a]
# Integrate ODEs
alpha=2.0
sol1 = odeint(rhs_bruss_model, init_cond1,t)
sol2 = odeint(rhs_bruss_model, init_cond2,t)
sol3 = odeint(rhs_bruss_model, init_cond3,t)
# Compute nullclines
x_ncline=(1+b)/x_vec-a/x_vec**2
y_ncline_1_a=[0,0]
y_ncline_1_b=[0,5]
y_ncline_2_x=b/x_vec
return sol1,sol2,sol3,ss,x_ncline,y_ncline_1_a,y_ncline_1_b,y_ncline_2_x
# Compute quantitied
a=1.0
b=3.2
sol1,sol2,sol3,ss,x_ncline,y_ncline_1_a,y_ncline_1_b,y_ncline_2_x=ComputeBrusselatorSol(a,b,x_vec)
# PLot results
fig, ax = plt.subplots(1,2)
ax[0].plot(x_vec,x_ncline,'k--')
ax[0].plot(y_ncline_1_a,y_ncline_1_b,'k--')
ax[0].plot(x_vec,y_ncline_2_x,'r--')
ax[0].plot(sol1[:,0],sol1[:,1],sol2[:,0],sol2[:,1],sol3[:,0],sol3[:,1])
ax[0].plot(ss[0],ss[1],'k*')
ax[0].set_xlabel('$x$')
ax[0].set_ylabel('$y$')
ax[0].set_xlim([-0.05,6])
ax[0].set_ylim([-0.005,6])
# Try different parameters
a=4.0
b=3.2
# Recompute quantities
sol1,sol2,sol3,ss,x_ncline,y_ncline_1_a,y_ncline_1_b,y_ncline_2_x=ComputeBrusselatorSol(a,b,x_vec)
# PLot results
ax[1].plot(x_vec,x_ncline,'k--')
ax[1].plot(y_ncline_1_a,y_ncline_1_b,'k--')
ax[1].plot(x_vec,y_ncline_2_x,'r--')
ax[1].plot(sol1[:,0],sol1[:,1],sol2[:,0],sol2[:,1],sol3[:,0],sol3[:,1])
ax[1].plot(ss[0],ss[1],'k*')
ax[1].set_xlabel('$x$')
ax[1].set_ylabel('$y$')
ax[1].set_xlim([-0.05,6])
ax[1].set_ylim([-0.005,6])
plt.tight_layout()
plt.grid()
plt.show()