能否在同一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
相关产品推荐
相关产品推荐

