You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.9 KiB
60 lines
1.9 KiB
from sympy.core.function import Function
|
|
from sympy.core.symbol import symbols
|
|
from sympy.functions.elementary.exponential import exp
|
|
from sympy.stats.error_prop import variance_prop
|
|
from sympy.stats.symbolic_probability import (RandomSymbol, Variance,
|
|
Covariance)
|
|
|
|
|
|
def test_variance_prop():
|
|
x, y, z = symbols('x y z')
|
|
phi, t = consts = symbols('phi t')
|
|
a = RandomSymbol(x)
|
|
var_x = Variance(a)
|
|
var_y = Variance(RandomSymbol(y))
|
|
var_z = Variance(RandomSymbol(z))
|
|
f = Function('f')(x)
|
|
cases = {
|
|
x + y: var_x + var_y,
|
|
a + y: var_x + var_y,
|
|
x + y + z: var_x + var_y + var_z,
|
|
2*x: 4*var_x,
|
|
x*y: var_x*y**2 + var_y*x**2,
|
|
1/x: var_x/x**4,
|
|
x/y: (var_x*y**2 + var_y*x**2)/y**4,
|
|
exp(x): var_x*exp(2*x),
|
|
exp(2*x): 4*var_x*exp(4*x),
|
|
exp(-x*t): t**2*var_x*exp(-2*t*x),
|
|
f: Variance(f),
|
|
}
|
|
for inp, out in cases.items():
|
|
obs = variance_prop(inp, consts=consts)
|
|
assert out == obs
|
|
|
|
def test_variance_prop_with_covar():
|
|
x, y, z = symbols('x y z')
|
|
phi, t = consts = symbols('phi t')
|
|
a = RandomSymbol(x)
|
|
var_x = Variance(a)
|
|
b = RandomSymbol(y)
|
|
var_y = Variance(b)
|
|
c = RandomSymbol(z)
|
|
var_z = Variance(c)
|
|
covar_x_y = Covariance(a, b)
|
|
covar_x_z = Covariance(a, c)
|
|
covar_y_z = Covariance(b, c)
|
|
cases = {
|
|
x + y: var_x + var_y + 2*covar_x_y,
|
|
a + y: var_x + var_y + 2*covar_x_y,
|
|
x + y + z: var_x + var_y + var_z + \
|
|
2*covar_x_y + 2*covar_x_z + 2*covar_y_z,
|
|
2*x: 4*var_x,
|
|
x*y: var_x*y**2 + var_y*x**2 + 2*covar_x_y/(x*y),
|
|
1/x: var_x/x**4,
|
|
exp(x): var_x*exp(2*x),
|
|
exp(2*x): 4*var_x*exp(4*x),
|
|
exp(-x*t): t**2*var_x*exp(-2*t*x),
|
|
}
|
|
for inp, out in cases.items():
|
|
obs = variance_prop(inp, consts=consts, include_covar=True)
|
|
assert out == obs
|