import skrf
import numpy as np
import matplotlib.pyplot as mplt

"""
Explanation: Ex1: Ring Slot
The Vector Fitting feature is demonstrated using the ring slot example network from the scikit-rf data folder. Additional explanations and background information can be found in the Vector Fitting tutorial.
End of explanation
"""


nw = skrf.data.ring_slot
vf = skrf.VectorFitting(nw)

"""
Explanation: To create a VectorFitting instance, a Network containing the frequency responses of the N-port is passed. In this example the ring slot is used, which can be loaded directly as a Network from scikit-rf:
End of explanation
"""


vf.vector_fit(n_poles_real=3, n_poles_cmplx=0)

"""
Explanation: Now, the vector fit can be performed. The number of poles has to be specified, which depends on the behaviour of the responses. A smooth response would only require very few poles (2-5). In this case, 3 real poles are sufficient:
End of explanation
"""


vf.plot_convergence()

"""
Explanation: As printed in the logging output (not shown), the pole relocation process converged quickly after just 5 iteration steps. This can also be checked with the convergence plot:
End of explanation
"""


vf.get_rms_error()

"""
Explanation: The fitted model parameters are now stored in the class attributes poles, residues, proportional_coeff and constant_coeff for further use. To verify the result, the model response can be compared to the original network response. One option is to analyze the rms error magnitude, which should be smaller than 0.05 for a good fit:
End of explanation
"""


freqs1 = np.linspace(0, 200e9, 201)
fig, ax = mplt.subplots(2, 2)
fig.set_size_inches(12, 8)
vf.plot_s_mag(0, 0, freqs1, ax=ax[0][0]) # plot s11
vf.plot_s_mag(1, 0, freqs1, ax=ax[1][0]) # plot s21
vf.plot_s_mag(0, 1, freqs1, ax=ax[0][1]) # plot s12
vf.plot_s_mag(1, 1, freqs1, ax=ax[1][1]) # plot s22
fig.tight_layout()
mplt.show()

"""
Explanation: As the model will return a response at any given frequency, it makes sense to also manually check its response outside the frequency range of the original samples by plotting it at lower and higher frequencies:
End of explanation
"""


