寻找 SOR 的最佳权重因子
Finding optimal weight factor for SOR
我正在使用 SOR 方法,需要找到最佳权重因子。我认为解决这个问题的一个好方法是 运行 我的 SOR 代码和从 0 到 2 的 omegas 数量,然后存储每个这些的迭代次数。然后我可以看到哪个迭代是最低的,它对应于哪个 omega。然而,作为一名新手程序员,我不确定如何去做。
这是我的 SOR 代码:
function [x, l] = SORtest(A, b, x0, TOL,w)
[m n] = size(A); % assigning m and n to number of rows and columns of A
l = 0; % counter variable
x = [0;0;0]; % introducing solution matrix
max_iter = 200;
while (l < max_iter) % loop until max # of iters.
l = l + 1; % increasing counter variable
for i=1:m % looping through rows of A
sum1 = 0; sum2 = 0; % intoducing sum1 and sum2
for j=1:i-1 % looping through columns
sum1 = sum1 + A(i,j)*x(j); % computing sum using x
end
for j=i+1:n
sum2 = sum2 + A(i,j)*x0(j); % computing sum using more recent values in x0
end
x(i) =(1-w)*x0(i) + w*(-sum1-sum2+b(i))/A(i,i); % assigning elements to the solution matrix.
end
if abs(norm(x) - norm(x0)) < TOL % checking tolerance
break
end
x0 = x; % assigning x to x0 before relooping
end
end
这很容易做到。简单地遍历 w
的值并确定每个 w
处的迭代总数。函数完成后,检查这是否是当前获得解决方案所需的最小迭代次数。如果是,则更新最终解决方案。一旦我们遍历所有 w
,结果将是产生最少迭代收敛次数的解向量。请记住,SOR 具有 w
,因此它 不 包括 w = 0
或 w = 2
,或 0 < w < 2
,因此我们可以范围内不包括 0 或 2。因此,做这样的事情:
omega_vec = 0.01:0.01:1.99;
final_x = x0;
min_iter = intmax;
for w = omega_vec
[x, iter] = SORtest(A, b, x0, TOL, w);
if iter < min_iter
min_iter = iter;
final_x = x;
end
end
循环检查每个 w
处的迭代总数是否小于当前最小值。如果是,记录它并记录解向量是什么。 w
中最小的最终解向量将存储在 final_x
.
中
我正在使用 SOR 方法,需要找到最佳权重因子。我认为解决这个问题的一个好方法是 运行 我的 SOR 代码和从 0 到 2 的 omegas 数量,然后存储每个这些的迭代次数。然后我可以看到哪个迭代是最低的,它对应于哪个 omega。然而,作为一名新手程序员,我不确定如何去做。
这是我的 SOR 代码:
function [x, l] = SORtest(A, b, x0, TOL,w)
[m n] = size(A); % assigning m and n to number of rows and columns of A
l = 0; % counter variable
x = [0;0;0]; % introducing solution matrix
max_iter = 200;
while (l < max_iter) % loop until max # of iters.
l = l + 1; % increasing counter variable
for i=1:m % looping through rows of A
sum1 = 0; sum2 = 0; % intoducing sum1 and sum2
for j=1:i-1 % looping through columns
sum1 = sum1 + A(i,j)*x(j); % computing sum using x
end
for j=i+1:n
sum2 = sum2 + A(i,j)*x0(j); % computing sum using more recent values in x0
end
x(i) =(1-w)*x0(i) + w*(-sum1-sum2+b(i))/A(i,i); % assigning elements to the solution matrix.
end
if abs(norm(x) - norm(x0)) < TOL % checking tolerance
break
end
x0 = x; % assigning x to x0 before relooping
end
end
这很容易做到。简单地遍历 w
的值并确定每个 w
处的迭代总数。函数完成后,检查这是否是当前获得解决方案所需的最小迭代次数。如果是,则更新最终解决方案。一旦我们遍历所有 w
,结果将是产生最少迭代收敛次数的解向量。请记住,SOR 具有 w
,因此它 不 包括 w = 0
或 w = 2
,或 0 < w < 2
,因此我们可以范围内不包括 0 或 2。因此,做这样的事情:
omega_vec = 0.01:0.01:1.99;
final_x = x0;
min_iter = intmax;
for w = omega_vec
[x, iter] = SORtest(A, b, x0, TOL, w);
if iter < min_iter
min_iter = iter;
final_x = x;
end
end
循环检查每个 w
处的迭代总数是否小于当前最小值。如果是,记录它并记录解向量是什么。 w
中最小的最终解向量将存储在 final_x
.