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

能否在同一for循环中运行两个迭代方程?附SOR方法报错问题

问题解决思路与修正代码

核心错误分析

  • 索引维度不匹配:h(:,1)是201×1的列向量,但你赋值的是单个标量(代码中用了未遍历的固定i索引),导致维度不兼容报错。
  • 缺少遍历逻辑:原代码未对矩阵的行i、列j做循环遍历,直接用h(i,j)更新却未定义i/j,本质上只更新了单个元素,完全不符合迭代要求。
  • 边界条件与迭代逻辑冲突:迭代中直接覆盖边界值,且第一列未针对每一行单独计算,同时错误的迭代顺序导致结果发散。

修正后的代码

% 初始化参数
ny1 = 201;
nx1 = 211;
InletPressure = 5;
niter = 1000; % 可根据收敛情况调整迭代次数
w = 1.8; % SOR松弛因子,需保持在(0,2)区间内

% 初始化beta常数矩阵
beta1 = 0.25 * ones(ny1, nx1);
beta2 = 0.25 * ones(ny1, nx1);
beta3 = 0.5 * ones(ny1, nx1);
beta4 = 0.5 * ones(ny1, nx1);

% 初始化压力水头矩阵,先设置固定边界
h = zeros(ny1, nx1);
h(1,:) = 0;
h(ny1,:) = InletPressure;

for it = 1:niter
    hn = h; % 保存上一轮迭代的完整结果,避免更新值干扰后续计算
    
    % 遍历内部行(排除上下固定边界行)
    for i = 2:ny1-1
        % 处理第一列(遵循方程1)
        numerator = beta2(i,1)*hn(i,2) + beta3(i,1)*hn(i-1,1) + beta4(i,1)*hn(i+1,1);
        denominator = beta2(i,1) + beta3(i,1) + beta4(i,1);
        h(i,1) = numerator / denominator;
        
        % 处理中间列(j=2到nx1-1,遵循方程2的SOR迭代)
        for j = 2:nx1-1
            numerator = beta1(i,j)*hn(i,j-1) + beta2(i,j)*hn(i,j+1) + beta3(i,j)*hn(i-1,j) + beta4(i,j)*hn(i+1,j);
            denominator = beta1(i,j) + beta2(i,j) + beta3(i,j) + beta4(i,j);
            h(i,j) = (1-w)*hn(i,j) + w*(numerator / denominator);
        end
    end
    
    % 处理最右列(不透水边界,等于前一列值)
    h(:,nx1) = h(:,nx1-1);
    
    % 重新固定上下边界,防止迭代过程中被修改
    h(1,:) = 0;
    h(ny1,:) = InletPressure;
    
    % 可选:添加收敛判断,提前终止迭代
    % if max(max(abs(h - hn))) < 1e-6
    %     break;
    % end
end

关键调整说明

  • 添加i/j循环遍历:逐行逐列更新每个内部点,确保所有元素参与迭代计算。
  • 分离区域计算逻辑:对第一列的每一行(非边界行)单独计算,保证赋值维度匹配。
  • 优化边界处理时机:每次迭代后重新固定上下边界,避免迭代过程中被意外覆盖。
  • 收敛性优化:可添加收敛判断提前终止迭代;若仍发散,可尝试减小SOR松弛因子w(比如调整为1.5)。

关于同一循环实现双迭代方程的问题

完全可以在同一循环中实现,只需满足三个条件:

  • 对不同区域(第一列/中间列)的元素分别遍历计算
  • 赋值操作的左右两边维度严格匹配
  • 迭代时基于上一轮的完整结果(hn)更新,避免用刚修改的值干扰后续计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:12:41