1
2
3 """
4 Error propogation algorithms for simple arithmetic
5
6 Warning: like the underlying numpy library, the inplace operations
7 may return values of the wrong type if some of the arguments are
8 integers, so be sure to create them with floating point inputs.
9 """
10
11
12 from __future__ import division
13 import numpy
14
15 -def div(X,varX, Y,varY):
16 """Division with error propagation"""
17
18
19
20
21
22 Z = X/Y
23 varZ = Z**2
24 varZ *= varY
25 varZ += varX
26 T = Y**2
27 varZ /= T
28 return Z, varZ
29
30 -def mul(X,varX, Y,varY):
31 """Multiplication with error propagation"""
32
33 Z = X * Y
34 varZ = Y**2 * varX + X**2 * varY
35
36
37
38
39
40
41
42
43 return Z, varZ
44
45 -def sub(X,varX, Y, varY):
46 """Subtraction with error propagation"""
47 Z = X - Y
48 varZ = varX + varY
49 return Z, varZ
50
51 -def add(X,varX, Y,varY):
52 """Addition with error propagation"""
53 Z = X + Y
54 varZ = varX + varY
55 return Z, varZ
56
58 """Exponentiation with error propagation"""
59 Z = numpy.exp(X)
60 varZ = varX * Z**2
61 return Z,varZ
62
64 """Logarithm with error propagation"""
65 Z = numpy.log(X)
66 varZ = varX / X**2
67 return Z,varZ
68
69
70
71
72
73
74
75
77 """X**n with error propagation"""
78
79
80
81
82 Z = X**n
83 varZ = varX/X
84 varZ /= X
85 varZ *= Z
86 varZ *= Z
87 varZ *= n**2
88 return Z, varZ
89
91 """In-place division with error propagation"""
92
93
94 X /= Y
95 T = X**2
96 T *= varY
97 varX += T
98 del T
99 T = Y
100 T **=2
101 varX /= T
102 return X,varX
103
105 """In-place multiplication with error propagation"""
106
107
108 T = Y**2
109 varX *= T
110 del T
111 T = X
112 T **=2
113 T *= varY
114 varX += T
115 X *= Y
116 return X,varX
117
119 """In-place subtraction with error propagation"""
120
121
122 X -= Y
123 varX += varY
124 return X,varX
125
127 """In-place addition with error propagation"""
128
129
130 X += Y
131 varX += varY
132 return X,varX
133
135 """In-place X**n with error propagation"""
136
137
138
139
140 varX /= X
141 varX /= X
142 X **= n
143 varX *= X
144 varX *= X
145 varX *= n**2
146 return X,varX
147