# Estimate SVD magnitude # svLiEstNom_mag = FreqTrans.Sigma(I2 + LoEstNom) svLoEstNom_mag = 1 / FreqTrans.Sigma(SoEstNom) # sigma(I + Lo) = 1 / sigma(So) svLoEstNomMin_mag = np.min(svLoEstNom_mag, axis=0) svLoEstUnc_mag = FreqTrans.Sigma(LoEstUnc) # Uncertain SVD magnitude svLoEstUncMax_mag = np.max(svLoEstUnc_mag, axis=0) # Overly Conservative cohLoEst_mag = LoEstCoh cohLoEstMin = np.min(cohLoEst_mag, axis = (0, 1)) # Estimation Coherence if True: fig = 1 fig = FreqTrans.PlotSigma(freqLin_hz, svLoLinNomMin_mag, np.ones_like(freqLin_hz), svLoLinUncMax_mag, fig = fig, color = 'k', label = 'Linear') fig = FreqTrans.PlotSigma(freq_hz[0], svLoEstNomMin_mag, cohLoEstMin, svLoEstUncMax_mag, marker='.', color = 'b', fig = fig, label = 'Estimate (MIMO)') fig = FreqTrans.PlotSigma(freqLin_hz, (0.4) * np.ones_like(freqLin_hz), linestyle = '--', color = 'r', fig = fig, label = 'Critical Limit') ax = fig.get_axes() handles, labels = ax[0].get_legend_handles_labels() handles = [handles[0], handles[3], handles[1], handles[4], handles[2]] labels = [labels[0], labels[3], labels[1], labels[4], labels[2]] ax[0].legend(handles, labels) fig.suptitle('$L_o$ : ' + '$r_{Exc}$' + ' to ' + '$z$') #%% Vector Margin Plots - Output Stability vmLoLinNom_mag, vmLoLinUnc_mag, vmLoLinMin_mag = FreqTrans.VectorMargin(LoLinNom, LoLinUnc, typeUnc = 'circle') vmLoEstNom_mag, vmLoEstUnc_mag, vmLoEstMin_mag = FreqTrans.VectorMargin(LoEstNom, LoEstUnc, typeUnc = 'circle')
svLaEstNom_mag = 1 / FreqTrans.Sigma(SaEstNom) # sv(I + La) = 1 / sv(Sa) svLaEstNomMin_mag = np.min(svLaEstNom_mag, axis=0) svLaEstUnc_mag = FreqTrans.Sigma(LaEstUnc) svLaEstUncMax_mag = np.max(svLaEstUnc_mag, axis=0) svLaEstLower_mag = svLaEstNomMin_mag - svLaEstUncMax_mag LaEstCohMin = np.min(np.min(SaEstCoh, axis=0), axis=0) if False: fig = 20 # fig = FreqTrans.PlotSigma(freqLin_hz, svLaLinNom_mag, coher_nd = np.ones_like(freqLin_hz), fig = fig, color = 'k', label = 'Linear') # fig = FreqTrans.PlotSigma(freqLin_hz, svLaLinNomMin_mag, svUnc_mag = svLaEstUncMax_mag, coher_nd = np.ones_like(freqLin_hz), fig = fig, color = 'k', label = 'Linear') fig = FreqTrans.PlotSigma(freqLin_hz, svLaLinNomMin_mag, coher_nd=np.ones_like(freqLin_hz), fig=fig, color='k', label='Linear') # fig = FreqTrans.PlotSigma(freq_hz, svLaEstNom_mag, coher_nd = LaEstCohMin, color = 'b', fig = fig, label = 'Estimation (MIMO)') fig = FreqTrans.PlotSigma(freq_hz[0], svLaEstNomMin_mag, svUnc_mag=svLaEstLower_mag, coher_nd=LaEstCohMin, color='b', fig=fig, label='Estimation with Uncertainty') # fig = FreqTrans.PlotSigma(freqLin_hz, 0.4 * np.ones_like(freqLin_hz), color = 'r', linestyle = '--', fig = fig, label = 'Critical Limit') ax = fig.get_axes() ax[0].set_xlim(0, 10) # ax[0].set_yscale('log') ax[0].set_ylim(0, 2)
svTEstUncMax_mag = np.max(svTEstUnc_mag, axis=0) # Overly Conservative cohTEst_mag = TEstCoh # Estimation Coherence cohTEstMin = np.min(cohTEst_mag, axis = (0, 1)) # Sampled Systems svTEstSamp_mag = np.zeros((numOut, nFreq, nSamp), dtype='float') for iSamp in range(nSamp): svTEstSamp_mag[..., iSamp] = FreqTrans.Sigma(TEstSamp[..., iSamp]) svTEstSampMin_mag = np.min(svTEstSamp_mag, axis = 0) if True: fig = 10 fig = FreqTrans.PlotSigma(freqLin_hz, svTLinNomMin_mag, svUnc_mag = svTLinUncMax_mag, coher_nd = cohTLinMin, fig = fig, color = 'k', label = 'Linear') fig = FreqTrans.PlotSigma(freq_hz[0], svTEstNomMin_mag, svUnc_mag = svTEstUncMax_mag, coher_nd = cohTEstMin, marker='.', color = 'r', fig = fig, label = 'Estimate (MIMO)') for iSamp in range(nSamp): fig = FreqTrans.PlotSigma(freq_hz[0], svTEstSampMin_mag[..., iSamp], svUnc_mag = None, coher_nd = None, marker='.', color = 'gray', linestyle='None', fig = fig, label = 'Sampled (MIMO)') ax = fig.get_axes() handles, labels = ax[0].get_legend_handles_labels() handles = [handles[0], handles[2], handles[1], handles[3]] labels = [labels[0], labels[2], labels[1], labels[3]] ax[0].legend(handles, labels) #%% Vector Margin Plots vmTLinNom_mag, vmTLinUnc_mag, vmTLinMin_mag = FreqTrans.VectorMargin(TLinNom, TLinUnc, typeUnc = 'circle') vmTEstNom_mag, vmTEstUnc_mag, vmTEstMin_mag = FreqTrans.VectorMargin(TEstNom, TEstUnc, typeUnc = 'circle')
20 * np.log10(P_N_mag)) fig.suptitle(oDataSegs[iSeg]['Desc'] + ': Spectrogram Null - ' + sigFbList[iSgnlOut]) #%% Sigma Plot fig = None for iSeg in range(0, len(oDataSegs)): Cmin = np.min(np.min(C[iSeg], axis=0), axis=0) sNomMin = np.min(sNom[iSeg], axis=0) sCritMin = np.min(sUnc[iSeg], axis=0) sNomMinErr = sNomMin - sCritMin fig = FreqTrans.PlotSigma(freq_hz[0], sNomMin, err=sNomMinErr, coher_nd=Cmin, fig=fig, fmt=rtsmSegList[iSeg]['fmt'] + '*-', label=oDataSegs[iSeg]['Desc']) fig = FreqTrans.PlotSigma(freq_hz[0], 0.4 * np.ones_like(freq_hz[0]), fmt='--r', fig=fig) ax = fig.get_axes() ax[0].set_xlim(0, 10) ax[0].set_ylim(0, 1) #%% Disk Margin Plots inPlot = sigExcList # Elements of sigExcList
gain_mag, phase_deg = FreqTrans.GainPhase(T, magUnit='mag', phaseUnit='deg', unwrap=True) rCritNom_mag, _, _ = FreqTrans.DistCrit(T, typeUnc='ellipse') #rCritNom_mag, rCritUnc_mag, rCrit_mag = FreqTrans.DistCrit(T, TUnc, typeUnc = 'ellipse') #rCritNom_mag, rCritUnc_mag, rCrit_mag, pCont_mag = FreqTrans.DistCritEllipse(T, TUnc) # Returns closest approach points #%% Sigma Plot Cmin = np.min(np.min(C, axis=0), axis=0) sigmaNom_magMin = np.min(sigmaNom_mag, axis=0) fig = 20 fig = FreqTrans.PlotSigma(freqLin_hz, sigmaLin_mag, coher_nd=np.ones_like(freqLin_hz), fig=fig, fmt='k', label='Linear') fig = FreqTrans.PlotSigma(freq_hz, sigmaNom_mag, coher_nd=Cmin, fmt='bo', fig=fig, label='Excitation Nominal') fig = FreqTrans.PlotSigma(freq_hz[0], 0.4 * np.ones_like(freq_hz[0]), fmt='--r', fig=fig, label='Critical Limit') ax = fig.get_axes() ax[0].set_xlim(0, 10)
cohLaEst = LaEstCohList[iSeg] # cohLaEstMin = np.min(cohLaEst, axis = (0,1)) cohLaEstMin = np.mean(cohLaEst, axis=(0, 1)) svNom = svLaEstNomList[iSeg] svNomMin = np.min(svNom, axis=0) svUnc = svLaEstUncList[iSeg] svUncMax = np.max(svUnc, axis=0) svUncLower = svNomMin - svUncMax svUncLower[svUncLower < 0] = svNomMin[svUncLower < 0] fig = FreqTrans.PlotSigma(freq_hz[0], svNomMin, svUnc_mag=svUncLower, coher_nd=cohLaEstMin, fig=fig, color=rtsmSegList[iSeg]['color'], linestyle='-', label=oDataSegs[iSeg]['Desc']) fig = FreqTrans.PlotSigma(freq_hz[0], 0.4 * np.ones_like(freq_hz[0]), color='r', linestyle='--', fig=fig) ax = fig.get_axes() ax[0].set_xlim(0, 10) ax[0].set_ylim(0, 1) #%% Vector Margin Plots
# rCritLiEstNom_mag, _, _ = FreqTrans.DistCrit(LiEstNomList[iSeg], typeUnc = 'ellipse') rCritLiEstNom_mag, _, _ = FreqTrans.DistCritCirc(LiEstNomList[iSeg]) rCritLiEstNomList_mag.append(rCritLiEstNom_mag) #%% Sigma Plot fig = None for iSeg in range(0, len(oDataSegs)): Cmin = np.min(np.min(LiEstCohList[iSeg], axis=0), axis=0) sNomMin = np.min(svLiEstNomList[iSeg], axis=0) fig = FreqTrans.PlotSigma(freq_hz[0], svLiEstNomList[iSeg], coher_nd=Cmin, fig=fig, color=rtsmSegList[iSeg]['color'], linestyle='-', label=oDataSegs[iSeg]['Desc']) fig = FreqTrans.PlotSigma(freq_hz[0], 0.4 * np.ones_like(freq_hz[0]), color='r', linestyle='--', fig=fig) ax = fig.get_axes() ax[0].set_xlim(0, 10) # ax[0].set_ylim(0, 1) #%% Disk Margin Plots