@@ -127,16 +127,30 @@ template <symmetry_tag sym_type> struct DecomposedComplexRandVar {
127127};
128128
129129namespace 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
130148inline 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
250264namespace statistics {
251- // Var(s x) ≈ Var(x) * ||s||²
265+ // Var(s x) ≈ Var(x) * ||s||^2
252266template <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