diff --git a/gwinc/suspension.py b/gwinc/suspension.py
index 93015f1f926955452dfb20b3b7785af216e83934..424f7483629452b8acdc5bc8983b56ac0979fd35 100644
--- a/gwinc/suspension.py
+++ b/gwinc/suspension.py
@@ -15,16 +15,34 @@ FIBER_TYPES = [
 ]
 
 
-# quad pendulum equation of motion matrix A =
-# [[k0+k1-m0*w**2,           -k1,             0,          0],
-#  [          -k1, k1+k2-m1*w**2,           -k2,          0],
-#  [            0,           -k2, k2+k3-m2*w**2,        -k3],
-#  [            0,             0,           -k3, k3-m3*w**2]])
-# diagonal elements: mass and restoring forces
-# off-diagonal: coupling to stages above and below
-# want TM equations of motion, so index 4
-# b = [[0], [0], [0], [1]]
-# sympy.linsolve((A, b), x) yields the following two functions
+def generate_symbolic_tfs(stages=4):
+    import sympy as sp
+
+    # construct quad pendulum equation of motion matrix
+    ksyms = sp.numbered_symbols('k')
+    msyms = sp.numbered_symbols('m')
+    w = sp.symbols('w')
+    k = [next(ksyms) for n in range(stages)]
+    m = [next(msyms) for n in range(stages)]
+    A = sp.zeros(stages)
+    for n in range(stages-1):
+        # mass and restoring forces (diagonal elements)
+        A[n, n] = k[n] + k[n+1] - m[n] * w**2
+        # couplings to stages above and below
+        A[n, n+1] = -k[n+1]
+        A[n+1, n] = -k[n+1]
+    # mass and restoring force of bottom stage
+    A[-1, -1] = k[-1] - m[-1] * w**2
+
+    # want TM equations of motion, so index 4
+    b = sp.zeros(stages, 1)
+    b[-1] = 1
+
+    # solve linear system
+    xsyms = sp.numbered_symbols('x')
+    x = [next(xsyms) for n in range(stages)]
+    ans = sp.linsolve((A, b), x)
+    return ans
 
 
 def tst_force_to_tst_displ(k, m, f):
@@ -37,6 +55,7 @@ def tst_force_to_tst_displ(k, m, f):
     X3 = (k2**2*(k0 + k1 - m0*w**2) + (k1**2 - (k0 + k1 - m0*w**2)*(k1 + k2 - m1*w**2))*(k2 + k3 - m2*w**2))/(-k3**2*(k1**2 - (k0 + k1 - m0*w**2)*(k1 + k2 - m1*w**2)) + (k3 - m3*w**2)*(k2**2*(k0 + k1 - m0*w**2) - (-k1**2 + (k0 + k1 - m0*w**2)*(k1 + k2 - m1*w**2))*(k2 + k3 - m2*w**2)))
     return X3
 
+
 def top_displ_to_tst_displ(k, m, f):
     """transfer function for quad pendulum