我不明白为什么我收到此错误消息。我已经实现了Gauss-Newton求解器来求解线性方程组。
它一直在"for i=1:m"
function [x, l] = GS(A, b, x0, TOL)
[m n] = size(A);
l = 1;
x = [0;0;0];
while (true)
for i=1:m
sum1 = 0; sum2 = 0;
for j=1:i-1
sum1 = sum1 + A(i,j)*x(j);
for j=i+1:n
sum2 = sum2 + A(i,j)*x(j);
end
end
x(i) = (-sum1-sum2+b(i))./A(i,j);
end
if abs(norm(x) - norm(x0)) < TOL
break
end
x0 = x;
l = l + 1;
end
答案 0 :(得分:0)
您的代码有三个问题。
for
循环语句未对齐。具体来说,您忘记在end
循环中的第一个for
循环的末尾放置i
关键字(即for j = 1 : i-1
)j = 1, 2
到i-1
的当前解决方案计算Gauss-Newton的值。第一个for
循环需要使用x
,而从for
到j = i+1
的第二个n
循环需要使用x0
。x
的每个值时,您需要除以正确的对角线系数。 因此:
function [x, l] = GS(A, b, x0, TOL)
[m n] = size(A);
l = 1;
x = [0;0;0];
while (true)
for i=1:m
sum1 = 0; sum2 = 0;
for j=1:i-1 %// CHANGE
sum1 = sum1 + A(i,j)*x(j); %// CHANGE
end
for j=i+1:n %// CHANGE
sum2 = sum2 + A(i,j)*x0(j);
end
x(i) = (-sum1-sum2+b(i))./A(i,i); %// CHANGE
end
if abs(norm(x) - norm(x0)) < TOL
break
end
x0 = x;
l = l + 1;
end
format long;
A = [6 1 1; 1 5 3; 0 2 4]
b = [1 2 3].';
[x,i] = GS(A, b, [0;0;0], 1e-10)
x =
0.048780487792648
-0.085365853612062
0.792682926806031
i =
21
这意味着需要21次迭代才能获得容差为1e-10
的解决方案。将其与MATLAB的内置逆函数进行比较:
x2 = A \ b
x2 =
0.048780487804878
-0.085365853658537
0.792682926829268
如您所见,我指定了1e-10
的容差,这意味着我们保证精确到10位小数。我们当然可以看出Gauss-Newton给我们提供的10个小数位精度与MATLAB给我们内置的结果。