Pages

Thursday, September 27, 2012

Ngoding Sekan di Fortran



LISTING PROGRAM  :
Sekan.for

$ title: Sekan
c Contoh program Sekan
      REAL X0,X1,X2,T
      INTEGER ORDO, ITER
      DIMENSION KOEF(20)
      WRITE (*,’(24(/))’)
      WRITE (*,’(30X,A)’) ‘Input Persamaan’
      WRITE (*,’(30X,A)’) ‘===============’
      WRITE (*,*)
      WRITE (*,’(a,\)’) ‘Orde/Derajat : ’
      READ (*,’(I2)’) ORDO
      WRITE (*,*)
      DO 10 I=ORDO+1, 1, -1
      WRITE (*,’(A,I2,A,\)’) ‘Koefisien X^’,I-1,‘ = ’
      READ (*,’(I3)’) KOEF(I)
10    CONTINUE
      WRITE (*,*)
      WRITE (*,*) ‘Persamaan yang diinput : ’
      WRITE (*,*)
      CALL OUTPUT (ORDO,KOEF)
      PAUSE
      WRITE (*,’(24(/))’)
      WRITE (*,’(20X,A)’) ‘Pencarian Akar Menggunakan Metode Sekan’
      WRITE (*,’(20X,A)’) ‘==========================’
      WRITE (*,*)
      CALL OUTPUT(ORDE,KOEF)
      WRITE (*,*)
      WRITE (*,’(A,\)’) ‘X0(Batas Bawah) = ’
      READ (*,*) X0
      WRITE (*,’(A,\)’) ‘X1(Batas Atas) = ’
      READ (*,*) X1
      WRITE (*,’(A,\)’) ‘Toleransi Kesalahan = ’
      READ (*,*) T
      WRITE (*,*)
    X2 = X1 – (FNG(ORDO,KOEF,X1)*(X1-X0))/(FNG(ORDO,KOEF,X1)-FNG(ORDO,KOEF,X0))
      ITER = 1
      WRITE (*,*)
      WRITE(*,'(2(A,3X),7(A,6X),A,3X,A)')'³','   ITERASI','³','X0','³','X1','³','X2','³','F(X2)','³’
      WRITE (*,*)
      WHILE (( ABS((X1-X2)/X1) .GT. T) .AND.( FNG(ORDO,KOEF,X2) .NE. 0 )) DO
WRITE(*,'(A,5X,I3,6X,A,4(1X,F12.7,1X,A))') '³',ITER,'³',X0,'³',X1,'³',X2,'³',FNG(ORDO,KOEF,X2),'³'
      X0 = X1
      X1 = X2
     X2 = X1 - (FNG(ORDO,KOEF,X1)*(X1-X0))/(FNG(ORDO,KOEF,X1)-FNG(ORDO,KOEF,X0))
      ITER = ITER + 1
      PAUSE
      ENDWHILE
WRITE(*,'(A,5X,I3,6X,A,4(1X,F12.7,1X,A))') '³',ITER,'³',X0,'³',X1,'³',X2,'³',FNG(ORDO,KOEF,X2),'³'
      WRITE (*,*)
      WRITE (*,*)
      WRITE (*,*) 'SOLUSINYA = ',X2
      END
      SUBROUTINE OUTPUT (ORDO,KOEF)
      DIMENSION KOEF(20)
      INTEGER ORDO
      WRITE (*,'(A,\)') 'F(X) = '
      DO 20 I = ORDO + 1, 1, -1
      IF (I .GT. 2) THEN
      IF (KOEF(I) .EQ. (-1)) THEN
      WRITE (*,'(A,I2,\)') '-     X^',I – 1
      ELSEIF ((KOEF(I) .NE. 1) .AND. (KOEF(I) .NE. 0)) THEN
      WRITE (*,'(I3,A,I2,\)') KOEF(I),'X^',I – 1
      ELSEIF (KOEF(I) .NE. 0) THEN
      WRITE (*,'(A,I2,\)') 'X^',I – 1
      ENDIF
      IF (KOEF(I-1) .GT. 0) THEN
      WRITE (*,'(A,\)') ' + ‘
      ENDIF
      ELSEIF (I .EQ. 2) THEN
      IF (KOEF(I) .EQ. (-1)) THEN
      WRITE (*,'(A,\)') '-X ‘
      ELSEIF ((KOEF(I) .NE. 1) .AND. (KOEF(I) .NE. 0)) THEN
      WRITE (*,'(I3,A,\)') KOEF(I),' X ‘
      ELSEIF (KOEF(I) .NE. 0) THEN
      WRITE (*,'(A,\)') ' X ‘
      ENDIF
      IF (KOEF(I-1) .GT. 0) THEN
      WRITE (*,'(A,\)') ' + ‘
      ENDIF
      ELSEIF (KOEF(I) .NE. 0) THEN
      WRITE (*,'(I3)') KOEF(I)
      ENDIF
