codex/dielectric-capacitor-voltage-and-charge-constraints.py

dielectric-capacitor-voltage-and-charge-constraints.py
"""Compare capacitor constraints in a stipulated epsilon_r=3 model.

Python 3.14; matplotlib 3.10.7 and numpy 2.3.5. Run from _media.
All ratios follow Q=CV, E=V/d and U=CV**2/2, not measured data.
"""

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np


def main():
    plt.rcParams.update({"font.size": 12, "font.family": "DejaVu Sans"})
    relative_permittivity = 3.0
    fixed_voltage = [relative_permittivity, relative_permittivity, 1, 1, relative_permittivity]
    fixed_charge = [relative_permittivity, 1, 1 / relative_permittivity,
                    1 / relative_permittivity, 1 / relative_permittivity]
    labels = [r"$C/C_0$", r"$Q/Q_0$", r"$V/V_0$", r"$E/E_0$", r"$U/U_0$"]
    fig, axes = plt.subplots(1, 2, figsize=(9, 4.8), dpi=110, sharex=True, sharey=True)
    fig.patch.set_facecolor("white")
    fig.suptitle(r"Same dielectric, different constraint: stipulated $\epsilon_r=3$", fontsize=16, y=0.96)
    positions = np.arange(len(labels))
    for ax, ratios, title, color in zip(
        axes, (fixed_voltage, fixed_charge),
        ("Connected: voltage source holds V", "Isolated: free plate charge stays Q"),
        ("#316ca4", "#b66b30"), strict=True,
    ):
        ax.set_facecolor("white")
        ax.barh(positions, ratios, height=0.56, color=color, zorder=3)
        ax.axvline(1, color="#525252", linestyle="--", linewidth=1.3, zorder=2)
        for y, ratio in zip(positions, ratios, strict=True):
            ax.text(ratio + 0.06, y, "1/3" if ratio < 1 else f"{ratio:g}", va="center", fontsize=12)
        ax.set_yticks(positions, labels)
        ax.tick_params(axis="y", labelleft=True, length=0)
        ax.set(xlim=(0, 3.45), xticks=(0, 1, 2, 3), xlabel="Final / initial value")
        ax.set_title(title, fontsize=12, pad=16)
        ax.grid(axis="x", alpha=0.15, zorder=0)
        for spine in ("top", "right", "left"):
            ax.spines[spine].set_visible(False)
    axes[0].invert_yaxis()
    fig.text(0.5, 0.09, "Same initial vacuum capacitor • fixed area and gap • dielectric fills the gap",
             ha="center", fontsize=11)
    fig.text(0.5, 0.04, "Dashed line: initial value • calculated final states, not measured data", ha="center", fontsize=11)
    fig.subplots_adjust(top=0.78, bottom=0.22, left=0.09, right=0.98, wspace=0.29)
    fig.savefig(Path(__file__).stem + ".png", facecolor="white", transparent=False)
    plt.close(fig)


if __name__ == "__main__":
    main()