2017-11-27 75 views
1

私は、トリディア線の一次方程式系を解くプログラムをOctaveで書くつもりです。特定の部分は、私のデータが通常のnxn行列に保存されていないが、各列がそれぞれ下側、上側、上側の対角線を表すnx3の行列であることです。オクターブの三重対角行列上でのメモリ最適化ガウス - ザイデル反復

私はすでに通常の行列のための関数的反復プロセスを開発しましたが、この場合、何らかの形でインデックス作成権を得ることができません(コードは多かれ少なかれ同じだと思います)。 A(1,1)とA(n、3)は常に空です。

A = [ 0, 1, 1; 
     1, 1, 1; 
     1, 1, 0 ] 

# represents M = [ 1, 1, 0; 
#     1, 1, 1; 
#     0, 1, 1 ] 

b = [ 3, 2, 1 ] 

n = 3 

x_new = [2 2 2] 
x_old = [2 2 2] 

for iter = 1:16 
    disp(iter) 
    for i = 1:n 

    if i == 1 
#  disp(A(i,:)) 
#  disp("first") 
     x_new(i) = (1/A(i, 2)) * (b(i) - A(i, 3)*x_old(i+1)); 
    elseif i == n 
#  disp(A(i,:)) 
#  disp("last") 
     x_new(i) = (1/A(i, 2)) * (b(i) - A(i, 1)*x_new(i-1)); 
    else 
     x_new(i) = (1/A(i, 2)) * (b(i) - A(i, 1)*x_new(i-1) - A(i, 3)*x_old(i+1)); 
    end  

    x_old = x_new; 
    end 
end 

disp(x_old) 

ヒント?私はオクターブと代数には新しいです。

答えて

0

mは、斜めに優勢でも陽性でもない。正定検査には関数chol()を使用してください。

割り当てx_old = x_newは、内側のループであってはならない。

while it < maxit 
    x_old = x_new; 
    x_new(1) = (1/A(1, 2)) * (b(1) - A(1, 3) * x_old(2)); 

    for i = 2 : n - 1 
     x_new(i) = (1/A(i, 2)) * (b(i) - A(i, 1) * x_new(i - 1) - A(i, 3) * x_old(i + 1)); 
    end 

    x_new(n) = (1/A(n, 2)) * (b(n) - A(n, 1) * x_new(n - 1)); 

    if norm(x_new - x_old, 'inf') <= max_error 
     break 
    end 
    it = it + 1; 
end 
+0

あなたが正しいです。どちらも問題でした。コードは今動作します! –

関連する問題