[docs]defrational_disc_fit(ZPKrep,order=None,order_max=None,order_min=20,aid=None,):nyquist_final_Hz=Noneifnyquist_final_HzisnotNoneandnyquist_final_Hz<=0:raiseRuntimeError("nyquist_final_Hz must be positive for Z domain or None"" for Sf domain.")iforderisnotNone:order=int(order)order_max=int(order_max)order_min=int(order_min)N_first=order_minN_final=int(min(len(ZPKrep.F_Hz)//10,order_max))iforderisnotNone:returnratdisc_single(ZPKrep,order=order,aid=aid,)# otherwise, scan throughN_current=N_firstfitter_last=ratdisc_single(ZPKrep,order=N_current,aid=aid,)restot_last=fitter_last.residuals_averagedeffitter_ord(fitter):returnmax(len(fitter.zeros),len(fitter.poles))whileTrue:ifN_current==N_final:fitter_use=fitter_lastbreakN_current=N_current*2ifN_current>N_final:N_current=N_finalfitter=ratdisc_single(ZPKrep,order=N_current,aid=aid,)restot=fitter.residuals_averagefitter_red=fitter.copy()fitter_red.matched_pairs_clear(Q_rank_cutoff=0.2)restot_red=fitter_red.residuals_averageifrestot_last<restot:fitter_use=fitter_lastaid.log("Using last (direct)!",fitter_ord(fitter_last))breakifrestot_last<restot_red:fitter_use=fitter_lastaid.log("Using last (reduced)!",fitter_ord(fitter_last))breakifrestot_last<1.10*restot:ord_red=fitter_ord(fitter_red)ord_last=fitter_ord(fitter_last)iford_red<ord_last:fitter_use=fitter_redelse:fitter_use=fitter_lastaid.log("Using current")break# else continue the loopfitter_last=fitterrestot_last=restotfitter=fitter_useifnyquist_final_Hz=="keep":# this means to not perform the nyquist shift,# only really used in testingpasselifnyquist_final_HzisNoneornyquist_final_Hz==0:ZPKrep=nyquist_move.nyquist_remove(fitter,split_neg_real=True,clear_neg_real=True,aid=aid,)fitter=ChebychevFilter(ZPKrep=ZPKrep,)elifnyquist_final_Hz>0:fitter=nyquist_move.nyquist_move(fitter,nyquist_new=nyquist_final_Hz,split_neg_real=True,clear_neg_real=True,aid=aid,)else:raiseRuntimeError(("Nyquist cannot be negative. "" Positive for Z-domain, None or 0 for S."' or "keep" to maintain the maxdata nyquist'))returnfitter
[docs]defratdisc_single(ZPKrep,order=20,relative_degree=0,nyquist_final_Hz=None,aid=None,):ifnyquist_final_HzisnotNoneandnyquist_final_Hz<=0:raiseRuntimeError("nyquist_final_Hz must be >0 or None")F_nyquist_Hz=1*ZPKrep.F_Hz[-1]fitter=RationalDiscFilter(ZPKrep=ZPKrep,npoles=order,nzeros=order,F_nyquist_Hz=F_nyquist_Hz,)fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_SVD()fitter.fit_poles()fitter.fit_zeros()fitter.matched_pairs_clear(Q_rank_cutoff=0.5)fitter.stabilize=True# fitter.npoles = len(fitter.poles)# fitter.nzeros = len(fitter.zeros)##fitter.stabilize = Truefitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.fit_SVD()fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.matched_pairs_clear(Q_rank_cutoff=0.5)fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()fitter.fit_poles()fitter.fit_zeros()returnfitter