cplx_cr_residual — MATH complex op

• Data kinds: cimage → measurement

• Call: import fullseye as fs; fs.ledger.cplx_cr_residual(f, spacing=1.0) (implementation को सीधे call करना हो तो import mathops; mathops.cplx_cr_residual(f, spacing=1.0), registry से लेना हो तो opsmath.get("cplx_cr_residual"))

उपयोग

sampled complex field का Cauchy-Riemann residual — "क्या यह field holomorphic है?" एक संख्या के रूप में।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

With f = u + i v sampled on a uniform grid, holomorphy means u_x = v_y and u_y = -v_x (Cauchy-Riemann). This returns the relative residual max(|u_x - v_y|, |u_y + v_x|) / max|grad| (central differences, numpy.gradient): 0 = the samples satisfy CR to the discretisation limit, 2 = the field is the conjugate of a holomorphic one (conj(z) gives exactly 2), values in between = partly analytic or noisy.

Grid convention (it decides the sign of the answer): f[i, j] is the field at z = x0 + j*spacing + i*spacing*1j — rows index the *increasing imaginary* axis, columns the real axis. Image arrays usually run rows *downward*; feeding one directly measures the conjugate field, whose residual is 2, not 0. Flip rows (f[::-1]) to use image data.

Discretisation, honestly: central differences are exact for polynomials of degree <= 2, so f = z**2 returns exactly 0; for higher order the residual floors at O(h^2 * |f'''|) (measured: f = z**3 on a [-1,1]^2 grid returns 1.7e-3 at h and 4.2e-4 at h/2 — a factor 4.00, the expected second order). Read a small value as "consistent with holomorphic at this resolution", never as proof.

A constant field returns 0.0 (it is holomorphic; the 0/0 of the normalisation is resolved by that limit, and stated here rather than left to numpy).

Raises ValueError: not a 2-D array, either dimension below 3 (no central difference exists), non-finite/masked input, over-cap size, non-finite or non-positive *spacing*.

HALCON: no operator (derivate_gauss supplies the real-valued derivatives one would build this from).

पूरी family का input contract (fail-closed)

mathops के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• complex input से ValueError — float64 में ज़बरदस्ती बदलने पर imaginary part चुपचाप छूट जाता है (numpy केवल ComplexWarning देता है और "सही दिखने वाला पर गलत" real number लौटाता है)। .real/.imag/abs() स्पष्ट रूप से लिखें, या complex data संभालने वाले complexops का उपयोग करें।

• masked array (masked elements वाला) से ValueError — mask हटाकर नीचे के raw values इस्तेमाल करने वाला implicit conversion अस्वीकार है। भरना है या हटाना है, यह स्पष्ट रूप से बताएँ।

• हर input पर NaN/Inf से ValueError (गिनती बताकर अस्वीकार — क्योंकि यह पूरे परिणाम में फैल जाता है)।

• Shape सख़्त है: 1-D और 2-D को implicit रूप से promote या broadcast नहीं किया जाता (vector slot में matrix या matrix slot में vector देने पर ValueError; reshape स्पष्ट रूप से करें)।

• Size की सीमा: matrix लेने वाले ops और stat_histogram के bins, mathops.MAX_ELEMENTS (2^26 ≈ 6.7 करोड़ elements) से अधिक होने पर ValueError देते हैं।

उपयोग की विस्तृत guide

• math_metrology family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• math_complex — py -3.11 examples/math_complex.py

• poc_complex_plane_fields — py -3.11 examples/poc_complex_plane_fields.py

वे अगले ops जिनसे type जुड़ता है (measurement को input के रूप में लेते हैं)

—

इसी category के (complex)

cplx_contour_circle · cplx_poly_eval · cplx_contour_integral · cplx_winding_number · cplx_cauchy_value · cplx_argument_principle · cplx_laurent_coeffs · cplx_joukowski


*Provenance: mathops.py — MATH operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.