06 稀疏结构 spy

用途

只画非零元的位置,用来看节点导纳矩阵、Jacobian 的稀疏带宽。

示例(5 张)

06-1 节点导纳矩阵的稀疏结构

节点导纳矩阵的稀疏结构

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

牛顿法 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。
  • 图内不放标题,图题由本文件的二级/三级标题承担。
  • 数据为贴近广东实际量级的仿真算例,随机种子固定,重跑结果一致。
posted on 2026-11-07 01:04  小青蛙电气  阅读(3)  评论(0)    收藏  举报