Помимо несоответствий, упомянутых в комментариях, вы можете обойти внутренний предел шага, либо уменьшив временной шаг, либо увеличив
mxstep
параметр. В то же время вы должны подумать, достаточны ли для ваших целей допуски по умолчанию около 1e-6
или если вам нужна более высокая точность,
Conc= odeint(BR,L0,t, atol=1e-7, rtol=1e-11, mxstep=5000)
Восстанавливая порядок увеличения букв, назначение реагентов должно быть
A: HOI, B: I-, C: H+, D: I2, E: H2O
и то же самое, что и в вашем коде. Химические уравнения:
A + B + C <--> E + F, ->: k1 = 3.1e12, <-: k2 = 2.2
B + C + F --> 2A k3 = 5e9
B + 2C + G --> A + F k4 = 1.4e3
2F --> A + C + G k5 = 3e9
C + F + G -- 2F + 0.5H k6 = 2.6e5
D + I --> B + C + J k7 = 3.494
A + K --> B + C + E + H k8 = 2e3
Это должно привести к функции
def BR(L,t):
A,B,C,D,E,F,G,H,I,J,K = L
H1 = k1*A*B*C
H2 = k2*D*E
H3 = k3*B*C*F
H4 = k4*B*C**2*F
H5 = k5*F**2
H6 = k6*C*F*G
H7 = k7*D*I
H8 = k8*A*K
dAdt = -H1 + H2 + 2*H3 + H4 + H5 - H8
dBdt = -H1 + H2 -H3 - H4 + H7 + H8
dCdt = -H1 + H2 - H3 -2*H4 + H5 - H6 + H7 + H8
dDdt = H1 - H2 + H7
dEdt = H1 - H2 + H8
dFdt = -H3 + H4 - (2*H5) + H6
dGdt = -H4 + H5 + H6
dHdt = 0.5*H6 + H8
dIdt = -H7 #[CH2(COOH)2] se porablja
dJdt = H7 #[CHI(COOH)2]nastaja
dKdt = -H8 #[H2O2] nastaja
return(dAdt,dBdt,dCdt,dDdt,dEdt,dFdt,dGdt,dHdt,dIdt,dJdt,dKdt)
L0 = [ 8e-11, 1e-10, 0.056, 8e-8, 1, 9e-11, 0.01, 2.5e3, 0.0015, 0, 0.33 ]
t = np.arange(0,2000,1)
Conc= odeint(BR,L0,t)
names = [ '[HOI]', '[I-]', '[H+]', '[I2]', '[H2O]', '[HOIO]', '[IO3-]', '[O2]','[CH2(COOH)2]','[CHI(COOH)2]','[H2O2]']
plt.subplots_adjust(hspace=0.4,wspace=0.55)
for k, name in enumerate(names):
plt.subplot(6,2,k+1);
plt.plot(t,Conc[:,k])
plt.title(name)
plt.show()
(начальные значения от http://www.math.udel.edu/~rossi/Math512/2003/br5.pdf), дающие результаты