20    CONTINUE
      END
      REAL FUNCTION FNG(ORDO,KOEF,MX)
      INTEGER ORDO
      DIMENSION KOEF(20)
      REAL MX
      FNG = 0
      DO 30 I = ORDO + 1, 1, -1
      IF (MX .NE. 0) FNG = FNG + (KOEF(I)*MX**(I-1))
30    CONTINUE
      RETURN
      READ(*,*)
      END


LOGIKA  PROGRAM :

$ title: Sekan
c Contoh program Sekan
      REAL X0,X1,X2,T
      INTEGER ORDO, ITER
      DIMENSION KOEF(20)
      WRITE (*,’(24(/))’)
      WRITE (*,’(30X,A)’) ‘Input Persamaan’
      WRITE (*,’(30X,A)’) ‘===============’
      WRITE (*,*)
      WRITE (*,’(a,\)’) ‘Orde/Derajat : ’
      READ (*,’(I2)’) ORDO
      WRITE (*,*)
Blok program ini digunakan untuk memberitahu judul dari program ini adalah Sekan. Dan terdapat suatu komentar yaitu Contoh program Sekan. Dimana dideklarasikan suatu variabel X0, X1, X2 dan T bertipe data REAL, ORDO dan ITER bertipe data integer dan KOEF suatu array berdimensi satu dan banyaknya array adalah 20. Kemudain mencetak satu baris kosong, selanjutnya mencetak kata Input Persamaan dan tanda ===== setelah itu mencetak satu baris kosong. Kemudian mencetak kata Orde/Derajat : dimana user diminta untuk menginput suatu orde dan hasil inputan tersebut disimpan dalam variabel ORDO sebagai tipe data integer. Lalu mencetak satu baris kosong.

DO 10 I=ORDO+1, 1, -1
      WRITE (*,’(A,I2,A,\)’) ‘Koefisien X^’,I-1,‘ = ’
      READ (*,’(I3)’) KOEF(I)
10    CONTINUE
      WRITE (*,*)
      WRITE (*,*) ‘Persamaan yang diinput : ’
      WRITE (*,*)
Selanjutnya menuju ke line number 10 yaitu perintah continue dengan perulangan dimana I sama dengan nilai dari variabel ordo ditambah 1. Dan akan menampilkan nilai Koefisien X^ dan nilai I dikurangi 1 = dimana I adalah banyaknya perulangan dikurangi 1. Kemudian input nilai yang diinginkan dan hasil inputan tersebut akan disimpan dalam variabel KOEF. Setelah itu mencetak satu baris kosong. Kemudian mencetak tulisan Persamaan yang diinput : kemudian mencetak satu baris kosong lagi.

      CALL OUTPUT (ORDO,KOEF)
      PAUSE
      WRITE (*,’(24(/))’)
      WRITE (*,’(20X,A)’) ‘Pencarian Akar Menggunakan Metode Sekan’
      WRITE (*,’(20X,A)’) ‘==========================’
      WRITE (*,*)
Program memanggil variabel Orde dan Koef untuk ditampilkan. Lalu program diberhentikan sementara. Selanjutnya program untuk pencarian akar menggunakan metode sekan. Program akan mencetak kalimat Pencarin Akar Menggunakan Metode Sekan dan tanda ======= pada layar output setelah itu mencetak satu baris kosong.

     CALL OUTPUT(ORDE,KOEF)
      WRITE (*,*)
      WRITE (*,’(A,\)’) ‘X0(Batas Bawah) = ’
      READ (*,*) X0
      WRITE (*,’(A,\)’) ‘X1(Batas Atas) = ’
      READ (*,*) X1
      WRITE (*,’(A,\)’) ‘Toleransi Kesalahan = ’
      READ (*,*) T
      WRITE (*,*)
