# Importujeme balicky, ktore budeme potrebovat import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit import pandas as pd # ALT1: Nahrame si nase merane data do pythonu # data = pd.read_csv('Periods.csv') # Ak mame subor na rovnakom mieste ako kod, tak staci nazov suboru. Ak mame subor inde, musime zadat aj cestu k nemu (napr. '../Data/Periods.csv') # mean_10_periods = data[['M1 10period [s]','M2 10period [s]','M3 10period [s]','M4 10period [s]','M5 10period [s]']].mean(axis=1) # Vezmeme stlpce, z ktorych chceme spocitat priemer a zvolime os, po ktorej chceme priemer spocitat (axis=0 ide po riadkoch, axis=1 ide po stlpcoch) # std_10_periods = data.iloc[:, 1:6].std(axis=1) # Alternativny zapis vyberu stlpcov - pomocou funkcie iloc[rows, columns] vyberiem rozsah riadkov a stlpcov, ktore chcem vziat do uvahy (podobne ako v inych rozsahoch znaci : vsetky polozky a pociatocny index je inkluzivny a konecny index je exkluzivny) # # Po tejto manipulacii s datami dostaneme mean_10_periods a std_10_periods ako objekt typu . Balicek pandas je postaveny na balicku numpy, takze ma obdobny vektorovy charakter. # # To znamena, ze operacie definovane na objektoch typu Series su velmi podobne tym, ktore su definovane na numpy poliach (t.j. aritmeticke operacie po zlozkach) a mozeme ich dalej vyuzit. # ALT2: Merane data zapisujeme rovno do pythonu data = { 'Dlzky': np.array([20, 50, 80, 110, 140]), # cm '10Period': [ np.array([8.9, 9.0, 8.8, 8.7, 9.1]), # s np.array([14.1, 14.0, 13.9, 14.2, 13.8]), np.array([17.8, 17.9, 17.7, 18.0, 17.6]), np.array([20.9, 20.7, 20.5, 20.6, 20.8]), np.array([23.6, 23.4, 23.5, 23.7, 23.3]) ] } # Spocitame priemer z merani 10 period pre jednu dlzku zavesu a jeho standardnu odchylku mean_10_periods = np.zeros(5) # Vytvorime 1-rozmerne pole o dlzke 5 vyplnene nulami std_10_periods = np.zeros(5) for i in range(5): mean_10_periods[i] = np.mean(data['10Period'][i]) # Kazdu zlozku pola prepiseme na nasu pozadovanu hodnotu std_10_periods[i] = np.std(data['10Period'][i]) # Nachystame si data v spravnych jednotkach (cm -> m, 10 period -> 1 perioda) lengths = data['Dlzky'] * 1e-2 # numpy polia pracuju po zlozkach periods = mean_10_periods / 10 # Vynesieme data do grafu ako perioda v zavislosti na dlzke zavesu, aby sme dostali priamku, tak musime vyniest T=f(sqrt(L)) # plt.plot(np.sqrt(lengths), periods, 'x') # plt.xlabel('$\sqrt{L}$ [$\sqrt{m}$]', fontsize = 14) # Vyuzijem latex zapis na matematicke symboly # plt.ylabel('T [s]', fontsize = 14) # plt.show() # Chceme nase merane data nafitovat priamkou. Tuto priamku si definujeme: def f(x, a): return a * x parametre, matica = curve_fit(f, np.sqrt(lengths), periods) # Mozeme do grafu vlozit fitovaciu priamku a takyto graf si ulozit do pocitaca ako obrazok plt.plot(np.sqrt(lengths), periods, 'x', label = 'Merane hodnoty') plt.plot(np.sqrt(lengths), f(np.sqrt(lengths), parametre[0]), '--', label = 'Linearny fit') plt.xlabel('$\sqrt{L}$ [$\sqrt{\mathrm{m}}$]', fontsize = 14) plt.ylabel('$T$ [s]', fontsize = 14) plt.legend() # Aby sa legenda zobrazila, musim mat svoje krivky pomenovane - label v plt.plot plt.savefig('Graf.png', dpi = 300) plt.show() # Na zaver spocitame tiazove zrychlenie g = 4 * np.pi**2 / parametre[0]**2 print(g)