Rabu, Mei 01, 2013

Persamaan Non-Linier Metode Biseksi

Ide awal metode ini adalah metode table, dimana area dibagi menjadi N bagian. Hanya saja metode biseksi ini membagi range menjadi 2 bagian, dari dua bagian ini dipilih bagian mana yang mengandung dan bagian yang tidak mengandung akar dibuang.Hal ini dilakukan berulang-ulang hingga diperoleh akar persamaan.


Untuk menggunakan metode biseksi, terlebih dahulu ditentukan batas bawah (a) dan batas atas (b).Kemudian dihitung nilai tengah :

Dari nilai x ini perlu dilakukan pengecekan keberadaan akar. Secara matematik, suatu range terdapat akar persamaan bila f(a) dan f(b) berlawanan tanda atau dituliskan :
                      f(a) . f(b) < 0
Setelah diketahui dibagian mana terdapat akar, maka batas bawah dan batas atas di perbaharui sesuai dengan range dari bagian yang mempunyai akar.

Berikut adalah sintax program untuk algoritma biseksi : 

// Biseksi.cpp : Defines the entry point for the console application. 
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define PHI 3.141592654
 
float a,m,b,F_a,F_m,F_b,tol;
int max_iter;
float f(float x){
  return x*x*x + 3*cos(x*PHI/180) - x;
}
int main(){
   int it;
   float epsilon;
   printf("Solusi Akar dengan Metode Bisection\n\n");
   printf("Batas bawah             = "); scanf("%f",&a);
   printf("Batas atas              = "); scanf("%f",&b);
   printf("Toleransi(ex: 0.0001)   = "); scanf("%f",&tol);
   printf("Jumlah iterasi maksimum = "); scanf("%d",&max_iter);
   it = 0;
   F_a = f(a);
   F_b = f(b);
   if(F_a * F_b > 0){
      printf("It.     a         m         b        f(a)      f(b)");
      printf("    abs[f(b)-f(a)]/2\n");
      do{
         it = it + 1;
         m = (a + b) / 2;
         F_m = f(b);
         printf("%3d  %8.5f  %8.5f  %8.5f  %8.5f  %8.5f  %8.2e\n",
                 it,a,m,b,F_a,F_b,fabs(F_b-F_a)/2);
         epsilon = fabs(m-a);
         if(F_a * F_m <= 0) { b = m; F_b = F_m; }
         else { a = m; F_a = F_m; }
      } while(it <= max_iter && epsilon > tol);
      if(it<=max_iter)
      {
         printf("\nToleransi terpenuhi\n");
         printf("Hasil akhir = %g\n",m);
      }
      else printf("\nToleransi tidak terpenuhi\n");
   }
   getch();
}

Tidak ada komentar:

Posting Komentar