You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于《多重网格教程第2版》的延拓算子矩阵构建疑问

代数多重网格延拓算子P的代码实现解析(基于《A Multigrid Tutorial, 2ed》第3章)

原文献公式翻译(延拓算子(P=I_{2h}^h)系数定义)

针对0-based索引的细网格节点(i=0,1,...,n_{min1})与粗网格节点(j=0,1,...,n_{div2_min1}),延拓算子的系数规则为:

  1. 若细网格节点恰好是粗网格节点((i=2j)):(P[i,j] = 1)
  2. 若细网格节点位于两个粗网格节点之间((i=2j+1)):(P[i,j] = \frac{1}{2}),(P[i,j+1] = \frac{1}{2})

代码实现的核心逻辑(适配Julia的1-based索引)

Julia采用1-based索引,需先将原文献的0-based规则转换为Julia可用的索引逻辑,同时修正你原代码中的维度与循环错误:

1. 修正矩阵维度

若细网格有7个节点(对应0-based的(0\sim6)),粗网格节点数应为4个(对应0-based的(0\sim3)),因此矩阵(P)的维度应为7行×4列,而非你原代码中的7行×3列。

2. 正确的代码实现

# 0-based索引的最大下标:粗网格到3,细网格到6
n_div2_min1 = 3
n_min1 = 6

# 初始化延拓矩阵:7行(细网格节点数)×4列(粗网格节点数)
P = zeros(n_min1 + 1, n_div2_min1 + 1)

# 遍历每个细网格节点(对应P的每一行)
for i_julia in 1:(n_min1 + 1)
    # 转换为原文献的0-based细网格索引
    i_0based = i_julia - 1
    
    if i_0based % 2 == 0
        # 情况1:细网格节点是粗网格节点,对应公式i=2j
        j_0based = i_0based ÷ 2
        j_julia = j_0based + 1  # 转成Julia的1-based索引
        P[i_julia, j_julia] = 1.0
    else
        # 情况2:细网格节点在两个粗网格节点之间,对应公式i=2j+1
        j_0based = (i_0based - 1) ÷ 2
        j_julia = j_0based + 1
        P[i_julia, j_julia] = 0.5
        P[i_julia, j_julia + 1] = 0.5
    end
end

3. 代码与公式的对应关系

  • 索引转换:把Julia的1-based索引i_julia转成原文献的0-based索引i_0based,完全对齐公式的变量定义。
  • 情况1处理:当i_0based是偶数时,满足公式(i=2j),计算出对应的粗网格0-based索引j_0based,再转回1-based赋值(P[i,j]=1)。
  • 情况2处理:当i_0based是奇数时,满足公式(i=2j+1),找到左侧的粗网格节点j_julia,给它和右侧相邻的粗网格节点各赋值(\frac{1}{2}),完全匹配公式要求。

你原代码的问题说明

  • 索引越界:Julia不允许0索引,你用j in 0:n_div2_min1会导致P[i,0]报错。
  • 逻辑错误:没有区分两种节点类型,直接重复赋值会覆盖之前的结果,无法实现公式的规则。
  • 维度错误:细网格7个节点对应粗网格4个节点,矩阵列数应为4而非3。

内容的提问来源于stack exchange,提问作者Jared

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:23:21