def przedzial_char(self): try: f1 = float(self.f1in.get()) f2 = float(self.f2in.get()) [self.i1, self.i2] = zakres(f1, f2, self.x) self.refreshFigure(self.x[self.i1:self.i2], np.abs(self.y[self.i1:self.i2]), self.koherencja[self.i1:self.i2]) except Exception as e: self.popupmsg( "Bład", f"Sprawdź częstotliwości, musza się zwierać w <F_min, F_max>\n{e}" )
kanal_3 = przeliczenie(kanal_3,S_acc,W_acc) kanal_1 = okno_wykl(kanal_1 ,L, H_pr) kanal_1 = tichonow(kanal_1 ,L, H_pr) kanal_2 = okno_wykl(kanal_2, L, H_pr) kanal_3 = okno_wykl(kanal_3, L, H_pr) nfft=3**(nextpow2(dl_syg)) print(f'nfft to : {nfft}') #wyznaczenie widmowej gestosci mocy [S11, S12, S13, S22, S33, freq] = WGM(kanal_1, kanal_2, kanal_3, H_pr, nfft, typ ='fft') w = freq * 2.0 * np.pi [i_min, i_max] = zakres(fmin, fmax, freq) freq=freq[i_min:i_max] w=w[i_min:i_max] kanal_est = int(input('Podaj dla ktorego kanalu chcesz wyznaczyc odpowiedz (2 lub 3): ')) V = np.zeros(np.shape(freq), dtype='complex') A = np.copy(V) FRF = np.copy(V) if kanal_est == 2: FRF = S12[i_min:i_max] / S11[i_min:i_max] Cxy = np.abs(S12[i_min:i_max]**2 / (S11[i_min:i_max] * S22[i_min:i_max])) V = FRF / (1j * w) A = V / (1j * w) elif kanal_est == 3: FRF = S13[i_min:i_max] / S11[i_min:i_max]
def jakosc(self): try: self.nazwapliku = self.filename dane = np.loadtxt(self.nazwapliku) L = float(self.l_sygin.get()) H_pr = float(self.h_prin.get()) Fzero = 0 Fmin = float(self.fminin.get()) Fmax = float(self.fmaxin.get()) S_ham = float(self.s_hamin.get()) W_ham = float(self.w_hamin.get()) S_acc = float(self.s_accin.get()) W_acc = float(self.w_accin.get()) dl_syg = int(L * H_pr) delay = int(dl_syg * 0.01) [kanal_1, kanal_2, kanal_3] = wyodrebnienie(dane, delay, self.prog, dl_syg, self.Vmax) kanal_1 = przeliczenie(kanal_1, S_ham, W_ham) kanal_2 = przeliczenie(kanal_2, S_acc, W_acc) kanal_3 = przeliczenie(kanal_3, S_acc, W_acc) kanal_1 = okno_wykl(kanal_1, L, H_pr) kanal_1 = tichonow(kanal_1, L, H_pr) kanal_2 = okno_wykl(kanal_2, L, H_pr) kanal_3 = okno_wykl(kanal_3, L, H_pr) nfft = 3**(nextpow2(dl_syg)) [S11, S12, S13, S22, S33, freq] = WGM(kanal_1, kanal_2, kanal_3, H_pr, nfft, typ='fft') w = freq * 2.0 * np.pi [i_min, i_max] = zakres(Fmin, Fmax, freq) freq = freq[i_min:i_max] w = w[i_min:i_max] if self.kan_wym.get() == '1' and self.kan_odp.get() == '2': FRF = S12[i_min:i_max] / S11[i_min:i_max] elif self.kan_wym.get() == '1' and self.kan_odp.get() == '3': FRF = S13[i_min:i_max] / S11[i_min:i_max] elif self.kan_wym.get() != '1' or self.kan_odp.get( ) != '2' or self.kan_odp.get() != '3': self.popupmsg( "Błąd", 'Kanał wymuszenia musi być 1\n Kanał odpowiedzi musi mieć numer 1 lub 2' ) self.w = w self.x = freq self.y = FRF self.nazwapliku2 = self.filename2 a = np.loadtxt(self.nazwapliku2) [r, c] = np.shape(a) resi = [] pole = [] for rs in range(int(r)): resi.append(a[rs, 9] + 1j * a[rs, 10]) pole.append(a[rs, 1] + 1j * a[rs, 3]) [Hs, H] = tran_widm(pole, resi, self.w) A_est = Hs / ((1j * w)**2) A_estbieg = np.zeros(np.shape(H), dtype='complex') for rs in range(int(r)): A_estbieg[:, rs] = H[:, rs] / ((1j * w)**2) A = FRF / ((1j * w)**2) #kryterium oceny fdac dla inertnacji self.FDAC_frf = ((np.abs(FRF.conj() @ Hs))**2 / ((FRF.conj() @ FRF) * (Hs.conj() @ Hs))).real self.labelfdac_frf_Wyn.delete(0, END) self.labelfdac_frf_Wyn.insert(END, f'{self.FDAC_frf:.4f}') #kryterium oceny fdac dla podatnosci self.FDAC = (np.abs(A.conj() @ A_est)**2 / ((A.conj() @ A) * (A_est.conj() @ A_est))).real self.labelfdac_Wyn.delete(0, END) self.labelfdac_Wyn.insert(END, f'{self.FDAC:.4f}') #blad srednio kwadratowy dla inertancji self.blad_sr_kwad_frf = sum((np.abs(FRF) - np.abs(Hs))**2) self.label_blad_srednio_kwad_frf_Wyn.delete(0, END) self.label_blad_srednio_kwad_frf_Wyn.insert( END, f'{self.blad_sr_kwad_frf:.4f}') #blad srednio kwadratowy dla podatnosci self.blad_sr_kwad_pod = sum((np.abs(A) - np.abs(A_est))**2) self.label_blad_srednio_kwad_Wyn.delete(0, END) self.label_blad_srednio_kwad_Wyn.insert( END, f'{self.blad_sr_kwad_pod:.2e}') #bład srednio procentowy dla inertancji self.blad_sr_proc_frf = (sum((np.abs(np.abs(FRF) - np.abs(Hs))) / np.abs(FRF))) / len(FRF) * 100 self.label_blad_srednio_proc_frf_Wyn.delete(0, END) self.label_blad_srednio_proc_frf_Wyn.insert( END, f'{self.blad_sr_proc_frf:.4f}%') #bład srednio-procentowy dla podatnosci #self.blad_sr_proc_pod = (sum((np.abs(np.abs(A) - np.abs(A_est))) / np.abs(A))) / len(A) * 100 #self.label_blad_srednio_proc_Wyn.delete(0, END) #self.label_blad_srednio_proc_Wyn.insert(END, f'{self.blad_sr_proc_pod:.4f}%') if self.typ.get() == 'Inertancja': if self.typ2.get() == 'Sumaryczna': self.refreshFiguretab2(self.x, np.abs(self.y), self.x, np.abs(Hs), text="inertancji", text2='sumaryczna') elif self.typ2.get() == 'Postacie drgań': self.refreshFiguretab2(self.x, np.abs(self.y), self.x, np.abs(H), text="inertancji", text2='postacie drgań') elif self.typ.get() == 'Podatność dynamiczna': if self.typ2.get() == 'Sumaryczna': self.refreshFiguretab2(self.x, np.abs(A), self.x, np.abs(A_est), text="podatności dynamicznej", text2='sumaryczna') elif self.typ2.get() == 'Postacie drgań': self.refreshFiguretab2(self.x, np.abs(A), self.x, np.abs(A_estbieg), text="podatności dynamicznej", text2='postacie drgań') except: self.popupmsg( "Błąd", "Wystąpił błąd, sprawdz poprawność wprowadzonych danych.")
def charakterystyka(self): try: self.nazwapliku = self.filename dane = np.loadtxt(self.nazwapliku) L = float(self.l_sygin.get()) H_pr = float(self.h_prin.get()) Fzero = 0 Fmin = float(self.fminin.get()) Fmax = float(self.fmaxin.get()) S_ham = float(self.s_hamin.get()) W_ham = float(self.w_hamin.get()) S_acc = float(self.s_accin.get()) W_acc = float(self.w_accin.get()) print(L, type(L), H_pr, type(H_pr), Fzero, Fmax, type(Fmax), Fmin) dl_syg = int(L * H_pr) delay = int(dl_syg * 0.01) [kanal_1, kanal_2, kanal_3] = wyodrebnienie(dane, delay, self.prog, dl_syg, self.Vmax) kanal_1 = przeliczenie(kanal_1, S_ham, W_ham) kanal_2 = przeliczenie(kanal_2, S_acc, W_acc) kanal_3 = przeliczenie(kanal_3, S_acc, W_acc) kanal_1 = okno_wykl(kanal_1, L, H_pr) kanal_1 = tichonow(kanal_1, L, H_pr) kanal_2 = okno_wykl(kanal_2, L, H_pr) kanal_3 = okno_wykl(kanal_3, L, H_pr) nfft = 3**(nextpow2(dl_syg)) [S11, S12, S13, S22, S33, freq] = WGM(kanal_1, kanal_2, kanal_3, H_pr, nfft, typ='fft') w = freq * 2.0 * np.pi [i_min, i_max] = zakres(Fmin, Fmax, freq) freq = freq[i_min:i_max] w = w[i_min:i_max] if self.kan_wym.get() == '1' and self.kan_odp.get() == '2': FRF = S12[i_min:i_max] / S11[i_min:i_max] Cxy = np.abs(S12[i_min:i_max]**2 / (S11[i_min:i_max] * S22[i_min:i_max])) elif self.kan_wym.get() == '1' and self.kan_odp.get() == '3': FRF = S13[i_min:i_max] / S11[i_min:i_max] Cxy = np.abs(S13[i_min:i_max]**2 / (S11[i_min:i_max] * S33[i_min:i_max])) elif self.kan_wym.get() != '1' or self.kan_odp.get( ) != '2' or self.kan_odp.get() != '3': self.popupmsg( "Błąd", 'Kanał wymuszenia musi być 1\n Kanał odpowiedzi musi mieć numer 1 lub 2' ) A = FRF / ((1j * w)**2) self.w = w self.x = freq self.y = FRF self.ypodatnosc = A self.koherencja = Cxy self.refreshFigure(self.x, np.abs(self.y), self.koherencja) except Exception as e: self.popupmsg( "Błąd", f"Sprawdź kanały, parametry, przedział częstotliwości\n{e}")