Program memanggil lagi Orde dan Koef untuk ditampilkan dan mencetak satu baris kosong. Setelah itu program mencetak kata X0 (Batas Bawah) = dimana user diminta untuk memasukkan batas bawah sebagai X0 dan mencetak kata X1 (Batas Atas) = dimana user diminta untuk memasukkan batas atas sebagai X1. Kemudian kata Toleransi Kesalahan = dan hasil inputannya akan disimpan dalam variabel T, setelah itu mencetak satu baris kosong.

      X2=X1–(FNG(ORDO,KOEF,X1)*(X1-X0))/(FNG(ORDO,KOEF,X1)-     FNG(ORDO,KOEF,X0))
      ITER = 1
      WRITE (*,*)
      WRITE(*,'(2(A,3X),7(A,6X),A,3X,A)')'³','   ITERASI','³','X0','³','X1','³','X2','³','F(X2)','³’
      WRITE (*,*)
      WHILE (( ABS((X1-X2)/X1) .GT. T) .AND.( FNG(ORDO,KOEF,X2) .NE. 0 )) DO
 WRITE(*,'(A,5X,I3,6X,A,4(1X,F12.7,1X,A))')            '³',ITER,'³',X0,'³',X1,'³',X2,'³',FNG(ORDO,KOEF,X2),'³'
      X0 = X1
      X1 = X2
Kemudian fungsi matematika ini digunakan untuk mencari nilai X2, dimana X2 didapatkan dengan cara nilai dari X1 dikurangi dengan f(X1) dikali dengan (X1-X0) kemudian hasilnya  dibagi dengan f(X1)-f(X2). Kemudian dilakukan persamaan nilai bahwa ITER = 1, kemudian mencetak satu baris kosong. Kemudian menampilkan hasil dari ITERASI dimana nilai dari X0, X1, X2 dan F(X2) akan ditampilkan. Lalu mencetak baris satu kosong. Dan terdapat kondisi bila nilai dari iterasi pertama dan F(1) tidak sesuai dengan ketetapan yaitu 0 maka berlanjut ke statement selanjutnya yaitu menyamakan nilai dimana nilai X0 sama dengan X1 dan X1 sama dengan X2.

      X2=X1-(FNG(ORDO,KOEF,X1)*(X1-X0))/(FNG(ORDO,KOEF,X1)-  FNG(ORDO,KOEF,X0))
      ITER = ITER + 1
      PAUSE
      ENDWHILE
WRITE(*,'(A,5X,I3,6X,A,4(1X,F12.7,1X,A))')   '³',ITER,'³',X0,'³',X1,'³',X2,'³',FNG(ORDO,KOEF,X2),'³'
      WRITE (*,*)
      WRITE (*,*)
      WRITE (*,*) 'SOLUSINYA = ',X2
      END
Sama seperti blok program sebelumnya, blok program ini digunakan untuk melalukan suatu interasi hingga nilai yang ditentukan tercapai. Dimana nilai X2 didapat dengan X1 dikurangi dengan f(X1) dikali dengan (X1-X0) kemudian hasilnya  dibagi dengan f(X1)-f(X2). Kemudian nilai iter adalah nilai dari variabel iter sebelumnya ditambah 1. Kemudian program diberhentikan dan untuk mengakhiri kondisi ini gunakan ENDWHILE. Iterasi akan terus dilakukan hingga [(X1-X2)/X1]. Kemudian mencetak dua baris kosong dan SOLUSINYA = nilai ini diambil dari X2 dimana solusi ini akan ditampilkan jika nilai X2 sudah mencapai nilai batas. Perintah End digunakan untuk mengkahiri blok program ini.

      SUBROUTINE OUTPUT (ORDO,KOEF)
      DIMENSION KOEF(20)
      INTEGER ORDO
      WRITE (*,'(A,\)') 'F(X) = '
      DO 20 I = ORDO + 1, 1, -1
      IF (I .GT. 2) THEN
      IF (KOEF(I) .EQ. (-1)) THEN
      WRITE (*,'(A,I2,\)') '-     X^',I – 1
      ELSEIF ((KOEF(I) .NE. 1) .AND. (KOEF(I) .NE. 0)) THEN
      WRITE (*,'(I3,A,I2,\)') KOEF(I),'X^',I – 1
      ELSEIF (KOEF(I) .NE. 0) THEN
      WRITE (*,'(A,I2,\)') 'X^',I – 1
      ENDIF
