Thursday, April 18, 2013

Mencegah Konvergen Metode Newton Raphson

newton rapson
Assalamualaikum warrohmatullahi wabarokatuh.
Kali ini saya mau ngepost mengenai optimalisasai Metode Newton Raphson atau mencegah divergen (saat kita menggunakan Metode Newton Raphson namun tidak menemukan akar dari penyelesaian) pada Metode Newton Raphson dengan menggunakan metode Tabel. Prinsip dari metode ini adalah menggunakan Metode Tabel terlebih dahulu  dengan memasukan nilai batas atas dan batas bawah. kemudian nilai x dari hasil metode tabel tersebut menjadi nilai awal pada Metode Newton Raphson. berikut adalah algoritma dan Source Code nya :



Algoritma :

  1. Definisikan fungsi x(f(x) dan turunan fungsi x (g(x)); 
  2.   Masukan nilai awal x, toleransi error, dan jumlah iterasi, batas awal (a) dan batas akhir(b);
  3. Inisialisasi i =0, k=0,j=0,temp=0; 
  4. Inisialisasai fx[ ][ ], gx[ ][ ], abso[ ][ ], fx_temp1, fx_temp2, a,b,inc; 
  5. Tentukan increment metode tabel inc = (b-a)/2; 
  6. Apakah nilai i kurang dari sama dengan n-1?jika tidak keluar dari perulangan à indeks 13;  
  7. Fx_temp1= fungsix(a);
  8.  Tambah nilai a dengan inc;
  9.  Fx_temp2 = fungix(a);
  10.  Cetak nilai a dan fx_temp1;
  11.  Jika fx_temp1 dikali fx_temp2 kurang dari 0; simpan a kedalam x[j][k], increment nilai j;
  12.  Increment nilai i; kembali ke 6;
  13.  Inisialisasi temp = 0;
  14.  Apakah temp kurang dari j? Jika tidak keluar dariperulangan
  15.  Inisialisasi i =0;
  16.  Apakah i kurang dari n? Jika tidak keluar perulanganàindeks 24
  17.  Fx[temp][i] = fungsix(x[temp][i]);
  18.  Gx[temp][i] = tururanx f([temp]x[i])
  19.  Abso[temp][i] = fx[temp][i];
  20.  jika fx[i]<0 data-blogger-escaped-abso="" data-blogger-escaped-i="" data-blogger-escaped-span="" data-blogger-escaped-temp="">
  21.  Cetak nilai x[temp][i], fx[temp][i], gx[temp][i];
  22.  i++;
  23.  Jika abso[temp][i] kurang dari e (toleransi error);
  24.  Ya : Keluar perulangan;
  25.  Tidak : kembali ke 16.
berikut adalah Source Code dari program diatas :


#include
#include
#define max 20

double fungsix(double);
double diffungsix(double);

main(){
      double x[max][max]={0.5}, fx[max][max], gx[max][max], e=0.0001,abso[max][max], fx_tab1, fx_tab2; //gx merupakan turunan fx
      int i =0, n=10,j=0,k=0, temp=0;
      double a=0.9,b=5, inc;

      puts("\t>>>METODE TABEL dan NEWTON RAPSON<<<");
      puts("\t\t  f(x)=x+e^x");
      printf("Masukan nilai awal     : ");
      scanf("%lf", &a);
      printf("Masukan nilai akhir    : ");
      scanf("%lf", &b);
      printf("Masukan nilai error    : ");
      scanf("%lf", &e);
      printf("Masukan jumlah iterasi : ");
      scanf("%d", &n);

      inc = (b - a) / n;  
      puts(" no    x\t     fx");
      while(i<=(n-1)){
            fx_tab1 = fungsix(a);
            a+=inc;
            fx_tab2 = fungsix(a);
            printf("%3d  %7lf  %9lf \n",i+1,a-inc, fx_tab1);
            if (fx_tab1*fx_tab2 < 0){
                   x[j][k] = a-inc;
                   j+=1;
            }
            i++;
      }
      temp=0;
      while(temp
            i=0;
            puts("=================================================================");
            printf("| n |      x       |       fx     |     gx       |  absolut fx  |\n");
            puts("=================================================================");
           
            while(i<=n){
                   fx[temp][i] = fungsix(x[temp][i]);
                   gx[temp][i] = diffungsix(x[temp][i]);
                   x[temp][i+1]= x[temp][i] - (fx[temp][i]/gx[temp][i]);
                   abso[temp][i] = fx[temp][i];
                   if(abso[temp][i]<0 data-blogger-escaped-span="">
                          abso[temp][i] *=-1;
                   printf("|%2d | %12.9lf | %12.9lf | %12.9lf | %12.9lf |\n",i+1, x[temp][i], fx[temp][i],gx[temp][i],abso[temp][i]);
                  
                   if(abso[temp][i] < e)
                          break;
                  
                   i++;
            }
            puts("=================================================================");
            printf("Akar terletak di x %9.9lf dengan nilai fx %9.9lf\n",x[temp][i], fx[temp][i]);
            temp++;
      }
     
}
double fungsix (double a){   
      double hasil;
      hasil = a*exp(-a) + cos(2*a);//merupakan fungsix (fx) yang bisa kamu masukan sendiri
      return hasil;
}
double diffungsix (double b){
      double hasil2;
      hasil2 = (1-b)*exp(-b) - 2 * sin(2*b); // merupakan fungsi turunan dari fungsi fx
      return hasil2;
}

Sekian dari post kali ini terimakasih telah berunjung, berbagi itu memang menyenangkan.
sekilas motivasi : "Bukan kesuliatan yang membuat kita takut melangkah, tetapi ketakutan itulah yang mempersulit"~Seneca 
wassalamualaikum warrohmatulahi wabarokatuh.




Artikel Terkait c ,metode numerik ,tutorial

No comments:

Post a Comment