基于《多重网格教程第2版》的延拓算子矩阵构建疑问
代数多重网格延拓算子P的代码实现解析(基于《A Multigrid Tutorial, 2ed》第3章)
原文献公式翻译(延拓算子(P=I_{2h}^h)系数定义)
针对0-based索引的细网格节点(i=0,1,...,n_{min1})与粗网格节点(j=0,1,...,n_{div2_min1}),延拓算子的系数规则为:
- 若细网格节点恰好是粗网格节点((i=2j)):(P[i,j] = 1)
- 若细网格节点位于两个粗网格节点之间((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
相关产品推荐
相关产品推荐

