from sympy import (symbols, sqrt, cos, exp, sin, pi, re, im,
    Matrix, Plane, Polygon, I, log)
from spb import *
from bokeh.models.formatters import PrintfTickFormatter
import panel as pn
import param
formatter = PrintfTickFormatter(format="%.3f")
kp, t, xi, o = symbols("k_P, tau, xi, omega")
G = kp / (I**2 * t**2 * o**2 + 2 * xi * t * o * I + 1)
mod = lambda x: 20 * log(sqrt(re(x)**2 + im(x)**2), 10)
plot(
    (mod(G.subs(xi, 0)), (o, 0.1, 100), "G(xi=0)", {"line_dash": "dotted"}),
    (mod(G.subs(xi, 1)), (o, 0.1, 100), "G(xi=1)", {"line_dash": "dotted"}),
    (mod(G), (o, 0.1, 100), "G"),
    params = {
        kp: (1, 0, 3),
        t: param.Number(default=1, bounds=(0, 3), label="Time constant"),
        xi: pn.widgets.FloatSlider(value=0.2, start=0, end=1,
            step=0.005, format=formatter, name="Damping ratio")
    },
    backend = BB,
    n = 2000,
    xscale = "log",
    xlabel = "Frequency, omega, [rad/s]",
    ylabel = "Magnitude [dB]",
)