Soru sorJacobi İterasyonunu Gauss-Seidel'e Dönüştürme
Kalemlik tarafından 5 yıl önce soruldu

Herkese Merhabalar.
Öncelikle yeni yeni Matlab programına başlamaktayız. Derslerimizde çözümlere ek yöntem olarak gösteriliyor. Yani Matlab için herhangi bir ders almadık ve altyapımız maalesef yok. Derslerimizde kullanırken ezber kalıplar üzerinden gidip durumları çözmeye çalışıyoruz. Kodları birbiriyle karşılaştırıp aradaki farkları öğrenip işlemlerimizi yapıyoruz. Anlayışla karşılarsanız çok seviniriz.
Elimizde jacobi yöntemi ile yazılmış bir kod kümesi var ve bunuGauss-Seidel e dönüştürmek istiyoruz. Fakat Matlab da yeni olduğumuz için bir türlü işin içinden çıkamadık. Yardımcı olabilirseniz seviniriz.

clear all
b=[5/2 3/2 1 1 3/2 5/2];
a=[3 -1 0 0 0 1/2;-1 3 -1 0 1/2 0;0 -1 3 -1 0 0;0 0 -1 3 -1 0;0 1/2 0 -1 3 -1;1/2 0 0 0 -1 3];
x0=[0 0 0 0 0 0];
N=size(b,2);
imax=100;
for i=1:1:imax
for j=1:1:N
x(i,j)=b(j)/a(j,j)+x0(j);
KK=0;
for k=1:1:N
KK=KK+a(j,k)*x0(k);
end
x(i,j)=x(i,j)-KK/a(j,j);
end
if abs(x(i,:)-x0)<10^-4
break
end
if i==imax
disp('Error Hata')
end
x0=x(i,:);
end
4 Cevap
sayginer Yönetici tarafından 5 yıl önce cevaplandı

Merhaba,
İçerisinde bulunduğunuz karmaşık durumu anlayabiliyorum. Bir konunun teorisini anlamaya çalışırken bir yandan da pratik olarak onu uygulamaya çalışmak oldukça zor olabiliyor. Ancak sakın pes etmeyin. Biraz daha kendinizi zorlarsanız işte o zaman öğrenmeye başladığınızı göreceksiniz. Bu sayfa üzerinden de takıldığınız kısımları her zaman sorabilirsiniz. Soruları cevaplayan bütün gönüllü arkadaşlar ile sizlere yardımcı olmaya çalışacağız.
Sorduğunuz soruya gelecek olursak, anladığım kadarı ile, Jakobi yöntemi kullanan bir çözümü Gauss-Seidel yöntemi ile de gerçekleştirmek istiyorsunuz. Peki bu iki yöntem ne işe yarıyor? Bu yöntemler ile ne çözmeye çalışıyorsunuz? Bu iki yöntemin matematiksel olarak birbirlerinden farkları nelerdir? Eğer bu soruların cevaplarını matematiksel olarak verebilirseniz, bu yöntemlerin MATLAB ile uygulanmasını da gerçekleştirebiliriz.
Naçizane tavsiyem, elinizdeki kodu olabildiğince,satır satır, anlayıp yorumlamaya çalışın. Hatta her satırın yanına % (yüzde işareti) koyarak o satırda ne yaptığınızı uzun uzun yorum olarak yazın. MATLAB ile bir problemin uygulanmasındaki temel sorunun arkaplanındaki matematiğin yeterince anlaşılamamış olması yatmaktadır. Teorik olarak problemimizi olabildiğince iyi tanımlamalıyız.
Kolay gelsin,
 

Kalemlik tarafından 5 yıl önce cevaplandı

Cevabınız için teşekkürler. Matematiksel olarak Jacobi ve Gauss-Seidel Farkını biliyorum ve işleme dökünce soruları çözebiliyorum. Yani Jacobi Her iterasyon satırında yeni bir değer alırken Gauss-Seidel İlk iterasyondaki çözüm değerini bir sonraki satırda alıp işleme uyguluyoruz. (Tabi yine eksiklerimiz var farkındayım ) Buraya kadar pek sorun yok. Sorunum Tamamı ile matlab ı anlamakla alakalı. Yani KK nereden geldi. Küçük k yı işleme neden soktuk gibi. Şu ana kadar çözümü bulamadık. Umarım iş+eğitim+ bu ekstra sorular işin içinden çıkabiliriz.
Cevabınız için çok teşekkürler. İyi çalışmalar.