Blok program ini digunakan untuk memanggil Ordi dan Koef menggunakan subroutine. Berdimensi 1 dengan variabel KOEF array sebanyak 20 nilai. Mendeklarasikan variabel ordo sebagai integer. Kemudian mencetak F(X) = . Kemudian menuju ke line number 20 yaitu CONTINUE dimana akan dilakukan perulangan dengan nilai I sama dengan nilai dari variabel Ordo doiambah 1. Terdapat suatu kondisi jika nilai dari variabel I lebih besar dari 2 maka, masuk kembali kedalam suatu kondisi yaitu bila nilai dari KOEF sama dengan -1 maak akan dicetak X^ dan nilai dari variabel I dikurang 1. Jika tidak KOEF dari variabel I tidak sama dengan 1 dan KOEF dari variabel I tidak sama dengan nol maka akan tercetak X^, I dikurangi 1. Jika tidak juga maka KOEF variabel I tidak sama dengan nol maka akan tercetak X^ variabel I dikurang 1. Untuk mengakhiri perulangan terdalam ini gunakan perintah ENDIF.

      IF (KOEF(I-1) .GT. 0) THEN
      WRITE (*,'(A,\)') ' + ‘
      ENDIF
      ELSEIF (I .EQ. 2) THEN
      IF (KOEF(I) .EQ. (-1)) THEN
      WRITE (*,'(A,\)') '-X ‘
      ELSEIF ((KOEF(I) .NE. 1) .AND. (KOEF(I) .NE. 0)) THEN
      WRITE (*,'(I3,A,\)') KOEF(I),' X ‘
      ELSEIF (KOEF(I) .NE. 0) THEN
      WRITE (*,'(A,\)') ' X ‘
      ENDIF
Kondisi ini diberikan jika nila KOEF dari variabel I dikurangi 1 hasilnya lebih besar dari 2 maka akan mencetak tanda +. Akhiri kondisi ini dengan perintah ENDIF. Jika tidak maka beralih ke kondisi else dimana jika nilai I sama dengan 2 maka masuk ke dalam suatu kondisi lagi yaitu jika nilai dari KOEF variabel I sama dengan -1 maka akan mencetak tanda – jika tidak KOEF(I) tidak sama dengan 1 dan 0 maka akan mencetak nilai dari KOEF(I) dan X. Jika tidak juga maka hanya akan mencetak X saja. Akhiri kondisi ini dengan perintah ENDIF.

IF (KOEF(I-1) .GT. 0) THEN
      WRITE (*,'(A,\)') ' + ‘
      ENDIF
      ELSEIF (KOEF(I) .NE. 0) THEN
      WRITE (*,'(I3)') KOEF(I)
      ENDIF
20    CONTINUE
      END
Jika KOEF niali variabel I dikurangi 1 lebih besar dari 0 maka program mencetak tanda +. Akhiri kondisi ini dengan ENDIF. Jika KOEF variabel I tidak sama dengan 0 maka akan mencetak nilai yang terdapat pada KOEF(I). Akhiri dengan ENDIF.  Kemudian terdapat line number 20 dengan perintah COTINUE dan tutup blok program ini dengan perintah END.

      REAL FUNCTION FNG(ORDO,KOEF,MX)
      INTEGER ORDO
      DIMENSION KOEF(20)
      REAL MX
      FNG = 0
      DO 30 I = ORDO + 1, 1, -1
      IF (MX .NE. 0) FNG = FNG + (KOEF(I)*MX**(I-1))
30    CONTINUE
      RETURN
      READ(*,*)
      END
Kemudian mendeklarasikan fungsi FNG Ordo, Koef dan MX dengan tipe data real. Kemudian ordo dideklarasikan sebagai integer. Koef bertipe data array dengan 20 nilai dan berdimensi satu. MX dengan tipe data real. Nilai awal dari FNG adalah 0. Kemudian menuju ke line number 30 yaitu perintah continue. Perulangan dilakukan dimana nilai dari variabel I sama dengan ordo ditambah 1. Dan nilai dari FNG diperoleh dengan persamaan matematika FNG + (KOEF(I)*MX**(I-1) setelah itu semua nilai akan dikembalikan kenilai awal dengan statement return.  Untuk mengakhiri seluruh blok program gunakan perintah END.



OUTPUT PROGRAM :


No comments:

Post a Comment