06 稀疏结构 spy
用途
只画非零元的位置,用来看节点导纳矩阵、Jacobian 的稀疏带宽。
示例(5 张)
06-1 节点导纳矩阵的稀疏结构

06-2 牛顿法 Jacobian 的稀疏模式

06-3 配电网节点—支路关联矩阵

06-4 通信网络邻接矩阵

06-5 状态估计量测雅可比矩阵的非零元

代码
以下 5 个函数取自 code/第一批_分布与矩阵261107.py,直接调用即可出图。样式(宋体 + Times、10 磅、刻度朝内四边、留白自检)由 code/公共配置261107.py 的 setup_cn_style() 和 save() 统一提供,本节不再重复。
# 摘自 code/第一批_分布与矩阵261107.py
def spy_01():
"""节点导纳矩阵的稀疏结构。"""
fig, ax = new_fig(left=0.24, bottom=0.24, right=0.86, top=0.92)
n = 60
M = np.zeros((n, n))
for i in range(n):
M[i, i] = 1
for k in (-2, -1, 1, 2):
if 0 <= i + k < n:
M[i, i + k] = M[i + k, i] = 1
im = ax.spy(M, markersize=1.0, color=C1)
ax.set_aspect("auto")
ax.set_xlabel("列索引")
ax.set_ylabel("行索引")
save(fig, "06_稀疏矩阵", "06_稀疏矩阵_节点导纳矩阵")
def spy_02():
"""牛顿法 Jacobian 的稀疏模式。"""
fig, ax = new_fig(left=0.24, bottom=0.24, right=0.86, top=0.92)
n = 80
M = np.zeros((n, n))
for i in range(0, n, 2):
M[i, i] = M[i, i + 1] = 1
M[i + 1, i] = M[i + 1, i + 1] = 1
if i + 2 < n:
M[i, i + 2] = M[i + 1, i + 3] = 1
ax.spy(M, markersize=1.0, color=C1)
ax.set_aspect("auto")
ax.set_xlabel("状态变量列")
ax.set_ylabel("方程行")
save(fig, "06_稀疏矩阵", "06_稀疏矩阵_Jacobian稀疏模式")
def spy_03():
"""配电网节点—支路关联矩阵。"""
fig, ax = new_fig(left=0.24, bottom=0.24, right=0.86, top=0.92)
rng = np.random.default_rng(603)
nodes, br = 30, 34
M = np.zeros((nodes, br))
for b in range(br):
i = int(rng.integers(0, nodes))
j = int(rng.integers(0, nodes))
M[i, b] = 1
M[j, b] = -1
im = ax.spy(M, markersize=1.4, color=C1)
ax.set_aspect("auto")
ax.set_xlabel("支路编号")
ax.set_ylabel("节点编号")
save(fig, "06_稀疏矩阵", "06_稀疏矩阵_节点支路关联矩阵")
def spy_04():
"""通信网络邻接矩阵。"""
fig, ax = new_fig(left=0.24, bottom=0.24, right=0.86, top=0.92)
rng = np.random.default_rng(604)
n = 50
M = np.zeros((n, n))
for i in range(n):
for j in range(i + 1, min(i + 4, n)):
if rng.random() > 0.25:
M[i, j] = M[j, i] = 1
ax.spy(M, markersize=1.0, color=C3)
ax.set_aspect("auto")
ax.set_xlabel("终端编号")
ax.set_ylabel("终端编号")
save(fig, "06_稀疏矩阵", "06_稀疏矩阵_通信网络邻接矩阵")
def spy_05():
"""状态估计量测雅可比矩阵的非零元。"""
fig, ax = new_fig(left=0.24, bottom=0.24, right=0.86, top=0.92)
rng = np.random.default_rng(605)
m, n = 64, 32
M = np.zeros((m, n))
for i in range(m):
j = int(i * n / m)
M[i, j] = 1
if j + 1 < n:
M[i, j + 1] = 1
if rng.random() > 0.55 and j > 0:
M[i, j - 1] = 1
ax.spy(M, markersize=1.0, color=C1)
ax.set_aspect("auto")
ax.set_xlabel("状态变量")
ax.set_ylabel("量测量")
save(fig, "06_稀疏矩阵", "06_稀疏矩阵_量测雅可比矩阵")
说明
- 图片尺寸 1181×944 px(100 mm × 80 mm @ 300 dpi),三维图为 1181×1122 px。
- 图内不放标题,图题由本文件的二级/三级标题承担。
- 数据为贴近广东实际量级的仿真算例,随机种子固定,重跑结果一致。
浙公网安备 33010602011771号