np.random.seed(1)
h = 100
M = np.random.randn(h, h)
W = M + M.T # a random *symmetric* recurrence
def spectral_radius(A):
return np.abs(np.linalg.eigvals(A)).max()
lags, norms = np.arange(41), []
for rho in (0.9, 1.0, 1.1):
J = W * (rho / spectral_radius(W)) # rescale so that rho(J) = rho
power, seq = np.eye(h), []
for k in lags:
seq.append(np.linalg.norm(power, 2)) # operator norm of J^k
power = power @ J
norms.append(seq)
print(f'rho={rho}: ||J^40|| = {seq[-1]:.3g}')
d2l.plot(lags, norms, xlabel='time lag $k$', ylabel=r'$\|\mathbf{J}^k\|$',
legend=[r'$\rho=0.9$ (vanish)', r'$\rho=1.0$', r'$\rho=1.1$ (explode)'],
yscale='log', figsize=(4.5, 3))