C++ ile Gauss Eleminasyon Örneği

Batuhan Düzgün tarafından yayınlanmıştır 21. October 2010 03:41

Merhaba arkadaşlar bu yazımda sizlere üniversite 2. sınıfta yapmış olduğum bir C++ ödevini anlatacağım.Sayısal Analiz dersinden hocamızın vermiş olduğu Gauss Eleminasyon yönetminin C++ ile yazılmış kaynak kodlarını veriyorum.Öncelikle Gauss Eleminasyon Yöntemi nedir bundan bahsedelim.
 
Gauss Eleminasyon Yöntemi
 
a11  a12  a13    x1     b1
 
a21  a22  a23    x2     b2
 
a31  a32  a33    x3     b3
 
Amacımız, x1,x2,x3 köklerini bulmak bunun için köşegen altında kalan elemanları sıfırlayıp kökleri bulmaktır amaç.
 
Şimdi de C++ kaynak kodlarını verelim.Kodlarda açıklamalar mevcuttur.
 
#include <cstdlib>
#include <iostream>
#include<conio.h>
using namespace std;

void hepsini_Bol(int);
void sifirla(int,int,int);
void tek_sutunlu_matris_bol(int);
void tek_matris_sifirla(int,int);
double matris[100][100];
double matris2[100][1];
double matristek[100][1];
double dizi[100];
double dizi1[2];
double dizi2[100];
double dizitek;
int n;

int main()
{
    cout<<"matrisin boyutunu giriniz...\n";
    cin>>n;
    //tek sütunlu çok satırlı matrisi alıyoruz.
    cout<<n<<"satirli tek sutunlu matris giriniz...\n";
    for(int i=1; i<=n; i++)
    {cin>>matristek[i][1];}

    for(int i=1; i<=n; i++)
    {
            for(int j=1; j<=n; j++)
            {
                    cout<<"matris elemanlarini giriniz...\n";
                    cin>>matris[i][j];//elemanları tek tek alıyoruz.
            }
    } 
    int i=1,j=1;
    int ara_sayac=1;
    while(i!=(n+1))//while döngüsü satır indisini aşağıdaki fonksiyonlara parametre olarak göndermek için
    {
        if(i==j)//eğer i ve j indisi eşitse aşağıdaki fonksiyon çağrılıyor.
        {
                hepsini_Bol(i);
                i++;//i 1 arttırılıp 2. satır için hazırlanıyor böyle bir artımla i sifirla fonksiyonu için sürekli satır parametresi gönderiyor
                //ilk önce 2 gönderiliyor çünkü birinci satırla ilgili işlerimiz bitti 1. satırı böldük çünkü 
        }
        else// yani bölme işlemi olduysa aşağıdaki fonksiyonları çağır yani artık sıfırlama yapılacak:)
        {
                int sayac=i;//geciçi bir değişken vasıtasıyla içerdeki while döngüsü için parametre oluşturuluyor
                while(sayac!=(n+1))//bu while n. satıra kadar sıfırlamak için açıldı dikkat!içerde sifirla fonksiyonu saklı:)
                {
                   sifirla(sayac,j,ara_sayac);//sfırla fonksiyonu 3 parametre birinci satır indis bilgisi ikinci sütun bilgisi
                    sayac++;   //üçüncü ise satır başındaki elemanı değişkene çekebilmek için 
                }
                j++; ara_sayac++;//en sonda sıfırlama biterse artık bir sonraki sütunu işaret et
        } 
    }
    cout<<"denklem sisteminin son hali\n";
    for(int i=1; i<=n; i++)
    {
            for(int j=1; j<=n; j++)
            {
                    cout<<matris[i][j]<<"  ";
            }
           // cout<<"\tx"<<i<<"\t"<<matristek[i][1];
            cout<<endl;
    }
    cout<<"gauss eleminasyon denkleminin kokleri\n";
    dizi2[n]=matristek[n][1];
    for(int i=1; i<=n; i++)
    {
            double t=0.0;
    
                            for(int k=n; k>i; k--)
                            {
                                    t=t+matris[i][k]*dizi2[k];
                            }
                            dizi2[n-i]=matristek[n-i][1]-t;
    }
    for(int i=1; i<=n; i++)
    {
            cout<<"x"<<i<<"\t"<<dizi2[i]<<endl;
    }
    getch();
    return 0;
}
    
void hepsini_Bol(int sayac)
{
     matristek[sayac][1]=matristek[sayac][1]/matris[sayac][sayac];//ilk bu satır yazılıyor ve tek sütunlu n satırlı matrisin ilk elemanı bölünüyor:)
             for(int j=n; j>0; j--)//for döngüüyle ilgili bütün satıra böle işlemi uygulanıyor:)
             {
                     matris[sayac][j]=matris[sayac][j]/matris[sayac][sayac];//bölme işlemi indislere dikkat edin kavraması kolay olacaktır
             }
}
void sifirla(int sayac_i,int sayac_j,int ara_say)
{
     double gecici=(-matris[sayac_i][sayac_j]);//sıfırlama için bülünen satırın isıfırlancak satırın ilk elemanıyla çarpılması lazım bunun için ilk elemanı gecici değişkene aldık
     dizitek=matristek[ara_say][1]*gecici;//burada sıfırlancak satırın ilk elemanıyla çarpıyoruz(dikkat gecici satırın ilk elemanının eksilisi:))
     matristek[sayac_i][1]=matristek[sayac_i][1]+dizitek;//burada sıfırlancak satırın karşısındaki tek sütunlu matrisin elemanıyla eksili satırın ilk elemanı toplanıyor:)
     for(int i=(sayac_j); i<=n; i++)//bu döngü nxn matrisinin satırlarını sfırlamak için
     {
             dizi[i]=matris[ara_say][i]*gecici;//sıfırlancak matris satırı geçici diziye alınıyor böylece matrisin orjinal satırı korunur
     }
     for(int j=sayac_j; j<=n; j++)//bu döngüde matris sütunları sıfırlanıyor:))
     {
             matris[sayac_i][j]=matris[sayac_i][j]+dizi[j];
     }                       
}
 
Projemizi Dev C++ ile çalıştıralım ve sonuçlar aşağıdaki gibidir.
 
 
 
 
Umarım faydalanabileceğiniz bir yazı olmuştur.Kaynak kod ve algoritması ben tarafından hazırlanmıştır.Bir sonraki makalemde görüşmek dileğiyle ...
 
Batuhan Düzgün
 
Sakarya Üniversitesi
 
Bilgisayar Mühendisliği 
 

Currently rated 3.5 by 4 people

  • Currently 3.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

Qt ve C++

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  November 2018  >>
MoTuWeThFrSaSu
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Yazıları geniş takvimde göster