Skip to content

Commit 29e11ed

Browse files
committed
extend docs on variance calculation
Signed-off-by: Martijn Govers <[email protected]>
1 parent 99ee61b commit 29e11ed

File tree

1 file changed

+19
-5
lines changed
  • power_grid_model_c/power_grid_model/include/power_grid_model/common

1 file changed

+19
-5
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/common/statistics.hpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,30 @@ template <symmetry_tag sym_type> struct DecomposedComplexRandVar {
127127
};
128128

129129
namespace detail {
130+
// Var(f_i) ≈ \Sum_j Var(x_j) * ||df_i/dx_j||^2 // first order
131+
// + 1/2 * \Sum_{jk} Var(x_j) * ||d^2 f_i/dx_jdx_k||^2 Var(x_k) // second order
132+
//
133+
// Re{I} = I cos(θ)
134+
// Im{I} = I sin(θ)
135+
//
136+
// dRe{I}/dI = cos(θ) dIm{I}/dI = sin(θ)
137+
// dRe{I}/dθ = -I sin(θ) dIm{I}/dθ = I cos(θ)
138+
// d^2 Re{I}/dI^2 = 0 d^2 Im{I}/dI^2 = 0
139+
// d^2 Re{I}/dθ^2 = -I cos(θ) d^2 Im{I}/dθ^2 = -I sin(θ)
140+
// d^2 Re{I}/dIdθ = -sin(θ) d^2 Im{I}/dIdθ = cos(θ)
141+
//
142+
// Var(Re{I}) = Var(I cos(θ))
143+
// ≈ Var(I) * cos^2(θ) + Var(θ) * I^2 * sin^2(θ) // first order
144+
// + 1/2 * Var(θ)^2 * I^2 * cos^2(θ) + Var(I) * Var(θ) * sin^2(θ) // second order
145+
// Var(Im{I}) = Var(I sin(θ))
146+
// ≈ Var(I) * sin^2(θ) + Var(θ) * I^2 * cos^2(θ) // first order
147+
// + 1/2 * Var(θ)^2 * I^2 * sin^2(θ) + Var(I) * Var(θ) * cos^2(θ) // second order
130148
inline auto compute_decomposed_variance_from_polar(auto const& magnitude, auto const& cos_angle, auto const& sin_angle,
131149
auto const& magnitude_variance, auto const& angle_variance) {
132150
auto const cos2_angle = cos_angle * cos_angle;
133151
auto const sin2_angle = sin_angle * sin_angle;
134152
auto const magnitude2 = magnitude * magnitude;
135153

136-
// // first order approximation
137-
// return std::make_pair(magnitude_variance * cos2_angle + magnitude2 * angle_variance * sin2_angle,
138-
// magnitude_variance * sin2_angle + magnitude2 * angle_variance * cos2_angle);
139-
140154
// second order approximation
141155
return std::make_pair(magnitude_variance * cos2_angle + magnitude2 * angle_variance * sin2_angle +
142156
0.5 * magnitude2 * angle_variance * angle_variance * cos2_angle +
@@ -248,7 +262,7 @@ template <symmetry_tag sym> inline auto conj(PolarComplexRandVar<sym> var) {
248262
}
249263

250264
namespace statistics {
251-
// Var(s x) ≈ Var(x) * ||s||²
265+
// Var(s x) ≈ Var(x) * ||s||^2
252266
template <symmetry_tag sym, template <symmetry_tag> typename RandVarType>
253267
requires is_in_list_c<RandVarType<sym>, UniformRealRandVar<sym>, IndependentRealRandVar<sym>,
254268
UniformComplexRandVar<sym>, IndependentComplexRandVar<sym>>

0 commit comments

Comments
 (0)