1. ホーム
  2. matlab

[解決済み] 部分ピボットによるガウス消去の実装【終了しました

2022-02-09 01:42:01

質問

MATLABで部分ピボットによるガウス消去を実装するプログラムを書いています。行を直接交換するのではなく、行の交換を保存するために整数配列を作りました。

しかし、正しい結果を得ることができず、問題を把握することができませんでした。どのようにコードを修正すれば、正しい答えが得られるのでしょうか?

A=[1, -2, 1; 2, 1, -3; 4, -7, 1];
b=[0, 5, 1];
b=b';

function x = GE(A,b)

[m,n]= size(A); 
if m ~= n
  disp('Not a square');
end

for p=1:n
   array(p)=p;
endfor

A = [A,b];      

%elimination
for i = 1:n-1
    pivot = i;
    %select pivot
    for j = i+1:n
        if  abs(A(array(i),i)) < abs(A(array(i),i)) %row interchange
            temp = array(i);
            array(i) = array(j);
            array(j) = temp;
        end
    end

    while (pivot <= n && A(pivot,i)== 0)
        pivot = pivot+1;
    end
    if pivot > n
        disp('No unique solution');
        break
    else
        if pivot > i
            tem = array(i);
            array(i) = pivot
            pivot= tem;
        end
    end

    for j = i+1:n
        m = -A(array(j),i)/A(array(i),i);
        for k = i+1:n+1 
            A(array(j),k) = A(array(j),k) + m*A(array(i),k);
        end
    end
end

if A(n,n) == 0
    disp('No unique solution');
    return
end

%backward substitution
x(n) = A(array(n),n+1)/A(array(n),n);
for i = n - 1:-1:1
    sum = 0;
    for j = i+1:n
        sum = sum + A(array(i),j)*x(j);
    end
    x(i) = (A(array(i),n+1) - sum)/A(array(i),i);
end

endfunction

解決方法は?

あなたのエラーはとてもシンプルです。 ピボットが正しく行われていないのです。 if ステートメントを使用します。

for j = i+1:n
    if  abs(A(array(i),i)) < abs(A(array(i),i)) %row interchange <-------
        temp = array(i);
        array(i) = array(j);
        array(j) = temp;

    end
end

どの係数からピボットするかというチェックは、インデックスを使用しているため正しくありません。 i を使用する必要がある場合、列に沿ってチェックするために j . したがって、ブール条件の反対側を変更するだけで、その条件では j :

for j = i+1:n
    if  abs(A(array(i),i)) < abs(A(array(j),j)) %// CHANGE HERE
        temp = array(i);
        array(i) = array(j);
        array(j) = temp;

    end
end

あなたの例では Ab という答えが返ってきます。 x = [2 1 0] これは、MATLABの ldivide の演算を行います。 x = A \ b .