Oletagem, et on mõõdetud (otseselt või kaudselt) suurused $x$ ja $y$ koos määramatustega ning nendest arvutatakse teatava füüsikalise seose baasil suurus $z$. Seega võime öelda, et oleme kaudselt mõõtnud suuruse $z$. Juhul kui mõõtemääramatus on antud piirvigade kujul ($\Delta x$ ja $\Delta y$), siis suuruse $z$ piirvea hindamiseks tuleb eeldada, et $x$ ja $y$ vead kombineeruvad halvimal võimalikul viisil. Eeldades lisaks, et $\Delta x$ ja $\Delta y$ on suhteliselt väikesed, saame kasutada diferentsiaalarvutust: $$ \tag{1} \Delta z =\left|\frac{\partial z}{\partial x}\right|\Delta x + \left|\frac{\partial z}{\partial y}\right|\Delta y, $$ kus kõik liidetavad on positiivsed.
Oletagem nüüd, et ühel või teisel teel on kindlaks tehtud $x$ ja $y$ standardmääramatused $u(x)$ ja $u(y)$. Statistikast on teada, et sõltumatute juhuslike suuruste dispersioonid liituvad (dispersioon on standardhälbe ruut). Seega $z$ standardmääramatus $$ \tag{2} u(z)=\sqrt{\left(\frac{\partial z}{\partial x}u(x)\right)^2 + \left(\frac{\partial z}{\partial y}u(y)\right)^2}. $$ Märgime, et sellisel viisil arvutatud $u(z)$ on väiksem kui oleks absoluutväärtuseeskirjast saadav $\left|\frac{\partial z}{\partial x}\right|u(x) + \left|\frac{\partial z}{\partial y}\right|u(y)$, sest on võimalik, et $x$ ja $y$ mõõtmisel tehtavad vead osaliselt kompenseerivad üksteist. Piirvea kontseptsioon ei suuda seda võimalust arvestada. Erijuhul kus $z$ sõltub vaid ühest muutujast $x$, saame siiski piirveale sarnaneva seose $u(z)=\left|\frac{\partial z}{\partial x}\right|u(x)$.
Kui $z$ on võrdlemisi keerulises sõltuvuses $x$-st ja $y$-st, võib kaudmõõtmise määramatuse avaldise tuletada sümbolarvutuse abil.
Demonstreerime eelnevat, võttes aluseks avaldise $$z = \operatorname{atan}{\frac{y}{x}}.$$ $u(z)$ avaldises (2) sisalduvate osatuletiste otsene arvutamine on antud juhul tülikas. Kuid me saame $z$ avaldist vaadelda ahelfunktsioonina: $$z(\xi)= \operatorname{atan}\xi,\quad \xi(x, y) = \frac{y}{x}.$$ Seega $$ \begin{align} u(z) &= \left|\frac{dz}{d\xi}\right|u(\xi)\\ &=\frac{1}{1 + \xi^2}\sqrt{\left(\frac{\partial \xi}{\partial x}u(x)\right)^2 + \left(\frac{\partial \xi}{\partial y}u(y)\right)^2}\\ &= \frac{1}{1+y^2/x^2} \sqrt{\frac{y^2u(x)^2}{x^4} + \frac{u(y)^2}{x^2}}\\ &= \frac{1}{x^2+y^2} \sqrt{y^2u(x)^2 + x^2u(y)^2}. \end{align} $$
Püüame nüüd sama tulemuseni jõuda sümbolarvutuse abil Pythonis,
kasutades paketti SymPy. Märgime, et see arvutus on soovitav teostada eraldi
töölehel (või eraldi sessioonina), sest paljud funktsioonid moodulites
sympy
, numpy
ja matplotlib.pyplot
on kattuvate nimedega.
Esmalt laadime ja initsialiseerime SumPy:
from sympy import *
init_printing()
Defineerime Pythoni muutujad, mis esindaksid matemaatilisi sümboleid $x$, $y$, $u_x$ ja $u_y$. Ühtlasi anname süsteemile teada, et kõik sümbolid esindavad positiivseid reaalarve (see võib aidata edaspidi avaldisi lihtsustada).
var('x,y,u_x,u_y', positive=True)
Nende muutujate baasil saab konstrueerida sümbolavaldise $z$ arvutamiseks:
z = atan(y / x)
Siin funktsioon atan
pärineb muidugi moodulist sympy
. SymPy
avaldise koosseisus on meetod diff
osatuletise arvutamiseks. Selle
kaudu saame kirja panna $u_z$ avaldise:
u_z = sqrt(z.diff(x)**2 * u_x**2 + z.diff(y)**2 * u_y**2)
(Jällegi, ruutjuure funktsioon sqrt
muidugi moodulist sympy
.) Kui väljastada u_z
väärtus ekraanile, saame
$$\displaystyle \sqrt{\frac{u_{x}^{2} y^{2}}{x^{4} \left(1 + \frac{y^{2}}{x^{2}}\right)^{2}} + \frac{u_{y}^{2}}{x^{2} \left(1 + \frac{y^{2}}{x^{2}}\right)^{2}}}.$$
Saadud avaldis ei ole ilmselt eriti optimaalne. Seda võib püüda lihtsustada käsuga
simplify
:
u_z = u_z.simplify()
Pärast seda näeb see avaldis välja tõepoolest identne sellega, mille leidsime enne käsitsi.
Pythoni koodi kujul saame tulemuse kätte käsuga print(u_z)
:
sqrt(u_x**2*y**2 + u_y**2*x**2)/(x**2 + y**2)
Asendades sqrt
samanimelise funktsiooniga moodulist math
või numpy
, olemegi saanud avaldise
$u(z)$ numbriliseks arvutamiseks.
Eksisteerib ka spetsiaalne Pythoni pakett uncertainties
määramatust omavate
kvantiteetidega arvutamiseks. Selleks võetakse kasutusele vastav uus andmetüüp
ja selle jaoks kohaldatud matemaatilised funktsioonid (viimased toimivad siiski ka
tavaliste arvudega):
from uncertainties import ufloat
from uncertainties.umath import *
Esmalt defineerime lähtesuurused koos standardhälbega:
x = ufloat(176.0, 2.3) # 2.3 on standardhälve
y = ufloat(34.7, 1.5 / sqrt(3)) # 1.5 on piirviga
Nende baasil mistahes suuruse arvutamisel ka määramatused kanduvad edasi ja
akumuleeruvad vastavalt valemile (2). Seejuures võetakse korrektselt arvesse
korrelatsioone suuruste vahel (nt suuruse $z=(2x - x)/x$ määramatuseks saab täpselt null).
Viimaks, arvutatud suuruse nominaalse väärtuse ja selle standardhälbe saab kätte atribuutidega
n
ja s
:
z = atan(y / x)
print(f'Nurk = ({z.n:.3f} ± {1.96 * z.s:.3f}) rad (95%)')