C İle Matrix-Gauss İşlemi
-
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { float x[9]; float B[9]; float a[9][9]; int k,i,j,z; float L=0; float U=0; //G sistem büyüklüğü max 20 int G; float W=1.50;// relax katsayısı cout<<"sistemin boyutunu girinz"<<endl; // cin>>G; G=9; // başlangıç çözüm vektörü for(i=1;i<=G;i++) { x[i] =1; } // b vektörünü giriniz cout<<"denkelm sisteminin sag tarafını giriniz"<<endl; for (i=1;i<=G;i++) { cin>>B[i]; cout<<endl; } cout<<"denkelm sisteminin katsayılarını giriniz giriniz"<<endl; /* for ( i=1;i<=G;i++) { for (j=1;j<=G;j++) { cout<<endl; cout<<"satir"<<i<<" sutun"<<j<<" "; cin>>a[i][j]; } } */ /* b[1]=18,b[2]=50,b[3]=21,b[4]=16; a[1][1]=4, a[1][2]=8, a[1][3]=3, a[1][4]=0; a[2][1]=0, a[2][2]=11, a[2][3]=-6, a[2][4]=20; a[3][1]=9, a[3][2]=20, a[3][3]=6, a[3][4]=14; a[4][1]=0, a[4][2]=3, a[4][3]=8, a[4][4]=7; i=1,j=1; */ /* B[1]=1; B[2]=2, B[3]=3, B[4]=4, B[5]=5; B[6]=4, B[7]=3, B[8]=2, B[9]=1;*/ a[1][1]=2 ,a[1][2]=1, a[1][3]=0, a[1][4]=0, a[1][5]=0, a[1][6]=0, a[1][7]=0, a[1][8]=0, a[1][9]=0; a[2][1]=1, a[2][2]=2, a[2][3]=1, a[2][4]=0, a[2][5]=0, a[2][6]=0, a[2][7]=0, a[2][8]=0, a[2][9]=0; a[3][1]=0, a[3][2]=1, a[3][3]=2, a[3][4]=1, a[3][5]=0, a[3][6]=0, a[3][7]=0, a[3][8]=0, a[3][9]=0; a[4][1]=0, a[4][2]=0, a[4][3]=1, a[4][4]=2, a[4][5]=1, a[4][6]=0, a[4][7]=0, a[4][8]=0, a[4][9]=0; a[5][1]=0, a[5][2]=0, a[5][3]=0, a[5][4]=1, a[5][5]=2, a[5][6]=1, a[5][7]=0, a[5][8]=0, a[5][9]=0; a[6][1]=0, a[6][2]=0, a[6][3]=0, a[6][4]=0, a[6][5]=1, a[6][6]=2, a[6][7]=1, a[6][8]=0, a[6][9]=0; a[7][1]=0, a[7][2]=0, a[7][3]=0, a[7][4]=0, a[7][5]=0, a[7][6]=1, a[7][7]=2, a[7][8]=1, a[7][9]=0; a[8][1]=0, a[8][2]=0, a[8][3]=0, a[8][4]=0, a[8][5]=0, a[8][6]=0, a[8][7]=1, a[8][8]=2, a[8][9]=1; a[9][1]=0, a[9][2]=0, a[9][3]=0, a[9][4]=0, a[9][5]=0, a[9][6]=0, a[9][7]=0, a[9][8]=1, a[9][9]=2; for(i=1;i<=9;i++) { cout<<"B"<<i<<B[i]<<endl; } for (k=1;k<=10;k++) { for(i=1;i<=G;i++) { //L L=0; cout<<"x"<<i<<endl; for( j=1;j<=i-1;j++) { L=(a[i][j])*(x[j])+L; } cout<<"**"<<endl; // U U=0; for (j=i+1;j<=G;j++) { U=(a[i][j])*(x[j])+U; } //monitör cout<<"w="<<W<<"x"<<i<<"="<<x[i]<<" b"<<i<<"="<<B[i]<<" "<<"a"<<a[i][i]; cout<<" U"<<U<<" L"<<L<<endl; //cout<<(1-W)x[i] x[i]= (1-W)*x[i]+W*(B[i]-U-L)/a[i][i]; cout<<"x"<<i<<"="<<x[i]<<endl; //x[i][k]= (b[i]-U-L)/a[i][i]; cout<<"ara"; //cin>>z; } } cout<<endl; for (i=1;i<=G;i++) { cout<<"cozum vektor"<<endl; cout<<x[i]<<" "<<endl; } system("PAUSE"); return EXIT_SUCCESS; } -
Arkadaşlar yukarıdaki program Gauss siedel SOR algoritması için yazdığım bir kod idi güya ..
Fakat bir türlü doğru sonuç vermiyor..
Biraz kurcalayınca B [] sabitlerine yaptığım girdileri almadığını kafasınagöre birşeyler kullandığını gördüm..
Monitör satırnda siz de görürsünüz..
Nerde bir yanlışlığım var??
-
edit
-
C de arraylerin inde indexi 1 den değil 0 dan başlar. Aşağıda a[9][9] luk arrayine a[1][1] den başlayarak değer vermeye başlamışşın ve 9 a kadar gitmişssin :) Halbuki a[0][0], a[0][1], a[0][2]... diye gitmen gerekiyordu ve en fazla 8 e kadar gitmen gerekiyordu. Bunu düzelt, belki düzelir ? Yani yaptığın aslında yanlış değil, böyle de çalışır fakat, sen array için ayrılmış 9 luk yere, birincisini boş bırakarak 10. yere veriyi yazıyorsun. Belki a[9] ve sonrası indexler başka programlar veya herhangi birşey tarafından kullanılıyor ? Bu yüzden senin [8][8] den a[9][9] a kadar kullandığın yerler belki de başka birşeyler tarafından değiştirilyordur :)
-
A[10] dediğin zaman A0, A1...A10 açılır.. A0'a değer atama zorunluluğum yok diye biliyorum C++ da..
-
Onlara da baktım .. dediğn gibi olsa hiç değilse dizi bir adım kayar...
giriş döngüsünden sonra yazdırdım B dizisini yine aynı saçma sonuç verdi :((
-
Garip ama gerçeklik bir olay.. B vektörü yerine C vektörü kullandım.. ve çalıştı...
-
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { float a[10][10]; float x[9][21]; float C[9]; float L,U,W; int k,i,j,z; int G; G=9; W=1.5; for (i=1;i<=G;i++) { cout<<" C vektörünü giriniz"<<endl; cin>>C[i]; } cout<<" C vektörü"<<endl; for (i=1;i<=G;i++) { cout<<C[i]<<endl; } cout<<"****"; for (i=1;i<=9;i++) { x[i][0]=1; } cout<<"****"<<endl; /* for (i=1;i<=9;i++) { cout<<x[i][0]<<endl; } cin>>z; */ a[1][1]=2, a[1][2]=1, a[1][3]=0, a[1][4]=0, a[1][5]=0, a[1][6]=0, a[1][7]=0, a[1][8]=0, a[1][9]=0; a[2][1]=1, a[2][2]=2, a[2][3]=1, a[2][4]=0, a[2][5]=0, a[2][6]=0, a[2][7]=0, a[2][8]=0, a[2][9]=0; a[3][1]=0, a[3][2]=1, a[3][3]=2, a[3][4]=1, a[3][5]=0, a[3][6]=0, a[3][7]=0, a[3][8]=0, a[3][9]=0; a[4][1]=0, a[4][2]=0, a[4][3]=1, a[4][4]=2, a[4][5]=1, a[4][6]=0, a[4][7]=0, a[4][8]=0, a[4][9]=0; a[5][1]=0, a[5][2]=0, a[5][3]=0, a[5][4]=1, a[5][5]=2, a[5][6]=1, a[5][7]=0, a[5][8]=0, a[5][9]=0; a[6][1]=0, a[6][2]=0, a[6][3]=0, a[6][4]=0, a[6][5]=1, a[6][6]=2, a[6][7]=1, a[6][8]=0, a[6][9]=0; a[7][1]=0, a[7][2]=0, a[7][3]=0, a[7][4]=0, a[7][5]=0, a[7][6]=1, a[7][7]=2, a[7][8]=1, a[7][9]=0; a[8][1]=0, a[8][2]=0, a[8][3]=0, a[8][4]=0, a[8][5]=0, a[8][6]=0, a[8][7]=1, a[8][8]=2, a[8][9]=1; a[9][1]=0, a[9][2]=0, a[9][3]=0, a[9][4]=0, a[9][5]=0, a[9][6]=0, a[9][7]=0, a[9][8]=1, a[9][9]=2; for (k=1;k<=10;k++) { for(i=1;i<=G;i++) { L=0; for (j=1;j<=i-1;j++) { L=(a[i][j])*(x[j][k])+L; } U=0; for (j=i+1;j<=G;j++) { U=(a[i][j])*(x[j][k-1])+U; } // cout<<"L="<<L<<"U="<<U<<endl; x[i][k]=(1-W)*(x[i][k-1])+W*((C[i]-U-L))/(a[i][i]); //cout<<"x"<<i<<" L="<<L<<" U="<<U<<" C"<<i<<" "<<C[i]<<endl; //cout<<"x"<<i<<k<<" "<<x[i][k]<<endl; //cin>>z; } cout<<endl; cout<<k<<"inci tur sonunda çözüm vektörü"<<endl; for (i=1;i<=G;i++) { cout<<"x"<<x[i][k]<<" "<<endl; } } /*for (j=1;j<=9;j++) { for(i=1;i<=9;i++) { cout<<a[i][j]<<endl; } cin>>z; } */ system("PAUSE"); return EXIT_SUCCESS; } -
Bir de arkadaşlar .. Bu iterasyon yönteminin çalışması için katsayılar matrisiin özdeğerlerinin 1den küçük olması gerekiyormuş.. Yoksa çözüm yakınsamaz...
-
yarın bı bakaayım
-
ltcelik bunu yazdı:
-----------------------------
A[10] dediğin zaman A0, A1...A10 açılır.. A0'a değer atama zorunluluğum yok diye biliyorum C++ da..
-----------------------------Yok abi A10 açılmıyor. Daha doğrusu belki açılıyordur da, senin arrayinin bittiğini filan anlamak için kullanılıyordu galiba. O yüzden hani iyi bir c++ sı gibi, indexlere 0 dan başla istersen abi. Döngülerde kullandığın i, j, k gibi index değerlerini yine döngü için de 1 den başlat ama, a[i-1] gibi kullan, inan bana ileride c++ kullanırım diyorsan, buna alış, yoksa ilerde çok külfetini çekersin :/
