代码不工作的原因是
if
您的
for
循环。具体来说,您需要累加特定行的所有值
不要
首先属于该行的对角线。一旦完成,你
然后
执行分割。你还需要确保你除以
A
对于您所关注的行,它对应于
x
你想解决的问题。您还需要删除
i=1
语句。您正在重置
i
每次。
换句话说:
function [x, i] = Jacobi(A, b, x0, TOL)
[m n] = size(A);
i = 0;
x = [0;0;0];
while (true)
for r=1:m
sum = 0;
for c=1:n
if r==c %// NEW
continue;
end
sum = sum + A(r,c)*x(c); %// NEW
end
x(r) = (-sum + b(r))/A(r,r); %// CHANGE
end
if abs(norm(x) - norm(x0)) < TOL;
break
end
x0 = x;
i = i + 1;
end
示例用法:
A = [6 1 1; 1 5 3; 0 2 4]
b = [1 2 3].';
[x,i] = Jacobi(A, b, [0;0;0], 1e-10)
x =
0.048780487792648
-0.085365853612062
0.792682926806031
i =
20
这意味着需要20次迭代才能获得具有容差的解决方案
1e-10
。将其与MATLAB的内置逆函数进行比较:
x2 = A \ b
x2 =
0.048780487804878
-0.085365853658537
0.792682926829268
如您所见,我指定了公差
第1页-10页
,这意味着我们保证有10位小数的精度。我们当然可以看到,雅各比给我们的精度和MATLAB给我们的内置精度相差10个小数点。