We start from the linearized state-equations of the passively mode-locked laser ref1
In [1]:
import sympy as sym
sym.init_printing(use_latex='mathjax')
Pst, gst, EsatL, dqPdEP = sym.symbols("P_{st} g_{st} E_{satL} q'_P")
TR, tauL, etaP, Toc, PP0 = sym.symbols('T_R tau_L eta_P T_{oc} P_{P0}')
alpha, beta, gamma, epsilon = sym.symbols('alpha beta gamma epsilon')
w0 = sym.symbols('omega_0')
Pst_ = sym.Eq(Pst, -EsatL / tauL + etaP * PP0 / gst)
x = sym.MatrixSymbol('x', 2, 1)
xdot = sym.MatrixSymbol('xdot', 2, 1)
y = sym.MatrixSymbol('y', 1, 1)
u = sym.MatrixSymbol('u', 1, 1)
A = sym.Matrix([[-Pst * dqPdEP, Pst / TR],
[-gst / EsatL, -1 / tauL - Pst / EsatL]])
B = sym.Matrix([[0], [etaP / EsatL]])
C = sym.Matrix([[Toc, 0]])
sym.Eq(xdot, A * x + B * u)
Out[1]:
In [2]:
sym.Eq(y, C * x)
Out[2]:
where $\vec{x} = \left[ \delta P, \delta g \right]^T$, $\vec u = \left[\delta P_P \right]$, and $\vec y = \left[ \delta P_{out} \right]$.
Now, we rewrite this in new state variables $\vec x' = \left[ \delta \dot{P} / \omega_0, \delta P \right]$, with
$\omega_0 = \sqrt{ \frac{P_{st} g_{st}}{T_R E_{satL}} + P_{st} q'_P \left( 1 / \tau_L + P_{st} / E_{satL} \right)}$.
From the state equation above, we immediately see the transformation matrix $M$:
In [3]:
M = sym.Matrix([[-Pst * dqPdEP / w0, Pst / TR / w0],
[1, 0]])
w0_ = sym.Eq(w0, sym.sqrt(-A[0, 1] * A[1, 0] + A[0, 0] * A[1, 1]))
xp = sym.MatrixSymbol("x'", 2, 1)
sym.simplify(sym.Eq(xp, M * x))
Out[3]:
The transformed state equation is:
$ \begin{align*} \dot{x'} &= M A M^{-1} x' + M B u \\ y &= C \cdot x = C M^{-1} x' \end{align*}$
In [4]:
M = M.subs(w0_.lhs, w0_.rhs)
Bp = M * B
Ap = M * A * M**-1
sym.Eq(sym.MatrixSymbol("A'", 2, 2), sym.simplify(Ap))
Out[4]:
In [5]:
sym.Eq(sym.MatrixSymbol("B'", 2, 1), sym.simplify(Bp))
Out[5]:
We recognize that the off-diagonal elements of $A$ are $\omega_0$ and $-\omega_0$. Furthermore, we define
$ \begin{align*} \zeta &= \frac{1}{2 \omega_0} \left(1 / \tau_L + P_{st} \cdot \left(q'_P + 1 / E_{satL} \right) \right) \\ \rho &= \frac{P_{st} \eta_P}{E_{satL} T_R \omega_0^2} \end{align*} $
In [6]:
zeta = sym.Symbol('zeta', real=True)
zeta_ = sym.Eq(zeta, (1 / tauL + Pst * (dqPdEP + 1 / EsatL)) / 2 / w0)
rho = sym.Symbol('rho', real=True)
rho_ = sym.Eq(rho, Pst * etaP / (EsatL * TR * w0) / w0)
Bpn = sym.Matrix(Bp)
Apn = sym.Matrix(Ap)
Bpn[0, 0] = Bp[0, 0] / (w0_.lhs / w0_.rhs) * rho_.lhs / rho_.rhs
Apn[0, 0] = Ap[0, 0] * zeta_.lhs / zeta_.rhs
Apn[0, 1] = Ap[0, 1] * w0_.lhs / w0_.rhs
Apn[1, 0] = Ap[1, 0] * w0_.lhs / w0_.rhs
sym.Eq(sym.MatrixSymbol("x'dot", 2, 1), sym.simplify(Apn * xp + Bpn * u))
Out[6]:
Looking at the eigenvalues (see below), we see that the system
Of course, this analysis is only true if $\omega_0$ is real.
In [7]:
Apn.eigenvals()
Out[7]:
Now, we apply a unit-step to the input of the system and determine where the output will stabilize. To do that, we have to solve the following equation:
In [8]:
eq = sym.Eq(sym.Matrix([[0], [0]]), Apn * xp + Bpn)
sym.simplify(eq)
Out[8]:
From the resulting $x'$ we obtain for the steady-state $y$ response:
In [9]:
sym.simplify(C * M**-1 * -Apn**-1 * Bpn)[0]
Out[9]:
The DC-response to small pump-power changes is the slope efficiency.
In [10]:
sym.simplify((Toc * rho_.rhs).subs([(w0_.lhs, w0_.rhs),
(Pst_.lhs, Pst_.rhs)]))
Out[10]:
For $q'_P = 0$ (no saturable absorber), this simplifies to $\eta_P \cdot \frac{T_{oc}}{g_{st}}$, i.e. the slope efficiency depends only on the pump-absorption efficiency and the ratio of output coupling to total losses.