Úvod do praktické fyziky NOFY055

Programování pro statistiku a zpracování měření v příkladech

Mgr. Jan Matoušek, Ph.D.
Výběr jazyka/prostředí: python  root  
Zpět na hlavní stránku

Hello world program

Co je potřeba udělat, abych dostal nejjednoduší možný funkční program?
Vytvořím soubor test.py, obsahující:
print("Hello world!")
Program spustím z příkazového řádku:
user@machine:~$ python test.py
Hello world!

Proměnné, podmínka

Definice proměnných, jednoduchá operace, vypsání výsledku:
import numpy  # modul pro matematické funkce a práci s poli

n = 2 # integer (celé číslo)
x = 3.5 # číslo 's plovoucí desetinnou čárkou'
print("n = " + str(n) + ", x = " + str(x))
# funkce str() převádí číslo na textový řetězec, řetězce se skládají pomocí '+'

y = n * x + 4
if y > 0:  # podmínka: pokud je y > 0
  z = numpy.sqrt(y)
  print("y = " + str(y) + ", z = sqrt(y) = " + str(z))
else:
  print("y = " + str(y) + ", z = sqrt(y) = není definováno")

Generování náhodných čísel

Generujeme 100 čísel s rovnoměrným rozdělením v intervalu (0,1):
import numpy

for i in range(100):  # pro všechna i = 0,1,...,99 udělej:
  x = numpy.random.rand()
  print(str(i) + "\t" + str(x))
Lze udělat i jiná rozdělení, viz https://numpy.org/doc/stable/reference/random/generator.html#simple-random-data
Generování čísel do pole:
import numpy

N = 10
x = numpy.random.rand(N)

# vypsání pole:
print(x)
print()  # prázdný řádek
# nebo:
for i in range(N):
  print(str(i) + "\t" + str(x[i]));

Graf

Jednoduchý graf funkce sin(2x):
import numpy
import matplotlib.pyplot as plt

N = 100  # počet bodů
xMin = -numpy.pi
xMax = numpy.pi
dx = (xMax -xMin) / N
x = numpy.empty(N)  # prázdné pole
y = numpy.empty(N)

for i in range(N):
  x[i] = xMin + dx * i
  y[i] = numpy.sin(2*x[i])

plt.plot(x, y, 'o')    # o vykreslí kolečko v každém bodě (jinak čára)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
Přehled toho, jak se dá graf upravit je např. tady https://matplotlib.org/3.1.0/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-pyUkázka grafu

Histogram

Histogram reprezentuje distribuci nějaké numerické veličiny. Je to typ grafu, kde vertikální osa vyjadřuje četnost výskytu sledované veličiny v intervalech (binech) znázorněných na horizontální ose. Histogram uděláme následovně: Nejdřív rozdělíme rozsah dané veličiny na biny. Potom sledujeme danou veličinu v nějakém počtu případů a zaznamenáme, kolikrát leží ve kterém binu. Příklad vytvoření histogramu a jeho naplnění exponenciálně rozdělenou náhodnou veličinou:
import numpy
import matplotlib.pyplot as plt

N = 100
tau = 1    # parameter exp. distribuce
x = numpy.random.exponential(tau,N)    # pole náhodných čísel

# automatický histogram:
nBins = 10
plt.hist(x, nBins)
plt.xlabel("x");  # popiska osy x
plt.show()

# jde zadat pevné minimum a maximum
plt.hist(x, nBins, range=(0, 5*tau))
plt.show()

n, bins, patches = plt.hist(x, nBins)  # funkce vrací 3 entity
plt.show()
# n: pole četností (výšek sloupců), bins: pole hranic binů, patches: nevím
for i in range(nBins):    # můžeme zkusit vypsat obsah binů:
  print("bin [" + str(bins[i]) + ", " + str(bins[i+1]) + ") případů: " + str(n[i]))
Ukázka histogramu

Zápis do souboru

Zapíšeme do souboru dvojice náhodných čísel:
import numpy

file = open("data.txt", "w")
for i in range(10):
  x = numpy.random.normal(0,0.5)    # normální rozdělení, mu = 0, sigma = 0.5
  y = numpy.random.normal(2.5,1)  # mu = 2.5, sigma = 1
  file.write(str(x) + "\t" + str(y) + "\n")  # musíme odřádkovat pomocí \n

file.close()

Čtení ze souboru

Následující program přečte textový soubor vytvořený v předchozím příkladě a spočítá průměr každého sloupce (odhad střední hodnoty rozdělení).
import numpy

mx = 0.0
my = 0.0
n = 0
file = open("data.txt", "r")

for line in file:
  columns = line.split()
  x = float(columns[0])
  y = float(columns[1])
  print("přečteno: " + columns[0] + "\t" + columns[1])
  mx = mx + x
  my = my + y
  n = n + 1

file.close()
mx = mx / n
my = my / n
print("----------------------------------------")
print("průměrné x = " + str(mx) + ", průměrné y = " + str(my))

Výběr jazyka/prostředí: python  root  
Zpět na hlavní stránku