I am currently using the wrapper odeintw for scipy.integrate.odeint to solve my equations since they are complex-valued.
At the moment, I have 3 coupled first-order differential equations with 2 independent variables
\begin{align} \frac{\partial C}{\partial t} &= \frac{i}{a}(AB - cd) - \frac{C}{t_1}\\ \frac{\partial A}{\partial t} &= \frac{2ib^2}{a}cC - \frac{A}{t_2}\\ \frac{\partial B}{\partial t} &= ied + f \end{align}
Where the capital letters A, B, and C are my functions; the lower case letters a, b, c, t1, t2, and d are simply parameters; z and t are my independent variables. I've been able to solve the first two equations by simply making B equal to a constant (i.e. neglecting the 3rd equation) and inputting certain initial conditions/parameter values. The code is shown below and provides the real and imaginary part of the solutions separately (note: some of the variable names are different, but the equations are equivalent):
from odeintw import odeintw
import numpy as np
import matplotlib.pyplot as plt
def Wfunc(W, t, hbar, Pm, Em, Ep, T1, T2, d):
N, Pp = W
return [(1j/hbar)*(Pp*Ep - Em*Pm) - N/T1,
(2j*(d**2)/hbar)*Em*N - Pp/T2]
W0 = np.array([1+2j, 3+4j])
t = np.linspace(0, 5, 1001)
hbar = 1.
Pm = 4 - 2j
Em = 2.5
Ep = 10.
T1 = 100.
T2 = 10
d = 0.1
W, infodict = odeintw(Wfunc, W0, t, args=(hbar, Pm, Em, Ep, T1, T2, d),
full_output=True)
plt.figure(1)
plt.clf()
color1 = (0.5, 0.4, 0.3)
color2 = (0.2, 0.2, 1.0)
plt.plot(t, W[:, 0].real, color=color1, label='N.real', linewidth=1.5)
plt.plot(t, W[:, 0].imag, '--', color=color1, label='N.imag', linewidth=2)
plt.plot(t, W[:, 1].real, color=color2, label='Pp.real', linewidth=1.5)
plt.plot(t, W[:, 1].imag, '--', color=color2, label='Pp.imag', linewidth=2)
plt.xlabel('t')
plt.grid(True)
plt.legend(loc='best')
plt.show()
This works as intended for the 2 equations with same independent variable, but now I want to introduce my other independent variable, z, and am running into a bit of difficulty. Are there any efficient ways to solve these 3 equations simultaneously? Extending the code for cases involving large intervals over the independent variables and more complex differential equations would be of interest.