Contoh-Contoh Pemrograman Lanjut: VBA/MS-Excel, PASCAL, dan FORTRAN
(Epsilon Machine, Interpolasi dan Metode Newton-Raphson)
Prof. Dr. Ir. Setijo Bismo, DEA. Departemen Teknik Kimia FTUI 09 Oktober 2015
JANGAN LUPA dan HARUS SELALU DIINGAT!
2 (DUA) Cara Membuka Editor Macros (“VBA”)
Pemrograman VBA Macros untuk Epsilon Machine (#1):
Skematis Pemrograman dan “keterkaitan-letak”
Perhatikan POSISI: A1, B1, C1, A3, B3, C3, D3, A4, B4, C4, D4
Pemrograman VBA Macros untuk Epsilon Machine (#2):
Sub-Program: Scripting atau “Listing Out” Macro List#1
Sub CalcMachineEpsMS(ByRef Eps4 As Single, Iter As Integer) Eps4 = 1# Iter = 1 Do While (Eps4 + 1#) > 1# Eps4 = Eps4 / 2 Iter = Iter + 1 Loop End Sub Sub CalcMachineEpsMD(ByRef Eps8 As Double, Iter As Integer) Eps8 = 1# Iter = 1 Do While (Eps8 + 1#) > 1# Eps8 = Eps8 / 2 Iter = Iter + 1 Loop End Sub
Pemrograman VBA Macros untuk Epsilon Machine (#3):
Main-Program: Scripting atau “Listing Out” Macro List#2
Sub EpsMachine() Dim Iter As Integer Dim Eps4 As Single Dim Eps8 As Double ' Komputasi "Machine Epsilon" dalam SINGLE PRECISION Call CalcMachineEpsMS(Eps4, Iter) ' Hasil komputasi: Cells(3, 3) = Eps4 Cells(3, 4) = Iter ' Komputasi "Machine Epsilon" dalam DOUBLE PRECISION Call CalcMachineEpsMD(Eps8, Iter) ' Hasil komputasi: Cells(4, 3) = Eps8 Cells(4, 4) = Iter End Sub
Pemrograman PASCAL untuk Epsilon Machine (#1):
Software Dolphin Bay – EZY PASCAL
EpsM Variant#1
Pemrograman PASCAL untuk Epsilon Machine (#2):
Varian lain dalam EZY PASCAL EpsM Variant#2
Pemrograman PASCAL untuk Epsilon Machine (#3):
“SINGLE dan DOUBLE Precision” dalam EZY PASCAL EpsM Variant#3
Pemrograman FORTRAN untuk Epsilon Machine (#1):
Menggunakan FORTRAN “Silverfrost” - PLATO
Pemrograman FORTRAN untuk Epsilon Machine (#2):
Menggunakan FORTRAN “Silverfrost” - PLATO
Pemrograman FORTRAN untuk DERET TAYLOR:
Komputasi untuk rutin: “Sin(x)” C
Menghitung harga sin(x) dengan DERET TAYLOR Program Sinus Implicit NONE Real*8 faktor,x,sum,NUM,DEN Integer N,I,IG,J Write(*,'(A,$)') 'INPUT harga x sebagai ''nilai argumen'' : ' Read(*,*) x Write(*,'(A,$)') 'INPUT harga N sebagai ''jumlah suku'' : ' Read(*,*) N faktor = 1 sum = x Do I = 1,N IG = 2*I + 1 NUM = 1.0 DEN = 1.0 faktor = -1*faktor Do J = 1,IG NUM = NUM*x DEN = DEN*J EndDo sum = sum + faktor*(NUM/DEN) EndDo
Write(*,*) 'Harga NUMERIS : ',sum Write(*,*) 'Harga ANALITIS : ',sin(x) Read(*,*) Stop End
Pemrograman PASCAL untuk DERET TAYLOR:
Komputasi untuk rutin: “Sin(x)” { Menghitung harga sin(x) dengan DERET TAYLOR } Program Sinus; Var faktor,x : Extended; sum,NUM,DEN : Extended; N,I,IG,J : Integer; Begin Write('INPUT harga x sebagai ''nilai argumen'' : '); Readln(x); Write('INPUT harga N sebagai ''jumlah suku'' : '); Readln(N); faktor := 1; sum := x; For I := 1 to N do Writeln('Harga NUMERIS : ',sum); Begin IG := 2*I + 1; Writeln('Harga ANALITIS : ',sin(x)); NUM := 1.0; Readln; DEN := 1.0; End. faktor := -1*faktor; For J := 1 to IG do Begin NUM := NUM*x; DEN := DEN*J; End; sum := sum + faktor*(NUM/DEN); End;
Pemrograman VBA untuk DERET TAYLOR:
Komputasi untuk rutin: “Sin(x)”
Pemrograman PASCAL untuk SPAL (Bab IV) [Hal#1]:
Program untuk Komputasi: “Eliminasi Gauss” Program Eliminasi_Gauss; Const NofEqn = 5; Type RVector = Array[1..NofEqn] of Real; RMatrix = Array[1..NofEqn,1..NofEqn] of Real; { === PROGRAM UTAMA === } Var A : RMatrix; b,x : RVector; I,J,K,N : Integer; Diag,FMul,Sum : Real; Begin { ---> Seksi ELIMINASI GAUSS <--- } {INPUT N => Masukkan Jumlah Persamaan} N := 3; {AKHIR dari INPUT N}
{INPUT A => Masukkan harga komponenen MATRIKS A} A[1,1] := 6; A[1,2] := 3; A[1,3] := 2; A[2,1] := 3; A[2,2] := 5; A[2,3] := 7; A[3,1] := 2; A[3,2] := 4; A[3,3] := 3; {AKHIR dari INPUT A} {INPUT b => Masukkan harga komponenen VEKTOR b} b[1] := 26; b[2] := 26; b[3] := 17; {AKHIR dari INPUT b} { ---> Pembentukan MATRIKS DIAGONAL ATAS <--} For I:=1 to N-1 do Begin Diag := A[I,I]; For J:=I+1 to N do Begin FMul := A[J,I]/Diag; For K:=I to N do A[J,K] := A[J,K] - A[I,K]*FMul; b[J] := b[J] - b[I]*FMul; End; End; { ---> AKHIR dari Pembentukan MATRIKS
Pemrograman PASCAL untuk SPAL (Bab IV) [Hal#2]:
Program untuk Komputasi: “Eliminasi Gauss” Writeln('Matriks DIAGONAL ATAS dan VEKTOR RUAS KANAN:'); For I:=1 to N do Begin For J:=1 to N do write(A[I,J]:1:4,' '); writeln(b[I]:1:4); End; DIAGONAL ATAS <--- }
Writeln; Writeln('HASIL, berupa VEKTOR JAWAB:'); For I:=1 to N do Writeln('x[',I,'] = ',x[I]:1:6); End.
{ ---> Backsubstitution <--- } x[N] := b[N]/A[N,N]; For I:=N-1 downto 1 do { === AKHIR dari Program Utama === } Begin Sum := 0.0; For J:=N downto I+1 do Sum := Sum + A[I,J]*x[J]; x[I] := (b[I] - Sum)/A[I,I]; End; { ---> AKHIR dari Backsubstitution <--- } { ---> AKHIR dari Seksi Eliminasi GAUSS <--- }
Pemrograman FORTRAN untuk “Regresi Linier” [Hal#1] C Regresi Persamaan POLINOMIAL order 2 menggunakan C Netode Eliminasi Gauss-Jordan untuk Solusi SPAL C (Sistem Persamaan Aljabar Linier) C C --------------------------------C Deklarasi Jenis dan Variabel: C --------------------------------IMPLICIT NONE CHARACTER*12 NamaFile INTEGER iarg,NDAT PARAMETER (iarg = 7) PARAMETER (NDAT = 25) INTEGER i,j,ND,neq REAL*8 A(iarg,iarg) REAL*8 b(iarg),x(iarg) REAL*8 Xi(NDAT),Yi(NDAT) DOUBLE PRECISION SumXX(0:4),SumXY(3) CALL system('cls') WRITE(*,7) 'Enter Nama FILE (12 karakter maks.) : ' 7 FORMAT(A,$) READ(*,*) NamaFile OPEN (9,FILE=NamaFile) READ(9,*) ND
Pemrograman FORTRAN untuk “Regresi Linier” [Hal#2] DO I=0,4 SumXX(I) = 0.0 END DO DO I=1,3 SumXY(I) = 0.0 END DO SumXX(0) = ND DO J=1,ND READ(9,*) Xi(J),Yi(J) SumXX(1) = SumXX(1) + SumXX(2) = SumXX(2) + SumXX(3) = SumXX(3) + SumXX(4) = SumXX(4) + SumXY(1) = SumXY(1) + SumXY(2) = SumXY(2) + SumXY(3) = SumXY(3) + END DO C
Xi(J) Xi(J)**2 Xi(J)**3 Xi(J)**4 Yi(J) Xi(J)*Yi(J) Xi(J)**2*Yi(J)
Pengolahan DATA menjadi Koefisien MATRIKS: DO I=1,3 DO J=1,3 A(I,J) = SumXX(6-I-J) END DO B(I) = SumXY(4-I) END DO
Pemrograman FORTRAN untuk “Regresi Linier” [Hal#3] C C
Proses Pemasukan JUMLAH PERSAMAAN: ---------------------------------neq = 3
C C
Proses Pemanggilan Subprogram Eliminasi Gauss-Jordan: ----------------------------------------------------CALL EGAUSS(neq,A,x,b)
C C
Pemaparan/penyajian Hasil Perhitungan: -------------------------------------DO i = 1,neq WRITE(*,40) 'x(',i,') = ',x(i) ENDDO 40 FORMAT (5X,A,I1,A,F12.7) STOP END
Pemrograman FORTRAN untuk “Regresi Linier” [Hal#4]
C C C C C C C C C
SUBROUTINE EGAUSS(n,A,x,b) -------------------------------------------------------SUBROUTINE ELIMINASI GAUSS (tanpa "PIVOTING"): Solusi SISTEM Persamaan Aljabar Linier (SPAL) dengan format pers. matriks: [A].[x] = [b], dengan rincian sbb: n = jumlah persamaan aljabar linier (dimensi SPAL) A = matriks bjr sangkar nxn yang berisi koef. Pers., x = vektor variabel pers. yang akan dicari harganya b = VRK yang berisi harga-harga persamaan tunggal | --------------------------------------------------------
C C
Deklarasi Variabel: ------------------INTEGER n REAL*8 A(7,7),b(n),x(n) INTEGER i,j,k REAL*8 PIVOT,MULT,TOP
C C
Proses solusi: (a) Substitusi dan Eliminasi ------------------------------------------DO j = 1,n-1
Pemrograman FORTRAN untuk “Regresi Linier” [#3] PIVOT = A(j,j) DO i = j+1,n MULT = A(i,j)/PIVOT DO k = j+1,n A(i,k) = A(i,k) - MULT*A(j,k) ENDDO b(i) = b(i) - MULT*b(j) ENDDO ENDDO C C
Proses solusi: (b) Substitusi Balik ----------------------------------x(n) = b(n)/A(n,n) DO i = n-1,1,-1 TOP = b(i) DO k = i+1,n TOP = TOP - A(i,k)*x(k) ENDDO x(i) = TOP/A(i,i) ENDDO RETURN END