codexpast-exam-of-the-mathematics-course-of-the-university-of-cambridge2019iiipaper-335-landweber-filters.py
past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2019/iii/paper-335-landweber-filters.py
"""Landweber damping and inverse coefficients; write PNG in cwd."""
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
def main():
sigma=np.geomspace(1e-4, 1, 700)
fig,axes=plt.subplots(1,2,figsize=(10,4.3),dpi=100,facecolor="white")
for n,color in [(1,"#1766aa"),(10,"#d87922"),(100,"#38966b"),(1000,"#9c55a1")]:
with np.errstate(divide="ignore"):
filt=-np.expm1(n*np.log1p(-sigma*sigma))
axes[0].semilogx(sigma,filt,color=color,lw=2.2,label=f"n = {n}")
axes[1].loglog(sigma,filt/sigma,color=color,lw=2.2,label=f"n = {n}")
axes[1].loglog(sigma,1/sigma,color="0.5",ls="--",lw=1.3,label=r"Unregularized $1/\sigma$")
axes[0].set(xlim=(1e-4,1),ylim=(-.03,1.05),ylabel=r"Damping factor $f_n(\sigma)$",
title="More iterations retain smaller singular values")
axes[1].set(xlim=(1e-4,1),ylim=(1e-4,1e4),ylabel=r"Data multiplier $f_n(\sigma)/\sigma$",
title="Finite stopping controls noise amplification")
for ax in axes:
ax.set_xlabel(r"Singular value $\sigma$")
ax.grid(alpha=.2,which="both")
ax.legend(frameon=False,fontsize=9,loc="upper left")
fig.suptitle(r"Landweber iteration: zero start, unit step, $\|A\|\leq1$",fontsize=12)
fig.tight_layout(rect=(0,0,1,.93))
fig.savefig(Path.cwd()/Path(__file__).with_suffix(".png").name,
facecolor="white",transparent=False,dpi=100)
plt.close(fig)
if __name__=="__main__":
main()