Files
extrapolation/extrapolation_blow-up_v2.py
John Beale 15ea8f8cd5 script dump
2026-02-17 08:52:57 +01:00

77 lines
1.9 KiB
Python

import numpy as np
import matplotlib.pyplot as plt
# -----------------------------
# Generate realistic fake SFs
# -----------------------------
np.random.seed(2)
n_ref = 2000
# Apo SFs
Fa_amp = np.random.uniform(50, 200, n_ref)
Fa_phi = np.random.uniform(-np.pi, np.pi, n_ref)
Fa = Fa_amp * np.exp(1j * Fa_phi)
# Difference signal (correlated phases!)
dF_amp = np.random.uniform(5, 25, n_ref)
dF_phi = Fa_phi + np.random.normal(0, 0.3, n_ref)
dF = dF_amp * np.exp(1j * dF_phi)
# Mixed SFs
Fab = Fa + dF
# -----------------------------
# Occupancies to test
# -----------------------------
b_values = [1.0, 0.5, 0.2, 0.1, 0.05]
# -----------------------------
# Compute resultants
# -----------------------------
R_Fa = np.sum(Fa)
R_Fab = np.sum(Fab)
R_dF = np.sum(Fab - Fa)
R_Fb = []
R_dF_scaled = []
for b in b_values:
Fb = Fa + (Fab - Fa) / b
R_Fb.append(np.sum(Fb))
R_dF_scaled.append(R_dF / b)
# -----------------------------
# Plot resultants
# -----------------------------
plt.figure(figsize=(6, 6))
# Reference resultants
plt.arrow(0, 0, R_Fa.real, R_Fa.imag,
head_width=200, length_includes_head=True,
label="R(Fa)", color="black")
plt.arrow(0, 0, R_Fab.real, R_Fab.imag,
head_width=200, length_includes_head=True,
label="R(Fab)", color="blue")
# Extrapolated vs difference resultants
for b, Rb, Rd in zip(b_values, R_Fb, R_dF_scaled):
plt.arrow(0, 0, Rb.real, Rb.imag,
head_width=200, length_includes_head=True,
alpha=0.7, label=f"R(Fb), b={b}")
plt.arrow(0, 0, Rd.real, Rd.imag,
head_width=200, length_includes_head=True,
linestyle="dashed", alpha=0.7)
plt.axhline(0, color="grey", lw=0.5)
plt.axvline(0, color="grey", lw=0.5)
plt.gca().set_aspect("equal")
plt.xlabel("Real")
plt.ylabel("Imag")
plt.title("Resultant vectors: extrapolation vs difference")
plt.legend(fontsize=8)
plt.tight_layout()
plt.show()