Example03 / 09
无标度网络的随机失效阈值与攻击阈值(连续度近似)
随机失效:f_c = 1 - 1/(kappa - 1),kappa = <k^2>/
Output输出图

Output文字输出
gamma f_c随机(N=1e4) f_c随机(N=1e6) f_c攻击(k_min=1) f_c攻击(k_min=2) 2.1 0.999 1.000 0.0471 0.1047 2.3 0.993 0.999 0.0629 0.1755 2.5 0.976 0.995 0.0557 0.2010 2.7 0.946 0.979 0.0434 0.2114 2.9 0.904 0.945 0.0309 0.2149 3.5 0.754 0.784 0.0051 0.2102
Code代码
# 随机失效:f_c = 1 - 1/(kappa - 1),kappa = <k^2>/<k> 用截断幂律 [k_min, k_max] 的连续近似计算,k_max = k_min N^{1/(gamma-1)}。
# 攻击(Cohen 等 2001):f_c 满足 f^{(2-g)/(1-g)} = 2 + (2-g)/(3-g) * k_min * (f^{(3-g)/(1-g)} - 1),用 brentq 求根。
# 解读:gamma<3 时随机失效阈值随 N 增大逼近 1;攻击阈值只有百分之几到二十几,且随 gamma 非单调变化
# (k_min=1 时约在 gamma≈2.3 处取极大值 0.06 左右)。连续度近似对小 k_min 只是粗略估计,应以模拟核对。
import numpy as np
from scipy.optimize import brentq
def kappa(g, kmin, kmax):
m1 = (kmax ** (2 - g) - kmin ** (2 - g)) / (2 - g)
m2 = (kmax ** (3 - g) - kmin ** (3 - g)) / (3 - g)
return m2 / m1
def fc_random(g, kmin, N):
kmax = kmin * N ** (1 / (g - 1))
return 1 - 1 / (kappa(g, kmin, kmax) - 1)
def fc_attack(g, kmin):
F = lambda f: f ** ((2 - g) / (1 - g)) - 2 - (2 - g) / (3 - g) * kmin * (f ** ((3 - g) / (1 - g)) - 1)
grid = np.logspace(-6, -0.001, 4000)
vals = [F(f) for f in grid]
for a, b, va, vb in zip(grid[:-1], grid[1:], vals[:-1], vals[1:]):
if va * vb < 0:
return brentq(F, a, b)
return np.nan
print("gamma f_c随机(N=1e4) f_c随机(N=1e6) f_c攻击(k_min=1) f_c攻击(k_min=2)")
for g in [2.1, 2.3, 2.5, 2.7, 2.9, 3.5]:
print("%.1f %.3f %.3f %.4f %.4f" % (
g, fc_random(g, 2, 1e4), fc_random(g, 2, 1e6), fc_attack(g, 1), fc_attack(g, 2)))
import matplotlib.pyplot as plt
gs = np.linspace(2.05, 3.5, 20)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.plot(gs, [fc_random(g, 2, 1e4) for g in gs], "o-", ms=4, label="N = 1e4")
ax1.plot(gs, [fc_random(g, 2, 1e6) for g in gs], "s--", ms=4, label="N = 1e6")
ax1.set_xlabel("degree exponent gamma"); ax1.set_ylabel("critical fraction f_c"); ax1.legend()
ax1.set_title("Random failure (k_min = 2)")
ax2.plot(gs, [fc_attack(g, 1) for g in gs], "o-", ms=4, label="k_min = 1")
ax2.plot(gs, [fc_attack(g, 2) for g in gs], "s--", ms=4, label="k_min = 2")
ax2.set_xlabel("degree exponent gamma"); ax2.set_ylabel("critical fraction f_c"); ax2.legend()
ax2.set_title("Targeted attack: only a few percent")
plt.tight_layout(); plt.show()Run在浏览器中运行
首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。