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 NumPy-st, 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:

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 / np.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:.4f} ± {1.96 * z.s:.4f}) rad (95%)')

Vaata lisaks

Sisukord