Example10 / 13
多层网络的超拉普拉斯矩阵与层间耦合
两层多重网络(multiplex)共享 50 个节点:第 1 层是稀疏 ER 网络,第 2 层是 WS 小世界网络。 超拉普拉斯矩阵 L = [[L1 + Dx I, -Dx I], [-Dx I, L2 + Dx I]],Dx 为层间扩散系数。 其第二小特征值 λ2 决定扩散趋于平衡的速度。Gómez 等(2013)指出:Dx 很小时 λ2 ≈ 2Dx, 受层间耦合限制;Dx 很大时 λ2 趋近于聚合拉普拉斯 (L1 + L2)/2 的 λ2,可以超过单独任一层的 λ2。 解读:观察 λ2 随 Dx 的变化,以及大 Dx 下是否出现比两层都快的“超扩散”。
Output输出图

Output文字输出
λ2(层1) = 0.160,λ2(层2) = 0.134,λ2((L1+L2)/2) = 0.841 Dx = 0.01 时 λ2(超拉普拉斯) = 0.0200(≈ 2Dx = 0.02);Dx = 100 时 = 0.834
Code代码
# 两层多重网络(multiplex)共享 50 个节点:第 1 层是稀疏 ER 网络,第 2 层是 WS 小世界网络。
# 超拉普拉斯矩阵 L = [[L1 + Dx I, -Dx I], [-Dx I, L2 + Dx I]],Dx 为层间扩散系数。
# 其第二小特征值 λ2 决定扩散趋于平衡的速度。Gómez 等(2013)指出:Dx 很小时 λ2 ≈ 2Dx,
# 受层间耦合限制;Dx 很大时 λ2 趋近于聚合拉普拉斯 (L1 + L2)/2 的 λ2,可以超过单独任一层的 λ2。
# 解读:观察 λ2 随 Dx 的变化,以及大 Dx 下是否出现比两层都快的“超扩散”。
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
n = 50
G1 = nx.gnm_random_graph(n, 70, seed=1)
comps = [min(c) for c in nx.connected_components(G1)]
G1.add_edges_from(zip(comps[:-1], comps[1:])) # 把各连通分支串起来,保证连通
G2 = nx.connected_watts_strogatz_graph(n, 4, 0.05, seed=2)
L1 = nx.laplacian_matrix(G1, nodelist=range(n)).toarray().astype(float)
L2 = nx.laplacian_matrix(G2, nodelist=range(n)).toarray().astype(float)
lam2 = lambda L: np.sort(np.linalg.eigvalsh(L))[1]
I = np.eye(n)
Dxs = np.logspace(-2, 2, 30)
sup = [lam2(np.block([[L1 + d * I, -d * I], [-d * I, L2 + d * I]])) for d in Dxs]
print(f"λ2(层1) = {lam2(L1):.3f},λ2(层2) = {lam2(L2):.3f},λ2((L1+L2)/2) = {lam2((L1 + L2) / 2):.3f}")
print(f"Dx = 0.01 时 λ2(超拉普拉斯) = {sup[0]:.4f}(≈ 2Dx = 0.02);Dx = 100 时 = {sup[-1]:.3f}")
plt.figure(figsize=(5, 3))
plt.loglog(Dxs, sup, "o-", ms=3, label="supra-Laplacian")
plt.axhline(lam2(L1), ls="--", c="C1", label="layer 1 alone")
plt.axhline(lam2(L2), ls="--", c="C2", label="layer 2 alone")
plt.axhline(lam2((L1 + L2) / 2), ls=":", c="k", label="(L1+L2)/2")
plt.xlabel("inter-layer coupling $D_x$"); plt.ylabel(r"$\lambda_2$")
plt.legend(fontsize=7); plt.tight_layout(); plt.show()Run在浏览器中运行
首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。