hakkans Yönetici tarafından 5 yıl önce cevaplandı

Merhaba,
Verdiğiniz kodu yorum ekleyerek açıklamanın faydalı olabileceğini düşündüm. Satırların yanındaki % işareti sonrası yorumlu kısımları temsil etmektedir:

clear all %Bütün çalışma alanındaki değişkenleri yeni çalışma öncesi temizler
b=[5/2 3/2 1 1 3/2 5/2]; % Ax=b şeklindeki lineer denklem sisteminin b vektörünü ifade etmektedir.
a=[3 -1 0 0 0 1/2;-1 3 -1 0 1/2 0;0 -1 3 -1 0 0;0 0 -1 3 -1 0;0 1/2 0 -1 3 -1;1/2 0 0 0 -1 3]; %Ax=b eşitliğindeki A matrisi
% Mesela matrisin ilk satırından hareketle ilk eşitliği 3x_1-x_2+0*x_3+0*x_4+0*x_5+1/2*x_6=5/2 yazabiliriz
%5/2 b vektöründen gelmektedir. x0=[0 0 0 0 0 0]; %Bu vektör çözüm için başlangıç tahminini göstermektedir. N=size(b,2); %N çözülecek değişken sayısıdır.
%size() fonksiyonu kaça kaç bir matris/vektör olduğunu verir. b bir satır vektörü olduğu için eleman
%sayısı olan 6'yı size()'ın döndürdüğü ikinci çıktıdan alırız. Bu yüzden size(b,2) yazıyoruz. imax=100; %imax en fazla kaç iterasyon boyunca çözüm için hesap yapılacağını göstermektedir. for i=1:1:imax %for döngüsü, istenen seferde döngü içindeki eylemleri gerçekleştirir. Burada biz imax sefer bu döngü içindeki işlemleri yapacağız for j=1:1:N %Bu döngü ise tek tek her bir değişkenin yeni iterasyondaki değerini hesaplamak içindir. x(i,j)=b(j)/a(j,j)+x0(j); %j'nci x değeri, i'nci iterasyonda bu formülden (Jacobi) hesaplanan değeri alacaktır. %Bu satır algoritmanın bir kısmını içeriyor.
KK=0; %KK'yı 0 olarak tanımlayıp aşağıdaki döngüye hazırlıyoruz. for k=1:1:N %Bu döngüde ise j'nci x değerinin diğer elemanlar tarafından katkısını hesaplıyoruz. KK=KK+a(j,k)*x0(k); end
%Bu koddaki yaklaşım şu: Yukarıdaki eşitlikte 3x_1-x_2+0*x_3+0*x_4+0*x_5+1/2*x_6=5/2 bulmuştuk.
%Burada x_1 = 5/6+1/3*x_2-1/6*x_6 olarak buluruz. Yukarıdaki döngü, 1/3*x_2-1/6*x_6 kısmını,
%daha yukarıdaki x(i,j)=b(j)/a(j,j)+x0(j); ise 5/6 kısmını hesaplamaktadır. x(i,j)=x(i,j)-KK/a(j,j); %Bu kısımda bu iki parça toplanmaktadır. end if abs(x(i,:)-x0)<10^-4 %Eğer iki iterasyon arası fark 10^-4'ten az ise, yakınsamışız demektir, iterasyonlara devam etmek gerekmez. break %break komutu sizi döngüden çıkarır end if i==imax %i imax'a ulaşmış ve yakınsama şartı sağlanmamışsa, hata verilecektir. disp('Error Hata') end x0=x(i,:); %Bir dahaki iterasyonda mevcut iterasyon sonucu elde edilmiş değerlerin kullanılması için yeni elde
%edilmiş değerler x0'a atanmaktadır. end

%Gauss Seidel için yapmanız gereken bu kod yapısında biraz zor olabilir. D-L-U matrisleriyle Gauss-Seidel iterasyon
%matrisleri çıkarılıyor, internette bulabilirsiniz. Bu matrisleri kullanırsanız hesaplamalar daha kolay olacaktır.
Kalemlik tarafından 5 yıl önce cevaplandı

Çok Teşekkür ederim.
Yüzme bilmeden havuza rampadan atlamak benim durumumu çok iyi anlatıyor. Artık Böyle böyle öğreneceğiz. 
Herkese İyi çalışmalar.