如何在matlab中特定的不收敛迭代准则?

时间:2013-04-09 17:27:12

标签: matlab matrix

大家好,这就是我做了什么来执行迭代方法(高斯赛德尔),我希望当迭代次数大于30时,它将停止并生成相应的结果,最多30次迭代。但我想知道为什么输出result如此奇怪,我尝试通过键入x_ans(:,1)来检查命令窗口上的值,它给出了正确的值。它真的让我感到沮丧,为什么生成结果不一样。或者可以使用任何其他情况或函数来设置不收敛条件。真诚地感谢每一位帮助。

clear;clc
A = [2 8 3 1;0 2 -1 4;7 -2 1 2;-1 0 5 2]
B = [-2;4;3;5]
Es = 1e-5


n = length(B);
x = zeros(n,1);
Ea = ones(n,1);
iter = 0;

while max(Ea) >= Es
    if iter <= 30
        iter = iter + 1;
        x_old = x;
        for i = 1:n
           j = 1:n;
           j(i) = [];
            x_cal = x;
            x_cal(i) = [];
            x(i) = (B(i) - sum(A(i,j) * x_cal)) / A(i,i);
        end
    else
        break
    end

    x_ans(:,iter) = x;
    Ea(:,iter) =abs(( x - x_old) ./ x);

    end

result = [1:iter; x_ans; Ea]'

1 个答案:

答案 0 :(得分:0)

我已经完成了公式,他们都没问题。在旁注中,总和不是必需的。问题在于您的输入数据 - 尝试重新排序!检查例如以下哪个有效

A = [7 -2 1 2;
     2 8 3 1;
     -1 0 5 2;
     0 2 -1 4;]
B = [3;-2;5;4]

在融合下看wiki