codexsame-early-response-different-lung-compliances.py
same-early-response-different-lung-compliances.py
#!/usr/bin/env python3
"""Distinct passive models matching one observed finite-time compliance."""
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
def main():
time = np.linspace(0, 6, 1201)
fig, ax = plt.subplots(figsize=(8, 3.5), dpi=120, facecolor="white")
for compliance, color in [(.12, "#2367a1"), (.20, "#b85224"), (1., "#24845e")]:
tau = -1 / np.log(1 - .1 / compliance)
response = compliance * (1 - np.exp(-time / tau))
ax.plot(time, response, color=color, lw=2,
label=f"Equilibrium C = {compliance:g}; time constant {tau:.2f} s")
ax.axvline(1, color=".6", ls=":", lw=1)
ax.scatter([1], [.1], color=".15", zorder=5, s=32)
ax.annotate("All give 0.10 at 1 s", (1, .1), xytext=(1.6, .23),
fontsize=10, arrowprops={"arrowstyle": "->", "color": ".3"})
ax.set(xlim=(0, 6), ylim=(0, .52), xlabel="Time after pressure step (s)",
ylabel="Volume / pressure (L per cm H2O)")
ax.set_title("One early observation, different equilibrium compliances", fontsize=12)
ax.legend(loc="lower right", fontsize=8)
ax.grid(alpha=.18)
ax.set_facecolor("white")
fig.text(.5, .015, "Constructed single-compartment models; not patient measurements", ha="center", fontsize=9)
fig.tight_layout(rect=(0, .055, 1, 1))
fig.savefig("same-early-response-different-lung-compliances.png", dpi=120,
facecolor="white", transparent=False)
plt.close(fig)
if __name__ == "__main__":
main()