Wednesday, April 10, 2013

Pengertian, Algoritma, dan Source Code Metode Biseksi

metode biseksiHello sobat blogger, kali ini saya akan ngepost mengenai Metode Biseksi. Metode Biseksi adalah metode yang digunakan untuk menentukan akar persamaan non linier melalui proses iterasi. Awal mula dari metode ini adalah metode tabel, dimana area dibagi menjadi n bagian. Sedangkan Biseksi hanya membagi range menjadi dua bagian. Kemudian dari dua bagian dipilih bagian mana yang mengandung penyelesaian dan bagian yang tidak mengandung penyelesaian akan dibuang. Hal ini dilakukan secara berulang-ulang sampai nilai eror mendekati nol. Nilai eror adalah nilai absolut dari y atau f(x). Sebelum menggunakan Metode Biseksi terlebih dahulu kita tentukan nilai batas bawah (a) dan batas atas (b).  Kemudian cari nilai tengah (c) dari batas atas dan batas bawah. c = (a+b) / 2. Untuk lebih jelasnya perhatikan algoritma berikut: (misal f(x)= e–x – x
  1. Inisialisasi fungsi f(x) = e^(-x) – x;
  2. Inisialisasi n = 1;
  3. Inisialisasi e = 0.00001;
  4. Tentukan batas atas (xa) dan bats bawah (xb);
  5. Tentukan banyak iterasi (n);
  6. Tentukan nilai xc = (xb + xa )2;
  7. Tentukan fa(xa), f(xb), f(xc);
  8. Tentukan nilai absolut f(xc);
  9. Cetak xa, xb, xc, f(xa), f(xb), f(xc);
  10. Jika f(xa) * (xb) > =0;
  11. Ya : xa = xc;
  12. Tidak : xb = xc;
  13. tambah nilai n dengan 1;
  14. Jika absolt f(xc)< e atau n >=10;
  15. Ya : keluar dari perulangan;
  16. Tidak : kembali ke 5;
  17. Cetak xa, xb, xc, f(xa), f(xb), f(xc);
Keterangan :    n merupakan jumlah seberapa banyak kita mengulang proses / biseksi.
                       e merupakan nilai error

Listing :
#include
#include
#include

double fungsi (double);
double biseksi (double, double);

main(){
       double x1, x2, fx1, fx2, indeks, a, temp;
       int n, i=1;

       puts("\t\t     >>>> METODE BISEKSI dan TABEL <<<<");
       puts("\t\t\t\tf(x)=a^2 - 27 ");
       printf("  Masukan batas bawah : ");
       scanf("%lf", &x1);
       printf("  Masukan batas atas  : ");
       scanf("%lf", &x2);
       printf("  Masukan banyak iterasi : ");
       scanf("%d", &n);
       puts("  ==========================================================================");
       puts("\t\t\t\tMETODE TABEL");

       a = (x2 - x1) / n;
       fx1 = fungsi(x1);
       fx2 = fungsi(x2);
      
       temp = x1;
       puts("    no    x\t     fx");
       do{
              fx1 = fungsi(temp);
              fx2 = fungsi(temp+a);
              printf("  %3d  %.7lf  %.7lf\n",i,temp, fx1);
              if (fx1*fx2<=0)
                     indeks = temp;

              fx1 = fx2;
              temp = temp + a;
              i++;
       }while(i<=n);

       printf("  Hasil berada diantara %.5lf dan %.5lf\n\n",indeks, indeks+a );

       biseksi(indeks,indeks+a);
      
}
double fungsi (double a){
       double hasil;
       hasil =exp(-a)- a;
       return hasil;
}

double biseksi (double a, double b){
       double c, fd,fb, fc, abs;
       int no=1;
       puts("\t\t\t\tMETODE BISEKSI");
       puts("  ==========================================================================");
       printf("\ta\t  b\t    c\t\tfa\t fb\t    fc\t      abs\n");
       puts("  ==========================================================================");
       for(;;no++){
              c = (b +a)/2;
              fd = fungsi(a);
              fb = fungsi(b);
              fc = fungsi(c);
              abs= b-a;

              printf("%3.d %.7lf %.7lf %.7lf %.7lf %.7lf %.7lf  %.7lf\n",no, a,b,c,fd,fb,fc, abs);
              if (fd*fc>=0)
                     a = c;
              else
                     b=c;
              if (abs<0 .0001="" o:p="">
                          printf("%3.d %.7lf %.7lf %.7lf %.7lf %.7lf %.7lf  %.7lf\n",no+1, a,b,c,fd,fb,fc, abs);
                           puts("  ==========================================================================");
                     break;
              }     
       }
       printf("\n Nilai x mendekati : %.9lf\n Nilai fungsi : %.9lf \nNilai absolut %.9lf",c,fc, abs);
       return(0);
}
Output : 
metode biseksi


Keterangan :    listing program merupakan campuran metode tabel dan metode biseksi.
Kelemahan metode Biseksi :
  1.  Proses Iterasi tergolong cukup lambat
  2.  Jika akar persamaan lebih dari satu, makas harus mencari akar satu persatu, tidak bisa sekaligus.\
  3. Tidak bisa mencari akar bilangan imaginer (kompleks)
Referensi : http://arteraktiv.com/
Sekian untuk post hari ini, semoga bermanfaat sobat. Budayakan untuk berbagi karena berbagi itu menyenangkan J.
Sekilas motivasi :
Orang-orang yang melontarkan kritik pada kita hakikatnya adalah pengawal jiwa kita yang bekerja tanpa bayaran.~Corrie ten Boom.

Artikel Terkait c ,metode numerik ,tutorial

7 comments:

  1. gan kok gw compile gk bisa . eror pada line 71-79

    ReplyDelete
  2. bang itu yg line 71 kok eror yg absnya

    ReplyDelete
  3. mas minta kodingannya dong, di copas malah error

    ReplyDelete
    Replies
    1. kodingnya itu gan,, sama aja,,
      pake bahasa C,, coba di cek lagi

      Delete
  4. mau nanya dong, dibaris 66 o dan p nya kok gak terbaca ya? Thanks

    ReplyDelete
    Replies
    1. #include
      #include
      #include
      #include
      #define maks 20

      main (){
      float x[maks][maks], tempx[maks][maks], temp2[maks], temp;
      int i,j, f=3, k=0;
      char a='`';
      cout<<"\n--------------------------------------------------------------------------------\n";
      printf("\ Metode Eliminasi Gauss \n");
      printf("\ Ax1 + Bx2 + Cx3 + .... =Y \n");
      cout<<"\n--------------------------------------------------------------------------------\n";
      do{
      printf("===> Masukan Jumlah Ordo Matrik : ");
      scanf("%d", &f);
      }while(f<2);

      for(i=0;i Persamaan Ke-%d\n", i+1);
      for(j=0;j Nilai %c : ",a+j+1);
      scanf("%f", &x[i][j]);
      if(j==f-1){
      printf("\n---> Nilai y : ");
      scanf("%f", &x[i][j+1]);
      break;
      }
      }
      }
      cout<<"\n--------------------------------------------------------------------------------\n";
      printf("\ Hasilnya Adalah Sebagai Berikut \n");
      cout<<"\--------------------------------------------------------------------------------\n";
      printf("\nDalam Bentuk Augmented Matriks\n");
      for(i=0;i<f;i++){
      printf("|");
      for(j=0;j<f+1;j++){
      printf("%5.1f", x[i][j]);
      }
      printf(" |\n");
      }
      //tukar
      for(i=0;i<3;i++){
      if(x[0][0]==0){
      for(j=0;j<f+1;j++){
      tempx[i][j]=x[0][j];
      }
      for(j=0;j<f+1;j++){
      x[0][j]=x[i+1][j];
      }
      for(j=0;j<f+1;j++){
      x[i+1][j]=tempx[i][j];
      }
      }
      }
      //hitung
      for(i=0;i<f;i++){
      temp=x[i][i];
      for(k=i;k<=f;k++){
      x[i][k] /= temp;
      }
      for(j=i+1;j<=f;j++){
      temp2[i] = x[j][i];
      for(k=i;k<=f;k++){
      x[j][k] -= temp2[i] * x[i][k];
      }
      }
      }
      puts("");
      //cetak
      printf("\nSetelah Eliminasi : \n");
      for(i=0;i<f;i++){
      printf("|");
      for(j=0;j<f+1;j++){
      printf("%5.1f", x[i][j]);
      }
      printf(" |\n");
      }
      puts("");
      system("Pause");
      }

      Delete