cplx_cr_residual — MATH complex op

Datenarten: cimagemeasurement

Aufruf: import mathops; mathops.cplx_cr_residual(f, spacing=1.0) (oder opsmath.get("cplx_cr_residual"))

Verwendung

Cauchy-Riemann-Residuum eines abgetasteten komplexen Feldes — „ist dieses Feld holomorph?“ als Zahl.

> Die ausführliche Beschreibung unten ist der Originaltext — Zusammenfassung und Überschriften sind übersetzt.

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).

Familienweiter Eingabevertrag (fail-closed)

Jeder mathops-Operator prüft seine Eingabe vor der Berechnung (nichts rutscht stillschweigend durch):

• **Komplexe Eingaben lösen ValueError aus** — die Umwandlung nach float64 verwirft den Imaginärteil stillschweigend (numpy meldet nur eine ComplexWarning und liefert eine plausibel aussehende, falsche reelle Zahl). Schreiben Sie .real/.imag/abs() explizit oder nutzen Sie complexops.

• **Masked Arrays mit maskierten Elementen lösen ValueError aus** — die implizite Umwandlung, die die Maske abstreift und die Rohwerte darunter verwendet, wird abgelehnt. Geben Sie explizit an, ob gefüllt oder verworfen wird.

• **NaN/Inf löst bei jeder Eingabe ValueError aus** (mit Anzahl abgelehnt — es pflanzt sich durch das gesamte Ergebnis fort).

Formen sind strikt: 1-D und 2-D werden nie implizit hochgestuft oder gebroadcastet (eine Matrix im Vektor-Slot oder ein Vektor im Matrix-Slot löst ValueError aus; reshapen Sie explizit).

Größenobergrenze: Operatoren, die eine Matrix nehmen, sowie die stat_histogram-Bins lösen jenseits von mathops.MAX_ELEMENTS (2^26 ≈ 67 Mio. Elemente) ValueError aus.

Ausführlicher Anwendungsleitfaden

Leitfaden zur Familie math_metrology

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

math_complexpy -3.11 examples/math_complex.py

Typkompatible Folge-Operatoren (nehmen measurement als Eingabe)

Gleiche Kategorie (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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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