1
PENDAHULUAN : IDE DAN STRUKTUR PROGRAM DELPHI PEMROGRAMAN DELPHI
1.1 PENDAHULUAN Sebelum kita memulai Delphi, kita harus menginstalasi program Delphinya terlebih dahulu. Kita bisa menggunakan Delphi 5, 6, 7 atau 8. Sebenarnya Delphi versi berapapun tidak masalah, karena produk Borland ini selalu menjaga kompatibilitas antar versinya. Untuk menginstalasi Delphi cukup mudah, tinggal ikuti petunjuk yang diberikan pada tampilan di layar. Sesudah Delphi terinstalasi pada komputer, kita bisa memulai mengenal dahulu apa itu Delphi? Kelompok bahasa pemrograman apa? Delphi adalah kompiler / penterjemah bahasa Delphi (awalnya dari Pascal) yang merupakan bahasa tingkat tinggi sekelas dengan Basic, C. Bahasa Pemrograman di Delphi disebut bahasa prosedural artinya bahasa/sintaknya mengikuti urutan tertentu / prosedur. Ada jenis pemrograman non-prosedural seperti pemrograman untuk kecerdasan buatan seperti bahasa Prolog. Delphi termasuk Keluarga Visual sekelas Visual Basic, Visual C, artinya perintah-perintah untuk membuat objek dapat dilakukan secara visual. Pemrogram tinggal memilih objek apa yang ingin dimasukkan kedalam Form/Window, lalu tingkah laku objek tersebut saat menerima event/aksi tinggal dibuat programnya. Delphi merupakan bahasa berorentasi objek, artinya nama objek, properti dan methode/procedure dikemas menjadi satu kemasan (encapsulate). Sebelum mempelajari ketiga struktur pemrograman ada baiknya kenali dahulu tampilan IDE, yang merupakan editor dan tools untuk membuat program Delphi. Pada IDE akan ditampilkan Form baru yang merupakan aplikasi/program Window yang akan dibuat. Aplikasi / program berbasis windows sering disebut dengan jendela (window). Bagaimana membuat aplikasi berbasis windows (berbasis grafik dan bukan berbasis teks seperti pada DOS)? Caranya dengan membuat sebuah form. Pada pemrograman berbasis windows, kita akan diperhadapkan pada satu atau beberapa jendela yang nampak dihadapan kita. Jendela ini dalam Delphi disebut juga dengan form. Pada pemrograman berbasis windows, kita akan diperhadapkan pada satu atau beberapa jendela yang nampak dihadapan kita. Jendela ini dalam Delphi disebut juga dengan form. Delphi adalah sebuah perangkat lunak (bahasa pemrograman) untuk membuat program / aplikasi komputer berbasis windows. Delphi merupakan bahasa pemograman berbasis objek, artinya semua komponen yang ada merupakan objek-objek. Ciri sebuah objek adalah memiliki nama, properti dan method/procedure. Delphi disebut juga visual programming artinya komponen-komponen yang ada tidak hanya berupa teks (yang sebenarnya program kecil) tetapi muncul berupa gambar-gambar. 1.1.1
Membuat Sebuah Form Saat anda pertama kali masuk ke Delphi, anda akan diperhadapkan pada sebuah form kosong yang akan
dibuat secara otomatis. Form tersebut diberi nama Form1. Form ini merupakan tempat bekerja untuk membuat antarmuka pengguna.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
Minimize Nama form
Maximize Close
Tempat bekerja
Gambar1. Form kosong yang dibuat saat anda masuk Delphi 1.1.2
Mengganti Nama Form dan Menambahkan Judul Biasakan sebelum menjalankan program, sebaiknya ganti nama form dan beri judul sesuai program
yang kita buat. Delphi akan secara otomatis memberi nama form1, form2, form3, dst. Nama form tersebut kurang mengandung arti dan akan menyulitkan bila form yang dibuat cukup banyak. Saat membuka Delphi pertama kali, nampak sebuah jendela Object Inspector. Jika tidak muncul pilih menu View | Object Inspector atau tekan tombol F11. Pada Object Inspector ada dua buah halaman (tab) yaitu Properties dan Events. Properties digunakan untuk mengganti properti (kepemilikan) sebuah objek/komponen. Sedangkan Events digunakan untuk membuat procedure yang diaktifkan (trigered) lewat sebuah event.
Nama objek Tab events Tab properties
Properties Caption
Nilai / isi dari properties
Gambar 2. Jendela Object Inspector untuk mengganti properti caption
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3 `
Semua properti diurutkan berdasarkan alpabetik, dan dapat juga diurutkan berdasarkan kategori.
Gantilah judul form dengan Hello melalui properti Caption, sedangkan nama form dengan nama frmHello melalui properti Name. Caption digunakan untuk menyimpan keterangan yang dimunculkan pada form, sedangkan Name digunakan sebagai Nama dari objek tersebut.
Catatan : Isi dari properti Name harus diawali alpabet dan tidak menggunakan spasi atau tanda baca. Anda sekarang sudah membuat aplikasi form kosong dengan tombol standar window : Minimize, Maximize, dan Close. Anda dapat mengubah ukuran form dengan menarik pada bingkai form menggunakan mouse (drag = klik tombol kiri mouse, tahan tombol tersebut lalu geser ke kiri/kanan atau atas/bawah). Anda dapat memindahkan form dengan meletakkan kursor pada form kemudian menggesernya (drag). 1.1.3
Menyimpan Form Pada Delphi ada 3 buah file utama (*.dpr, *.pas dan *.dfm).
a) *.dpr adalah file proyek yang dibuat berisi program kecil untuk :
mendefinisikan Unit yang ada dalam file proyek
menginisialisasi data
membangun form
menjalankan aplikasi
uses Forms, Unit1 in ‘Unit1.pas’ {Form1}; begin Application.Initialize; Application.CreateForm(Tform1, Form1); Application.Run; end. b) *.pas adalah unit-unit (pascal code file), bisa terdiri satu atau banyak file c) *.dfm adalah file definisi Form (special pseudo code file), bisa terdiri satu atau banyak file
object Form1: Tform1 Left = 200 Top = 108 Width = 696 Height = 480 Caption = ‘Form1’ : Font.Name = ‘MS Sans Serif’ Font.Style = [] PixelsPerInch = 96 TextHeight = 13 object Button1: Tbutton Left = 176 Top = 116 : end Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
Catatan: Setiap Form (.dfm) harus memiliki sebuah Unit (.pas), tetapi anda dapat memiliki Unit tanpa sebuah Form (hanya kode saja). Jika ingin melihat kode tersebut anda dapat mengklik kanan mouse, lalu pilih VIEW AS TEXT atau tekan tombol AltF12. Sebaiknya anda tidak mengubah isi code tersebut, karena akan menyebabkan masalah serius. Tunggu saat anda sudah memahami maksud kode tersebut. Untuk kembali ke bentuk form, pilih VIEW AS FORM atau tekan tombol Alt- F12 kembali. Pilih submenu Save Project atau Save Project As pada menu File, dan Delphi akan menanyakan nama file source code untuk unit (*.pas) dan nama file proyeknya (*.dpr). Beri nama file form dengan HELLO.PAS dan project HELLO.DPR. Sesudah disimpan, jalankan program dengan menekan tombol F9 atau pilih menu Run | Run. 1.1.4
Menempatkan Komponen pada Form Karena Delphi merupakan bahasa pemrograman visual, maka komponen-komponen akan nampak pada
layar. Anda tinggal menempatkan komponen yang diinginkan pada form. Ada empat cara menempatkan komponen pada form. Misal anda memilih komponen Button pada Components Palette bagian Standard Page. Anda dapat memilih salah satu langkah berikut:
Klik pada kompenen tersebut, pindahkan kursor ke form, sambil menekan tombol kiri mouse (drag komponen dan geser pada form) atau
Pilih komponen (klik komponen yang diinginkan) pada Components Palette kemudian klik pada form dimana komponen itu akan diletakkan.
Klik ganda pada komponen yang diinginkan, maka komponen tersebut akan ditambahkan pada form
Anda dapat menggunakan Copy dan Paste bila ingin membuat komponen yang sama yang sudah ada pada form. Caranya Shift-Klik kiri pada komponen yang ada di form, lalu pilih menu Copy (Ctrl-C) kemudian pilih menu Paste (Ctrl-V).
Speedbar Menu utama : File, Edit, Seaarch, View, dll.
Component palette bagian Tab Standard
komponen Label
Gambar 3. Kumpulan komponen
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5 1.1.5
Mengatur Tataletak Komponen Pada form ini hanya ada satu button, mungkin ada di bagian tengah form. Anda dapat mengatur letak
komponen tersebut dengan menggesernya. Bila anda ingin merapihkan pilih menu View |Alignment Palette, maka muncul sebuah Toolbox Align dengan ikon perapihan (alignment icons).
Gambar 4. Form dan Toolbox Alignment Dengan toolbox ini anda dapat merapikan beberapa komponen sekaligus, caranya buat fokus beberapa komponen, lalu klik icon pada toolbox yang diinginkan. Untuk mengetahui arti icon tersebut gerakan mouse pada tombol tersebut, lalu akan muncul penjelasan singkat kegunaan icon tersebut atau lihat Help (tekan F1). Anda bisa mempelajarinya sendiri. Cukup mudah!. Langkah yang penting adalah mengubah nama dan keterangan kompenen button tersebut. Ikuti bagian ini 1.1.6
Mengubah Nilai Properti Ubah nilai properti Caption menjadi Katakan Hello dan nilai properti Name menjadi btnHello.
Langkah ini mirip dengan mengubah nama dan keterangan sebuah form.
Setiap komponen sebaiknya diberinama yang memiliki arti dan diawali oleh jenis komponennya. Misal nama dari form Hello adalah “frmHello” atau nama dari button Hello adalah “btnHello”. Tujuannya adalah mengelompokkan komponen-komponen sejenis, karena pada Object Inspector nama komponen diurutkan berdasarkan alpabet. Properti name adalah properti internal dan digunakan untuk memberi nama pada sebuah komponen/objek. Nama ini adalah sebuah variabel yang mengacu pada komponen tersebut. Beberapa aturan penamaan komponen atau variabel atau identifer sebagai berikut
Diawali alpabet, berikutnya boleh angka, garis bawah.
Tidak memakai spasi atau tanda-tanda baca atau operator
Boleh huruf kapital atau kecil, tidak ada perbedaan
Tidak menggunakan kata kunci (reserve word) yang digunakan Delphi
Biasakan nama komponen diawali kelompok komponennya, misal btnHello, frmHello, rgrKelas.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
Berikut contoh penamaan yang keliru menggunakan spasi
Gambar 5. Pesan kesalahan saat mengubah properti Name. Sesudah anda mengubah properti anda dapat melihat kode programnya (tekan Alt-F12) sebagai berikut : object Form1: Tform1 : Caption = ‘Hello’ : object btnHello: Tbutton Caption = ‘Katakan Hello’ End end 1.1.7
Membuat Method/Procedure lewat Event Saat anda menekan tombol pada sebuah form atau komponen, Windows memberitahukan bahwa
aplikasi mengirim pesan yang dibangkitkan oleh event tertentu . Delphi akan menanggapi dengan menerima event atau panggilan tersebut. Hal ini yang dinamakan penanganan event (event-handler method). Delphi mendefinisikan sejumlah event pada setiap komponennya. Daftar event ini berbeda untuk setiap komponen. Event yang paling umum pada komponen Button adalah OnClick. Artinya jika komponen Button tersebut di Klik maka akan melakukan procedure apa. Ada beberapa teknik yang dapat dilakukan untuk menangani event misal OnClick pada komponen button :
Klik ganda pada button tersebut, maka sebuah method/procedure btnHelloClick
Pilih button, kemudian pilih Object Inspector’s combo box (called the Object Selector), pilih Tab Events, dan klik ganda pada area putih disebelah kanan event OnClick
Pilih button, pilih Tab Events, dan masukkan nama method yang dikehendaki, misal btnHelloClick pada area putih di sebelah kanan event OnClick
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
Gambar 6.
Tab Events pada Object Inspector, dan procedure yang dibangkitkan lewat event OnClick.
Bila anda ingin menghapus procedure atau penanganan event tersebut, anda dapat menghapus pada editor Unit tersebut. Hapus blok procedure tersebut dan hapus pada bagian definisi procedure yang ada diatasnya. Sekarang anda mengisi procedure tersebut dengan perintah untuk menampilkan pesan sebagai berikut :
procedure Tform1.BtnHelloClick(Sender: Tobject); begin MessageDlg (‘Hello, guys’, mtInformation, [mbOK], 0); end; Perintah ini sangat sederhana, yaitu untuk menampilkan pesan. Fungsi ini mempunyai empat parameter. Untuk rincinya anda dapat melihat bantuan (F1).
Parameter pertama
: kalimat yang akan dimunculkan (pesannya)
Parameter kedua
: tipe message box seperti mtWarning, mtError, mtInformation, atau mtConfirmation. Coba lihat perbedaannya.
Parameter ketiga
: kumpulan tombol yang akan digunakan seperti mbYes, mbNo, mbOK, mbCancel, atau mbHelp.
Parameter keempat
: untuk help context atau nomor halaman pada Help, beri angka nol jika anda tidak mempunyai file help.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
Gambar 7. Message box 1.1.8
Kompilasi dan Jalankan Program Tekan tombol Run atau pilih menu Run | Run, Delphi does the following:
1.
Kompilasi Pascal source code file yang mendefinisikan form-form yang ada (.pas,.dfm)
2.
Kompilasi project file (.dpr)
3.
Buat executable (.EXE) file
4.
Jalankan executable file, biasanya pada mode pencarian kesalahan (debug mode).
1.2 PERINTAH SEQUENCE / DIPROSES SECARA BERUNTUN Perintah-perintah ini akan diproses oleh kompiler secara berurutan. Contoh kita memiliki 3 baris perintah. Kompiler akan memroses mulai dari baris-1, baris-2 kemudian baris-3. Contoh program untuk menampilkan pesan sebanyak 3 kali seperti berikut :
MessageDlg (‘Hello, guys’, mtInformation, [mbOK], 0); MessageDlg (‘Hello, lady’, mtInformation, [mbOK], 0); MessageDlg (‘Hello, everybody’, mtInformation, [mbOK], 0); Berikut latihan ke-1 untuk tiga buah aplikasi yaitu membuat tombol Hello, saat diklik tombolnya, tombol akan beraksi dengan memunculkan pesan. Ikuti langkahnya sebagai berikut : 1.
Buat form frmHello1 seperti yang sudah dijelaskan.
Komponen yang dibutuhkan form dengan nama frmHello1 dan button dengan nama btnHello1. Ubah properti name-nya
Ubah properti caption masing-masing komponen menjadi Membuat program Hello1 dan Katakan Hello
Buat method dari komponen btnHello1 lewat event OnClick, seperti berikut
procedure TfrmHello1.btnHello1Click(Sender: Tobject); begin MessageDlg (‘Hello, guys’, mtInformation, [mbOK], 0); end;
2.
Jalankan program lihat hasilnya
Coba ganti parameter ke-1, ke-2 dan ke-3
Simpan dengan nama unit uHello1.pas dan project pHello1.dpr pada direktori Latih1
Buat aplikasi baru (File-New-Application) dengan form baru frmHello2 mirip form frmHello1 dengan tambahan sebagai berikut. Apa yang terjadi? (properti caption dari komponen tombol diganti saat program berjalan)
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Komponen yang dibutuhkan form dengan nama frmHello2 dan button dengan nama btnHello2. Ubah properti name-nya
procedure TfrmHello2.btnHello2Click (Sender: Tobject); begin MessageDlg (‘Hello, guys’, mtInformation, [mbOK], 0); BtnHello2.Caption := ‘Say Hello Again’; end;
Buat method untuk mengubah ukuran formHello2 lewat event OnResize, perhatikan apa yang terjadi bila ukuran form diubah saat program berjalan
procedure TfrmHello2.FormResize(Sender: Tobject); begin BtnHello2.Top := frmHello2.ClientHeight div 2 – BtnHello2.Height div 2; BtnHello2.Left := frmHello2.ClientWidth div 2 – BtnHello2.Width div 2; end; 3.
Simpan dengan nama unit uHello2.pas dan project pHello2.dpr pada direktori Latih1
Buat aplikasi baru (File-New-Application) dengan form baru frmHello3 seperti yang sudah dijelaskan. Objek Form1 Button1 Label1
Properties Name Name Caption Name Font
Value of properties FrmHello3 BtnHello3 &Show Me LblHello3 Size 24
Method lewat event (lihat dibawah)
Buat method dari komponen btnHello3 lewat event OnClick, seperti berikut
procedure Tform1.btnHello3Click(Sender: Tobject); begin if btnHello3.caption =’&Show Me’ then begin lblHello3.caption := ‘Selamat Datang di Delphi 5.0’; btnHello3.caption :=’&Hide Me’; end else begin lblHello3.caption := ‘’; btnHello3.caption :=’&Show Me’; end; end;
Jalankan program lihat hasilnya
Simpan dengan nama unit uHello3.pas dan project pHello3.dpr pada direktori Latih1
2.1. Menu dan Perintah pada Delphi Ada empat cara untuk memberi perintah pada lingkungan Delphi (Delphi environment):
Gunakan menu
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Gunakan Short Cut (misal F9, F12 dsb)
Gunakan SpeedBar (atau toolbar).
Gunakan SpeedMenu ( lokal menu yang diaktifkan dengan tombol mouse kanan).
Berikut menu utama yang ada pada Delphi (untuk mempelajarinya gunakan Help Delphi): Menu File. Menu ini berhubungan dengan file seperti membuat, menyimpan dan mengakhiri sebuah pekerjaan. Menu Edit .Menu ini berhubungan dengan penyuntingan apa yang dikerjakan seperti Undo , Redo, Cut, Copy, Paste atau dapat dengan tombol Ctrl+Z, Ctrl+X, Ctrl+C, Ctrl+V. Menu Search. Menu ini berhubungan dengan pencarian dan penggantian data.
Gambar 8. Jendela Find Text Menu View. Menu ini berhubungan dengan penampilan atau apa yang akan ditampilkan. Menu Project. Menu ini berhubungan dengan proyek yang sedang dibuat, misal unit yang akan ditambahkan ke proyek ini, unit apa yang akan dihapus, dsb. Menu Run. Menu ini berhubungan dengan menjalankan program, mencari kesalahan (debug), dsb. Menu Component. Menu ini berhubungan dengan komponen, misal menambah komponen baru, menghapus komponen yang ada. Menu Database. Menu ini berhubungan dengan Database, Database Form Wizard dan Database Explorer. Menu Tools. Menu ini berhubungan dengan pengaturan/konfigurasi, tool-tool pembantu Delphi. Menu Help. Menu ini berhubungan dengan informasi mengenai Delphi, Help / bantuan 2.2. Component, Property, Method, Event Kode yang akan dilihat, serupa dengan struktur Bahasa Pascal. Delphi adalah bahasa pemrograman berbasis objek, artinya pendekatan pembuatan program melalui objek-objek yang ada. Misalnya objek form, text dsb. Setiap objek akan memiliki properti (atribut) dan method yang diaktifkan / dipicu oleh event. Mari kita lihat penjelasan berikut. Apakah Objek (COMPONENT) itu? Ingat sebuah komponen adalah sebuah objek pada Palette, :
sebuah Objek, adalah sebuah komponen dalam Component Palette,
atau sesuatu yang dibuat melalui kode-kode / bahasa pemrograman
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 Jadi sebuah objek adalah secara umum kelas dari kumpulan sesuatu. Komponen pasti objek namun tidak selalu merupakan komponen, misal TstringList adalah sebuah objek (kumpulan karakter), dan bukan sebuah komponen. Penjelasan mengenai komponen di Lampiran A. Apakah sebuah PROPERTY itu? Sebuah Property tidak lain adalah sebuah nama/variabel milik sebuah objek/komponen misal Caption, Text yang dapat diubah nilai baik melalui object Inspector atau melalui program. Beberapa istilah/ nama berikut yang mirip, dan sering digunakan:
Procedure adalah kumpulan perintah yang melakukan suatu proses tertentu
Function adalah sama dengan procedure, tetapi proses tersebut dapat mengembalikan suatu hasil / nilai misal hasilnya = 1
Method adalah procedure atau function yang tergabung pada sebuah komponen
Subroutine adalah istilah umum dari semuanya (procedure/function/method) misal pada bahasa Basic.
Apakah sebuah METHOD itu? Sebuah method adalah sebuah function/fungsi yang tergabung dalam sebuah objek. Contoh ListBox (dapat berarti sebuah array of strings) yang memiliki Method (Clear) yang membuat Listbox tersebut menjadi kosong. CLEAR adalah sebuah Method pada ListBox tersebut.
Begin ListBox1.Clear; // Mengosongkan isi ListBox ListBox1.Items.LoadFromFile(‘c:\Data1.txt’); //properti Items (bertipe string) memiliki method untuk LoadFromFile end; Apakah sebuah EVENT itu? Sebuah Event adalah sebuah aksi pengguna (User Action) misal Mouse Click, KeyPressed. Setiap Events diawali dengan kata ‘On’. Contoh : Nama event
Nama method
OnClick ..
Button1Click(Sender : Tobject)
OnKeyDown ..
Button1KeyDown(Sender : Tobject)
OnMouseMove ..
Button1MouseMove(Sender : Tobject)
2.3. Cara Delphi Bekerja Saat anda menambahkan Components pada Form1 dan merubah nilai properti, Delphi akan membuat (pseudo) code (dalam Unit1.dfm) untuk mendefinikan apa yang anda lakukan. Secara normal, ANDA TIDAK DIHARAPKAN MENGUBAHNYA Unit1.dfm File; Anda hanya bekerja pada Form1 secara Visual. Ini yang dinamakan bahasa pemrograman Visual (Visual Programming) Apakah Delphi itu?
Delphi (IDE) adalah sebuah Visual Interface antara anda (the User) dan Komputer anda (yang berjalan diatas Windows ).
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Delphi menterjemahkan Visual Components (Buttons, Panels,..) yang ada pada Form kedalam sebuah kode-kode komputer (pseudo in Unit1.dfm) yang mendefinisikan bagaimana dibentuknya form dan komponennya termasuk juga propertinya.
Saat anda mengkompilasi program, apa yang terjadi?
Delphi akan memanggil file .dpr file (file proyek anda)
Delphi meminta program yang ada dalam proyek tersebut dan file dpr memberikan sebagai berikut :
Delphi meminta, Apa yang dilakukan pertama kali ? .dpr file memberikan sebagai berikut:
uses beginForms, Unit1 inApplication.Initialize; ‘Unit1.pas’ {Form1};itializes stuff Application.CreateForm(Tform1, Form1); Application.Run; end.
2.4. Forms, Dialog Boxes, Messages , ... Menampilkan Form atau Window Anda dapat bekerja dengan beberapa form pada sebuah project. Saat anda berada di Form1 untuk menampilkan form yang lain misal Form2 sebagai berikut : Form2.Show; Membuka (Shows) Form2 (tetapi user diijinkan untuk dapat mengklik Form1) Form2.ShowModal; Membuka (Shows) Form2 (tetapi user TIDAK DIIJINKAN mengklik Form1) Menampilkan Pesan (Message) ShowMessage('Ini kotak pesan); Tampilan sederhana sebuah baris/teks; User dapat menekan tombol OK untuk keluar dari kotak pesan (message window). MessageDlg('Msg',mtConfirmation,[mbYes],0); Mirip ShowMessage tapi dapat lebih dari satu tombol pilihan. if MessageDlg ('Please say YES or ',mtConfirmation,[mbYes,mbNo],0) = mrYES then begin Label1.Text:='Tekan tombol YES'; end;
TMsgDlgType = mtWarning,mtError,mtInformation, mtConfirmation, mtCustom TMsgDlgBtn = mbYes,mbNo,mbOK,mbCancel,mbAbort,mbRetry,mbIgnore,mbAll,mbHelp Return values = mrNone, mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll Meminta Masukan (Input Box)
InputBox(...); var InputString: string; begin InputString:= InputBox('Masukkan Nama', 'Please Enter your Name',''); end; Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
3. PERINTAH PENCABANGAN / STRUKTUR PEMILIHAN Pada beberapa kasus terkadang kita menginginkan komputer melakukan suatu aksi tertentu bila suatu kondisi terpenuhi. Keberadaan perintah bersyarat pada suatu program memberikan pencabangan proses seperti ditunjukkan oleh Error! Not a valid link.. Bahasa Pascal menyediakan dua cara penyajian perintah bersyarat, yaitu If…Then…Else dan Case…of.
Kondisi 1
Kondisi 2
Aksi 1
Aksi 2
Gambar 3.1 Pencabangan pada program Pada prinsipnya pemilihan aksi dapat dikelompokkan menjadi 3 bagian :
Pemilihan 1 pilihan/kasus. Gunakan perintah IF – THEN Pemilihan 2 pilihan/kasus. Gunakan perintah IF – THEN – ELSE Pemilihan N pilihan/kasus. Gunakan Case – of (Catatan sebenarnya dapat menggunakan if—then – else bersarang) 3.1. IF … THEN : Pemilihan 1 kasus Perintah bersyarat If – then digunakan hanya melakukan 1 aksi bila kondisi dipenuhi. Bentuk sintaks dari perintah bersyarat ini adalah:
If
then Begin ... {aksi-1} end; 3.2. IF … THEN … ELSE : Pemilihan 2 kasus Perintah bersyarat If umumnya digunakan untuk melakukan pencabangan sederhana (antara 2 atau 3 cabang). Atau untuk pencabangan yang banyak, dimana kondisi yang menjadi prasyaratnya melibatkan lebih dari satu parameter. Bentuk sintaks dari perintah bersyarat ini adalah:
If then Begin ... {aksi-1} end else Begin ... {aksi-2} end;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
3.3. IF … THEN … ELSE : Pemilihan N kasus
If then Begin ... {aksi-1} end else If then Begin ... {aksi-2} end else Begin ... {aksi-3} End; 3.4. CASE … OF … : Pemilihan N kasus Perintah bersyarat Case umumnya digunakan untuk kondisi dengan banyak pencabangan. Syarat pencabangan pada bentuk ini hanya boleh melibatkan satu buah parameter dengan tipe data bukan Real. Pemeriksaan kondisi di sini lebih tepat disebutkan dalam hubungan relasi samadengan (=). Dengan demikian bila parameter bernilai tertentu maka dilakukan suatu aksi terkait, bila bernilai lain maka dilakukan aksi yang lain juga, demikian seterusnya.
Case <Parameter> Of : ; : ; ... : ; Else ; End;
Latihan ke-2 Buat aplikasi baru dengan nama form frmWelcome, kemudian ubah nama komponen/objek sebagai berikut: Objek Form1 Button1 Label1
Label2 Label3
Properti Name Caption Name
Nilai properti FrmWelcome Welcome BtnQuit
Metode lewat event OnActive
Caption Name Caption Font Name Caption Name
&Quit Lblunsur Lambang Unsur Kimia Times New Roman, Bold, Size : 18 Lblchoose Pilih Lambang Unsur Lbllambang
OnClick, isi application.terminate;
dengan:
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 Caption Font Label4
Name Caption Font
listBox1
Name
(kosong) Times New Roman, Bold, Size =12, Color = clTeal Lblcomment (kosong) Times New Roman, Bold-Italic,Size = 24, Color = clTeal Lbxunsur
OnClick
Buat method dari komponen frmWelcome lewat event OnActivate, seperti berikut
procedure TForm1.FormActivate(Sender: TObject); begin lbxCountry.Hint := 'Please choose...'; lbxCountry.Items[0]:='Ca'; lbxCountry.Items[1]:= 'C'; lbxCountry.Items[2]:= 'Cu'; lbxCountry.Items[3]:= 'Cd'; end;
Buat method dari komponen lbxCountry lewat event OnClick, seperti berikut
procedure TForm1.lbxCountryClick(Sender: TObject); begin lblCountry.caption := lbxCountry.Items[lbxCountry.ItemIndex]; case lbxCountry.ItemIndex of 0 : lblComment.caption := 'lambang unsur dari Calsium' ; 1 : lblComment.caption := 'lambang unsur dari Carbon' ; 2 : lblComment.caption := 'lambang unsur dari Cuprum' ; 3 : lblComment.caption := 'lambang unsur dari Cadmium' ; end; end;
Simpan dengan nama unit uWelcome1.pas dan project pWelcome1.dpr pada direktori Latih3
4. STRUKTUR PENGULANGAN Dalam menyelesaikan masalah, terkadang kita harus melaku suatu proses yang sama lebih dari satu kali. Untuk itu perlu dibuat suatu algoritma pengulangan. Pascal memberikan tiga alternatif pengulangan, yaitu dengan For, While, atau Repeat. Masing-masing memiliki karakteristik, yang akan dipelajari pada modul ini. Ada dua hal yang penting dalam melakukan merancang perintah pengulangan, yaitu:
Inisialisasi awal.
Nilai akhir pengulangan atau kondisi berhenti.
4.1. FOR – TO - DO Pada pengulangan dengan For, inisialisasi awal dan kondisi akhir ditentukan dengan menggunakan suatu variable kendali yang nilainya dibatasi dalam suatu range tertentu. Sintaks untuk perintah ini adalah:
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
atau
For := to do Begin … {aksi} End ; For := downto do Begin … {aksi} End ;
Perbedaan antara to dan downto adalah pada kondisi nilai awal dan akhir. Pada to: nilai awal lebih kecil dari nilai akhir, sedangkan pada downto nilai awal lebih besar dari nilai akhir. Perlu diingat, bahwa variable kendali harus dideklarasikan dengan tipe data integer. Contoh program pengulangan menggunakan For-to-do
procedure TfrmPengulangan.btnPengulanganClick(Sender: TObject); var I : integer; begin lbxHasil.Items.Clear; For I := 1 to 5 do Begin lbxHasil.Items.Add(inttoStr(i)); End; End; Hasilnya adalah : 1, 2, 3, 4, 5 Contoh program yang sama jika tapa perintah tanpa pengulangan
procedure TfrmPengulangan.btnPengulanganClick(Sender: TObject); begin lbxHasil.Items.Clear; lbxHasil.Items.Add(inttoStr(1)); lbxHasil.Items.Add(inttoStr(2)); lbxHasil.Items.Add(inttoStr(3)); lbxHasil.Items.Add(inttoStr(4)); lbxHasil.Items.Add(inttoStr(5)); End; Hasilnya adalah : 1, 2, 3, 4, 5 4.2. WHILE - DO Pada metoda pengulangan ini aksi hanya akan diproses bila kondisi pengulangan terpenuhi, bentuk sintaks dari pengulangan ini adalah:
While do Begin … {aksi} End ; Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Selama kondisi_pengulangan bernilai true maka aksi akan dilakukan, dan baru akan berhenti setelah kondisi pengulangan bernilai false. Karena kondisi pengulangan diperiksa pada bagian awal, maka ada kemungkinan aksi tidak pernah dilakukan, yaitu bila kondisi pengulangan tidak pernah bernilai true. Contoh program pengulangan menggunakan While-do
procedure TfrmPengulangan.btnPengulanganClick(Sender: TObject); var I : integer; begin lbxHasil.Items.Clear; I := 1; While I<=5 DO Begin lbxHasil.Items.Add(inttoStr(i)); I := I + 1; End; End;
4.3. REPEAT - UNTIL Metoda pengulangan ini juga melakukan pengulangan berdasarkan pemeriksaan kondisi pengulangan. Hanya saja natur dari pengulangan ini adalah sistem seakan-akan memaksa untuk melakukan pengulangan, sampai di ketahui adanya kondisi berhenti. Bentuk sintaks dari pengulangan ini adalah:
Repeat … {aksi} Until Berlawanan dengan While, yang akan memproses aksi hanya bila kondisi_pengulangan bernilai true, pada pengulangan Repeat, sistem akan memproses aksi selama kondisi_berhenti bernilai false. Dengan demikian aksi pasti akan selalu diproses (minimal satu kali). Pada tipe ini, pengulangan dapat terjadi terus-menerus (tidak pernah berhenti), yaitu bila kondisi berhenti tidak pernah bernilai true.
procedure TfrmPengulangan.btnPengulanganClick(Sender: TObject); var I : integer; begin lbxHasil.Items.Clear; I := 1; Repeat lbxHasil.Items.Add(inttoStr(i)); I := I + 1; Until I > 5; End;
Contoh program pengulangan menggunakan Repeat- Until
Latihan ke-3 Buat aplikasi bari dengan nama form frmPengulangan, kemudian ubah nama komponen/objek sebagai berikut:
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 Objek Form1 Button1 Label1
ListBox1
Properti Name Caption Name Caption Name Caption Font Name Font
Nilai properti FrmPengulangan Pengulangan BtnPengulangan &Pengulangan LblComment (kosong) Times New Roman, Bold-Italic, Size = 12 LbxHasil Times New Roman, Bold-Italic, Size = 20, Color = clTeal
Method lewat event
Onclick
OnClick
Buat method dari komponen btnPengulangan lewat event OnClick, seperti berikut
procedure TfrmPengulangan.btnPengulanganClick(Sender: TObject); var I : integer; begin lbxHasil.Items.Clear; For I := 0 to 20 do Begin lbxHasil.Items.Add(inttoStr(i)); end; end;
Buat method dari komponen lbxHasil lewat event OnClick, seperti berikut
procedure TfrmPengulangan.lbxHasilClick(Sender: TObject); begin lblComment.caption := 'Dicetak saat I bernilai ' + IntToStr(lbxHasil.ItemIndex); end;
Simpan dengan nama unit uPengulangan1.pas dan project pPengulangan1.dpr pada direktori Latih4
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
TIPE DATA DALAM DELPHI
2.1 BERLATIH TIPE DATA DI DELPHI Setiap data yang disimpan di memori komputer harus memiliki tipe data. Tipe data yang sederhana sekali adalah dikelompokkan menjadi 2 bagian : 1.Teks : a.Char (terdiri dari 1 huruf /1 angka) b.String (terdiri dari beberapa huruf/angka) 2.Bilangan : a.Integer (bilangan bulat ) b.Real (bilangan pecahan) Di Delphi ada beberapa tipe data varian dari kedua tipe data tersebut, yang membedakan adalah range (rentang nilainya). Lihat lampiran tipe data lebih lengkap. 1.1.Berlatih Tipe Data Float dan String Dengan memahami seperti ini kita akan coba membuat sebuah program (projek)untuk menghitung tekanan gas ideal, rumusnya sebagai berikut : P := (n*R*T)/V ; Tempatkan komponen-komponen berikut pada form kemudian ubah nilai propertiesnya :
Objek Label1
Properti Caption Font
Label2
Caption Font
Label3
Caption Font
Label4
Caption Font
Label5
Caption Font
Button1
Caption Font Caption Font Color Name Text Text
Button2 Form1 Edit1 Edit2
Nilai properti Tulis : MENGHITUNG TEKANAN GAS IDEAL Tahoma, style : bold, size : 14, effects : underline, color : green Tulis : mol (n) Tahoma, style : bold, size : 12, color : green Tulis : suhu (T) Tahoma, style : bold, size : 12, color : green Tulis : volume (V) Tahoma, style : bold, size : 12, color : green Tulis : tekanan (P) Tahoma, style : bold, size : 12, color : green Tulis : HITUNG Tahoma, style : bold, size : 12 Tulis : KELUAR Tahoma, style : bold, size : 12 clMoneyGreen Formtekanan (kosong) (kosong)
Method lewat event
OnClick OnClick
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2 Edit3 Edit4
Text Text
(kosong) (kosong)
Berikut desain form di Delphi :
Gambar12. Desain form tekanan Membuat even OnClick pada Button1 procedure TForm1.Button1Click(Sender:TObject); begin //Konversi dari String ke Float n :=StrTofloat(Edit1.Text); T :=StrTofloat(Edit2.Text); V :=StrTofloat(Edit3.Text); P := (n*R*T)/V ; //Konversi dari Float ke String Edit4.Text :=floatToStr(P); end;
Catatan : Pada bagian Var, tambahkan : n,T,V,P : real ; Pada bagian Const, tambahkan : R = 0.082 ; Membuat even OnClick pada Button2 procedure TForm1.Button2Click(Sender:TObject); begin application.terminate; end; Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
Hasil running program aplikasi
Gambar14. Hasil Running Di bawah ini adalah sebagian dari tipe data pada Delphi : 1. Integer Merupakan tipe data bilangan bulat, dengan : Type Integer Cardinal
Range –2147483648..2147483647 0..4294967295
Format signed 32-bit unsigned 32-bit
Secara fundamental, tipe integer terdiri dari : Type Shor int Smallin Longin Int64 Byte Word Longword
Range –128..127 –32768..32767 –2147483648..2147483647 –263..263 –1 0..255 0..65535 0..4294967295
Format signed 8-bit signed 16-bit signed 32-bit signed 64-bit unsigned 8-bit unsigned 16-bit unsigned 32-bit
2. Real Merupakan bilangan pecahan, dengan : Type Significant digits Real48 Single
Size in bytes 11 –12 7 –8
Range 2.9 x 10–39 ..1.7 x 10386 1.5 x 10–45 ..3.4 x 10384
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
Double 15 –16 5.0 x 10–324 ..1.7 x 103088 Extended 19 –20 3.6 x 10–4951 ..1.1 x 10493210 Comp 19 –20 –263+1 ..263 –18 Currency 19 –20 –922337203685477.5808..922337203685477.58078 Secara Generik, tipe real adalah : Type Significant digits Real
Size in bytes 15 –16
Range 5.0 x 10–324 ..1.7 x 103088
3. String Merupakan huruf, dengan : Type Char ShortString AnsiString WideString
Maximum lenght 1 characters 255 characters ~231 characters ~230 characters
Memory required 1 bytes 2 to 256 bytes 4 bytes to 2GB 4 bytes to 2GB
4. Boolean Merupakan tipe variabel logika. Nilai dari variabel dari bertipe Boolean adalah True atau False.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
FUNGSI STANDART & PENULISAN EKSPRESI ARITMATIKA DELPHI
FUNGSI STANDAR ARITMATIKA Dalam aplikasi problem-problem sains sejumlah fungsi matematika sering diperlukan. Beberapa fungsi telah tersedia (integrated) dalam Turbo Pascal dan sebagian lagi diperlukan pemrograman. Beberapa fungsi dalam Delphi dapat adalah sebagai berikut : 1.
FUNGSI FUNGSI ARITMATIKA 1.1. ABS (X)
1.2. CEIL (X)
1.3. EXP (X)
1.4. FLOOR (X)
DESKRIPSI Digunakan untuk menentukan harga mutlak (absolut) dari argumen X Contoh : Var r : single ; i : integer ; begin r := Abs(-2.3) ; {hasil 2.3} i := Abs(-157) ; {hasil 157} end; Digunakan untuk menghasilkan nilai integer terendah yang lebih besar atau sama dengan argumen X. Contoh : Var i, j : real ; begin i := Abs(-2.8) ; {hasil -2} j := Abs(2.8) ; {hasil 3} end; Digunakan untuk menghasilkan nilai eksponen, atau nilai e yang dipangkatkan dengan argumen X, dimana e adalah bilangan dasar logaritma 2.718281828 Contoh : Var e : real ; S : string ; begin e := exp(1.0) ; Str(ln(e):3:2, S) ; end; Digunakan untuk menghasilkan pembulatan (integer) ke bawah dari suatu bilangan ke kelipatan terdekat yang diberikan. Contoh : Var i, j : integer ; begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
1.5. FRAC(X)
1.6. INT(X)
1.7. LN(X)
1.8. MAX(X,Y)
1.9. MIN(X,Y)
1.10. PI 1.11. POWER(X,Y)
i := Floor(-2.8) ; {hasil -3} j := Floor(2.8) ; {hasil 2} end; Digunakan untuk menghasilkan bagian pecahan dari argumen X. Contoh : Var R : real ; begin R := Frac(123.456) ; {hasil 0.456} R := Frac(-123.456) ; {hasil -0.456} end; Digunakan untuk membulatkan bilangan pecahan dengan pembulatan ke bawah menghasilkan bilangan bulat terdekat. Contoh : Var R : real ; begin R := Int(123.456) ; {hasil 123.0} R := Int(-123.456) ; {hasil -123.0} end; Digunakan untuk menampilkan logaritma suatu bilangan dengan basis e. Contoh : Var e : real ; S : string ; begin e := Exp(1.0) ; Str(ln(e):3:2,S); S := ’e=’+FloatToStr(e) ; Edit1.Text := S ; end; Menentukan nilai tertinggi atau terbesar dari dua bilangan. Contoh : Var S : string ; i : integer ; begin i := Max(10,15); {menghasilkan nilai 15} S := ’Max’ = ’+IntToStr(i); Edit1.Text := S ; end; Menentukan nilai terendah atau terkecil dari dua bilangan. Var S : string ; i : integer ; begin i := Min(10,15); {menghasilkan nilai 10} S := ’Min’ = ’+IntToStr(i); Edit1.Text := S ; end; Digunakan untuk menghasilkan nilai pi (3.1415926535897932385) dalam perhitungan matematika. Digunakan untuk menghasilkan nilai hasil pemangkatan suatu bilangan X dengan nilai pemangkat Y. Contoh : Var S : string ; i : extended ; begin i := power(2,3); {hasil 8} S := ’Power’ = ’+FloatToStr(i);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
1.12. ROUND(X)
1.13. SQR(X)
1.14. SQRT(X)
1.15. TRUNC(X)
2.
FUNGSI TRIGONOMETRI 2.1. ARCCOS(X)
2.2. ARCSIN(X)
Edit1.Text := S ; end; Digunakan untuk menghitung pembulatan data numerik X yang bertipe real dan menghasilkan suatu nilai yang bertipe integer. Contoh : Var S, T : String ; Begin Str(1.4:2:1,T) ; {hasil 1} S := T +’menjadi’+IntToStr(Round(1.4)) ; Str(1.5:2:1,T) ; {hasil 2} S := T +’menjadi’+IntToStr(Round(1.5)) ; Str(-1.4:2:1,T) ; {hasil -1} S := T +’menjadi’+IntToStr(Round(-1.4)) ; Str(-1.5:2:1,T) ; {hasil -2} S := T +’menjadi’+IntToStr(Round(-1.5)) ; MessageDlg(S, mtInformation,[mbOk],0) ; end; Memberikan nilai kuadrat suatu bilangan X. Contoh : var S, Y : string; begin Str(Sqr(5.0):3:1,Y) ; {hasil 25} S := ’5 bernilai kuadrat’ + Y ; Edit1.Text := S; end; Memberikan nilai akar kuadrat suatu bilangan X. Contoh : var S, Y : string; begin Str(Sqrt(2.0):5:4,Y) ; {hasil 1.4142} S := akar kuadrat dari 2 adalah’ + Y ; MessageDlg(S, mtInformation,[mbOk],0) ; end; Menghilangkan bagian nilai pecahan tanpa memperhatikan pembulatan dari suatu data numerik. Contoh : Var S, T : string ; begin Str(1.4:2:1, T); S := T +’hasil’+IntToStr(Trunc(1.4)) ; Edit1.Text := S ; Str(-1.4:2:1, T); S := T +’hasil’+IntToStr(Trunc(-1.4)) ; Edit1.Text :=Edit1.Text + S ; end; Menghitung nilai kebalikan cosinus dari nilai argumen X. Contoh : var S : string ; begin S := FloatToStr(ArcCos(0.5)) ; Edit1.Text := S ; {hasil 1.0471975511966} end; Menghitung nilai kebalikan sinus dari nilai argumen X. Contoh : var
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
2.3. ARCTAN(X)
2.4. COS(X)
2.5. SIN(X)
2.6. TAN(X)
3.
FUNGSI STATISTIK 3.1. MAXINTVALUE(X)
3.2. MAXVALUE(X)
3.3. MEAN(X)
S : string ; begin S := FloatToStr(ArcSin(0.5)) ; Edit1.Text := S ; {hasil 0.523598775598299} end; Menghitung nilai kebalikan tangen dari nilai argumen X. Contoh : var S : string ; begin S := FloatToStr(ArcTan(1)) ; Edit1.Text := S ; {hasil 0.785398163397448} end; Menghasilkan niai cosinus dari suatu sudut. var S : string ; begin S := FloatToStr(Cos(Pi)) ; Edit1.Text := S ; {hasil -1} end; Menghasilkan niai sinus dari suatu sudut. var S : string ; begin S := FloatToStr(Sin(90)) ; Edit1.Text := S ; {hasil 0.893996663600558} end; Menghasilkan niai tangen dari suatu sudut. var S : string ; begin S := FloatToStr(Tan(45*Pi/180)) ; Edit1.Text := S ; {hasil 1} end; Menghasilkan nilai tertinggi yang terdapat di dalam array dengan tipe data integer. Contoh : var S : string ; begin S := FloatToStr(MaxIntValue([10,20,40,30])); Edit1.Text := S ; {hasil 40} end; Menghasilkan nilai tertinggi yang terdapat di dalam array dengan tipe data integer, dan fungsi MaxValue akan menghasilkan data bertipe Double. Contoh : var S : string ; begin S := FloatToStr(MaxValue([10.5,20,40.25,30])); Edit1.Text := S ; {hasil 40.25} end; Menghasilkan nilai rata-rata dari semua nilai dalam suatu array Contoh : var S : string ; begin S := FloatToStr(Mean([10.5,20,40.25,30])); Edit1.Text := S ; {hasil 25.1875} end;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2 3.4. MININTVALUE(X)
3.5. NORM(X)
3.6. POPNSTDDEV(X)
3.7. POPNVARIANCE
3.8. STDDEV(X)
3.9. SUM(X)
3.10 VARIANCE(X)
Menghasilkan nilai terendah yang terdapat di dalam array dengan tipe data integer. Contoh : var S : string ; begin S := FloatToStr(MinIntValue([10,20,40,30])); Edit1.Text := S ; {hasil 10} end; Menghasilkan norma Euclidean ’L-2’. Contoh : var S : string ; begin S := FloatToStr(Norm([10,20,40,30])); Edit1.Text := S ; {hasil 54.7722557505166} end; Menghitung populasi standar deviasi (akar kuadrat varian populasi) dari semua nilai dalam parameter array data. Contoh : var S : string ; begin S := FloatToStr(POPNSTDDEV([10,20,40,30])); Edit1.Text := S ; {hasil 11.1803398874989} end; Menghitung varian populasi dari semua nilai dalam parameter array data. Contoh : var S : string ; begin S := FloatToStr(POPNVARIANCE([10,20,40,30])); Edit1.Text := S ; {hasil 125} end; Menghasilkan sampel standart deviasi (akar kuadrat dari varian sampel) dari semua nilai dalam parameter array data. Contoh : var S : string ; begin S := FloatToStr(StdDev([10,20,40,30])); Edit1.Text := S ; {hasil 12.9099444873581} end; Meghasilkan jummlah semua nilai-nilai dari parameter array data. Contoh : var S : string ; begin S := FloatToStr(Sum([10,20,40.25,30])); Edit1.Text := S ; {hasil 100.25} end; Menghitung varian sampel dari semua nilai dalam parameter array data, gunakan metode n-1 (tidak bias). Contoh : var S : string ; begin S := FloatToStr(Variance([10,20,40,30]));
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2 Edit1.Text := S ; end;
{hasil 166.6666667}
Harga x dalam fungsi sinus, cosinus dan arctangen dalam radian karena itu agar dapat memasukkan x dalam satuan derajat harus dilakukan konversi dari derajat ke radian yaitu x=
x 180 / π
Misalnya untuk penulisan sin (x) y = sin(
x ) 180 / π
Untuk perpangkatan ab diturunkan dengan cara berikut x = ab Ln (x) = b*Ln (a), maka
b*Ln ( a )
x=e
PENULISAN EKSPRESI ARITMATIKA PASCAL UNTUK DELPHI • • • •
Beberapa hal yang harus diperhatikan dalam penulisan ekspresi aritmatika adalah Penggunaan operasi aritmatika, memiliki urutan yang sama sebagaimana dalam aljabar yaitu pertama perpangkatan, kedua perkalian atau pembagian, dan ketiga penjumlahan atau pengurangan. Penggunaan kurung untuk menjamin urutan hitungan dengan benar Simbol perkalian harus dituliskan Untuk rumus yang kompleks maka dilakukan dengan pemecahan rumus menjadi beberapa rumus sederhana Beberapa contoh penulisan ekspresi aritmatika adalah EKSPRESI ARITMATIKA A−b ab 2b 2c + 3b2 7.
a −b c −d
a −b (c − d ).7 X2 X5 x
x
3 2
EKSPRESI PASCAL a − b a * b 2 * b 2 * c + 3 * Sqr(b) atau 2 * c + 3 * b * b (a − b)/(c − d) * 7 atau 7 * (a − b)/(c − d) atau 7/(c − d) * (a − b) (a − b)/(c − d) / 7 atau (a − b)/((c − d) * 7) atau 1/7/(c − d) * (a − b) Sqr(x) atau x * x Sqr(x) * Sqr(x) * x atau x * x * x * x * x Sqrt(x) x * Sqrt(x) atau Sqrt(x * x * x) atau Sqrt(x * Sqr( x))
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
2
( )
Sqrt((8*R*T)/(Pi*M))
E RT
E/(R * T) atau E/R/T atau E/T/R atau 1/(T * R) * E
1
8 RT 2 πM
e
Mgz RT
Exp ((M*g*z)/(R*T))
Sin( x ) Cos ( x )
Sin (x)/Cos (x)
Log(x)
Ln (x)/Ln (10) atau Ln (x)/2.303 Abs (x)
Abs(x)
Untuk rumus yang kompleks misalnya
V − nb V −V + an 2 1 2 W = nRTLn 2 V1 − nb V1V2 Penulisannya adalah W := n*R*T*Ln((V2-n*b)/(V1-n*b)) + a*Sqr(n)*((V1-V2)/(V1*V2)); Penulisan seperti ini memungkinkan banyak kesalahan, karena itu lebih baik jika ditulis secara bertahap sebagai berikut Rumus1 := (V2-n*b)/(V1-n*b); Rumus2 := Ln(Rumus1); Rumus3 := n*R*T*Rumus2; Rumus4 := (V1-V2)/(V1*V2); Rumus5 := a*Sqr(n)*Rumus4; W := Rumus3 + Rumus5; Cara lain Rumus1 := (V2-n*b)/(V1-n*b); Rumus2 := (V1-V2)/(V1*V2); W := n*R*T*Ln(Rumus1) + a*Sqr(n)*Rumus2; Contoh lain rumus untuk menghitung fraksi molekul pada range kecepatan tertentu per satuan luas interval
M Fv = 4π 2πRT
3 2
− Mc 2 c 2e 2 RT
Penulisan ekspresi Pascal untuk rumus di atas dengan cara langsung akan sulit dan lebih banyak kemungkinan salahnya, karena itu sebaiknya ditulis secara bertahap, sebagai contoh R1 R2 R3 R4 Fv
:= := := := :=
M/(2*Pi*R*T); Sqrt(R1*R1*R1); (-M*c*c)/(2*R*T); Exp(R3); 4*Pi*R2*Sqr(c)*R4;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
Cara lain R1 R1 R2 R2 Fv
:= := := := :=
M/(2*Pi*R*T); R1*Sqrt(R1); (-M*c*c)/(2*R*T); Exp(R2); 4*Pi*R1*Sqr(c)*R2;
Banyak cara lain untuk menulis rumus di atas, yang penting penulisan rumus dengan ekpresi Pascal tidak boleh menyalahi ekpresi matematikanya.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
APLIKASI SEDERHANA KIMIA KOMPUTASI MENGGUNAKAN DELPHI
6.1. RUMUS GAS IDEAL Menghitung harga tekanan berdasarkan hukum gas ideal jika jumlah mol, temperatur dan volume sistem diketahui. Rumus : p =
nRT V
R adalah konstanta gas dengan harga 0,082054 L.atm/mol.K. Design Form:
Tabel Properties Object Inspector: Objek Form Label1
Properti Caption Color Caption Font
Label2
Caption Font
Label3
Caption Font Caption Font
Label4
Nilai Properti Hitung Tekanan gas Ideal clMoneyGreen MENGHITUNG TEKANAN GAS IDEAL Color: clNavy, Name: Times New Roman, Size: 15, Style: fsBold (True) INPUT Color: clRed, Name: Tahoma, Size: 12, Style: fsBold Mol Style: fsBold (True) R Style: fsBold (True)
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
Label5 Label6 Label7
Caption Font Caption Font Caption Font
Label8
Caption Font
Edit1
Color Text Color Text Color Text Color Text Color
Edit2 Edit3 Edit4 Edit5
Temperatur Style: fsBold (True) Volume Style: fsBold (True) OUTPUT Color: clRed, Name: Tahoma, Size: 12, Style: fsBold RUMUS Color: clRed, Name: Tahoma, Size: 12, Style: fsBold clInactiveCaptionText (kosong) clInactiveCaptionText 0.082 clInactiveCaptionText (kosong) clInactiveCaptionText (kosong) clAqua
Listing Unit Program: unit hitP; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Label3: TLabel; Label4: TLabel; Edit2: TEdit; Label5: TLabel; Edit3: TEdit; Label6: TLabel; Edit4: TEdit; Label7: TLabel; Edit5: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Image1: TImage; Label8: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
{ Private declarations } public { Public declarations } end; var Form1: TForm1; n,R,T,V,p : real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin n := strtofloat(edit1.Text); R := strtofloat(edit2.Text); T := strtofloat(edit3.Text); V := strtofloat(edit4.Text); p := (n*R*T)/V; Edit5.Text:= floattostr(p); Edit1.SetFocus; end; procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; Edit5.Clear; Edit1.SetFocus; end; procedure TForm1.Button3Click(Sender: TObject); begin Application.Terminate; end; end. Keterangan : Layout form program ini sangat sederhana, tetapi memuat bagian input dan output. Bagian input berisi data yang harus diberikan untuk dapat menghitung harga tekanan dengan satuan sesuai permintaan program. Output program menampilkan data input yang diketahui dan harga tekanan hasil hitungan rumus menggunakan format penulisan numerik digit di belakang koma. Misal WriteLn('Jumlah mol
= ',n:10:4,' mol');
Akan tampil di monitor Jumlah mol = 12345.6789 mol 10 angka Angka terakhir terletak pada 10 angka setelah tanda (=) dengan 4 angka di belakang koma.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
6.2 MOLARITAS DAN NORMALITAS Menghitung harga molaritas dan normalitas larutan dengan rumus : Molaritas
BJ =
x PB x 1000 Mr
Normalitas
x 100
= Valensi x Molaritas
BJ adalah berat jenis zat, PB adalah persen berat zat dan Mr adalah massa molekul zat yang akan dihitung molaritas dan normalitas larutannya. Design Form
Tabel Properties Object Inspector: Objek Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Edit1 Edit2
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text
Nilai Properti MOLARITAS DAN NORMALITAS INPUT OUTPUT Densitas % Berat Massa Molekul Valensi Molaritas Normalitas RUMUS (kosong) (kosong)
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
Edit3 Edit4 Edit5 Edit6 Button1 Button2 Button3 Image1
Text Text Text Text Caption Caption Caption Picture Strecht
(kosong) (kosong) (kosong) (kosong) HITUNG ULANG KELUAR Load : molaritas.jpg false
Listing Unit Program unit molnor; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Edit6: TEdit; Label9: TLabel; Label10: TLabel; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; BJ,Pb,Mr,M,N : real;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
val
: byte;
implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin BJ := strtofloat(Edit1.Text); PB := strtofloat(Edit2.Text); Mr := strtofloat(Edit3.Text); val := strtoint(Edit4.Text); M := (BJ*1000*PB)/(Mr*100); N := val*M; Edit5.Text := floattostr(M); Edit6.Text := floattostr(N); end; procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text := ' '; edit2.Text := ' '; edit3.Text := ' '; edit4.Text := ' '; edit5.Text := ' '; edit6.Text := ' '; edit1.SetFocus; end; end.
Hasil Running
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
Keterangan : Program ini memuat dua rumus untuk menghitung molaritas dan normalitas. Layout program sama dengan praktikum_1. Perhatikan penulisan rumus bagian atas dan bagian bawah. Untuk lebih mantapnya maka bagian atas dan bagian bawah masing-masing diberi kurung.
6.3 ROOT MEAN SQUARE Untuk menghitung 3 rumus sekaligus dengan input yang diminta. Rumusnya adalah
Crms Cmp Cavg R T M
C rms =
3 RT M
C mp =
2 RT M
C avg =
8 RT πM
= root-mean-square speed (akar rata-rata kuadrat kecepatan) = most probable speed (kecepatan paling boleh jadi) = average speed (kecepaatan rata-rata) = konstanta gas = temperatur dalam Kelvin = massa molekul
Design program
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
Tabel Properties Object Inspector: Objek Label1 Label2 Label3 Label4 Label6 Label7 Label8 Label9 Label10 Edit1 Edit2 Edit4 Edit5 Edit6 Button1 Button2 Button3 Image1
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text Text Text Text Caption Caption Caption Picture Strecht Listing Unit Editor
Nilai Properti ROOT MEAN SQUARE INPUT OUTPUT Temperatur Massa Molekul Crms Cmp Cavg RUMUS (kosong) (kosong) (kosong) (kosong) (kosong) HITUNG ULANG KELUAR Load : rootmeansquare.jpg false
unit rootmeansquare;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
3
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Edit1: TEdit; Edit2: TEdit; Edit4: TEdit; Edit5: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Edit6: TEdit; Label9: TLabel; Label10: TLabel; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const R = 8.314E+7; var Form1: TForm1; Crms,Cmp,Cavg,T,Mr : real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin T := strtofloat(Edit1.Text); Mr := strtofloat(Edit2.Text); Crms := sqrt((3*R*T)/Mr);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
Cmp := sqrt((2*R*T)/Mr); Cavg := sqrt((8*R*T)/(pi*Mr)); Edit4.Text := floattostr(Crms); Edit5.Text := floattostr(Cmp); Edit6.Text := floattostr(Cavg); end; procedure TForm1.Button3Click(Sender: TObject); begin close; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text := ' '; edit2.Text := ' '; edit4.Text := ' '; edit5.Text := ' '; edit6.Text := ' '; edit1.SetFocus; end; end. Hasil Running
Keterangan : Program ini memuat tiga rumus sekaligus dengan satu input. Layout program sama dengan praktikum_1. Perhatikan satuan yang diminta input sehingga harga R harus mengikuti satuan yang diminta. Dalam Pascal untuk memasukkan harga π cukup dengan menuliskan pi sehingga tidak perlu dimasukkan sebagai konstanta. Perhatikan penulisan harga konstanta dengan bentuk eksponensial : R = 8.314E+7; Penulisan akar kuadrat menggunakan prosedur sqrt( ).
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
6.4 FUNGSI ENERGI BEBAS Fungsi energi bebas Fo berhubungan dengan fungsi partisi q dengan rumus Fo = −R Ln (q/No). R adalah konstanta gas dan No adalah bilangan Avogadro dan q dihasilkan dari perkalian qt, qr, Qv (fungsi partisi translasi, rotasi dan vibrasi) suatu molekul. Tulislah program untuk menghitung harga Fo air menggunakan data dan rumus berikut qt = (0,02562) x (M)3/2 (T)5/2 qr = ½ x (1042,95)3/2 x 1/(A x B x C)1/2 Qv = qv1 qv2 qv3 dimanaqv1 = 1/(1−exp(−hcw1/kT)); qv2 = 1/(1−exp(hcw2/kT)); qv3 = 1/(1−exp(−hcw3/kT)); diketahui M = 18,015;
T = 1500;
A = 27,8778; B = 14,5092; C = 9,2869;
w1 = 3656,7; w2 = 1594,8 w3 = 3755,8 c = kecepatan cahaya h = tetapan Planck
k = tetapan Boltzmann
Design Form
Tabel Properties Object Inspector: Objek StaticText1 GroupBox1 GroupBox2 Label1 Label2 Label3
Properti Caption Caption Caption Caption Caption Caption
Nilai Properti FUNGSI ENERGI BEBAS INPUT OUTPUT Temperatur (T) Molaritas (M) q
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
Label4 Label5 Label6 Label7 Label8 Label9 Label10 Button1 Butoon2 Button3 Edit1 Edit2 Edit3 Edit4 Edit5 Edit6 Edit7 Edit8 Edit9 Edit10
Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text Text Text Text Text Text Text Text Text
qr qt Qv qv3 qv2 qv1 F HITUNG ULANG KELUAR (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong)
Listing Unit Editor unit energibebas; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) StaticText1: TStaticText; GroupBox1: TGroupBox; GroupBox2: TGroupBox; Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Const
A = 27.8778; B = 14.5092; C = 9.2869; w1= 3656.7; w2= 1594.8; w3= 3755.8; k = 1.38e-23; h = 6.626e-34; No= 6.022e23; cc= 2.99e8; R = 8.314;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
var Form1: TForm1; M,T,F,q,qt,qr,Qv,qv1,qv2,qv3 : real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin M:= StrtoFloat(edit1.Text); T:= StrtoFloat(edit1.Text); qv1 := 1/(1-exp(-(h*cc*w1)/(k*T))); qv2 := 1/(1-exp( (h*cc*w2)/(k*T))); qv3 := 1/(1-exp(-(h*cc*w3)/(k*T))); Qv := qv1*qv2*qv3; qt := 0.02562*sqrt(M*M*M)*sqrt(T*T*T*T*T); qr := 0.5*sqrt(1042.95*1042.95*1042.95)*(1/(sqrt(A*B*C))); q := qt+qr+Qv; F := -R*ln(q/No); edit9.Text:=FloatToStr(qv1); edit8.Text:=FloatToStr(qv2); edit7.Text:=FloatToStr(qv3); edit6.Text:=FloatToStr(Qv); edit5.Text:=FloatToStr(qt); edit4.Text:=FloatToStr(qr); edit3.Text:=FloatToStr(q); edit10.Text:=FloatToStr(F); end; procedure TForm1.Button3Click(Sender: TObject); begin application.Terminate; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text:= ' ' ; edit2.Text:= ' ' ;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
edit3.Text:= ' ' ; edit4.Text:= ' ' ; edit5.Text:= ' ' ; edit6.Text:= ' ' ; edit7.Text:= ' ' ; edit8.Text:= ' ' ; edit9.Text:= ' ' ; edit10.Text:= ' ' ; end; end. Hasil Running
Keterangan : Program dibagi dalam 3 prosedur : data, rumus dan hasil. Masing-masing dibuat dulu, lalu disusun urutannya dalam program utama. Dengan memanggil nama prosedurnya saja maka komputer akan menjalankan program sesuai urutan dalam program utama. Perhatikan pula cara penulisan konstanta di bagian deklarasi.
6.5 DISTRIBUSI PROBABILITAS Menghitung fraksi molekul dalam range kecepatan c sampai c + dc per satuan luas interval dengan rumus 3 2
1 dnc M = 4π N dc 2πRT
Mc 2 − 2 RT c 2e
dimana M adalah massa molar molekul, R adalah konstanta gas, c adalah kecepatan cahaya, T adalah temperatur.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
Design Form
Tabel Properties Object Inspector: Objek StaticText1 StaticText2 StaticText3 StaticText4 Label1 Label2 Label3 Button1 Button2 Button3 Image1 Bevel1 Bevel2 Bevel3 Bevel4 Bevel5 Bevel6
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Picture Shape Style Shape Style Shape Style Shape Style Shape Style Shape Style
Nilai Properti DISTRIBUSI PROBABILITAS INPUT OUTPUT RUMUS Temperatur (T) Massa molekuler (M) Distribusi Probabilitas (Dprob) HITUNG ULANG KELUAR Load : Dprob.jpg bsFrame bsRaised bsFrame bsRaised bsTopLine bsLowered bsTopLine bsLowered bsLeftLine bsRaised bsFrame bsRaised
Listing Unit Editor unit distprob;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, jpeg; type TForm1 = class(TForm) Label1: TLabel; StaticText1: TStaticText; StaticText2: TStaticText; StaticText3: TStaticText; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; StaticText4: TStaticText; Bevel1: TBevel; Bevel2: TBevel; Bevel3: TBevel; Bevel4: TBevel; Bevel5: TBevel; Image1: TImage; Bevel6: TBevel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Const c = 2.99792458E+8; R = 8.31441; var Form1: TForm1; M,T : real; rumus1,rumus2,rumus3,rumus4,Dprob : real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
M:= StrtoFloat(edit1.Text); T:= StrtoFloat(edit2.Text); rumus1 := M/(2*pi*R*T); rumus2 := sqr(rumus1)*rumus1; rumus3 := sqrt(rumus2); rumus4 := (M*sqr(c))/(2*R*T); Dprob := 4*pi*rumus3*sqr(c)*exp(-rumus4); edit3.Text := floattostr(Dprob); end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text := ' ' ; edit2.Text := ' ' ; edit3.Text := ' ' ; end; procedure TForm1.Button3Click(Sender: TObject); begin close; end; end.
Hasil Running
Keterangan : Karena kemungkinan harga fraksi molekul yang dihitung memiliki range di luar range real maka dalam program ini digunakan tipe data double yang memiliki range 5.0e-324...1.7e308 dengan digit 15-16 dan ukuran byte 8, dapat juga menggunakan tipe data
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
4
extended yang memiliki range 3.4e-4932...1.1e4932 dengan digit 19-20 dan ukuran byte 10. Untuk dapat menggunakan tipe data itu maka di atas program harus diletakkan pengarah kompiler {$N+} sebagai kode pemakaian 80x87 Floating Point. Penulisan rumus dalam Procedure rumus; juga dibuat bagian-bagian untuk menghindari kesalahan. Prinsipnya adalah untuk memudahkan penulisan rumus dengan betul.
6.6 JUMLAH BILANGAN Menjumlah bilangan berurutan dari 1 sampai angka tertentu dengan rumus n
Jumlah = ∑ i i =1
Design Form Program Praktikum_6; Uses CRT; Var sumi,n,i : word; Begin ClrScr; Write('Bilangan maksimal = '); readln(n); sumi := 0; for i := 1 to n do Begin sumi := sumi + i; WriteLn('i ',i,' = ',sumi:3); End; End. Keterangan : Program ini menggunakan looping (pengulangan) for .. to .. do untuk menjumlahkan bilangan berurutan dari 1 sampai n. Penjumlahan tertulis pada persamaan sumi := sumi + i; urutan angka yang dijumlah diatur oleh looping for i := 1 to n do.
6.7 KOEFISIEN AKTIVITAS Menghitung kekuatan ionik dengan rumus I = (1 / 2)∑ ci z i 2 dimana I adalah kekuatan ionik, ci adalah konsentrasi ion ke-i, dan zi adalah muatan ion ke-i. Kemudian rumus ini digunakan untuk menghitung koefisien aktivitas menggunakan teori Debye-Huckel dengan rumus log γ ± = −0,509 z1 z 2 ( I )1 / 2 ln γ ± = −2,303 * 0,509 z1 z 2 ( I )1 / 2
γ ± = e ln γ ±
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
dimana γ± adalah koefisien aktivitas ionik rata-rata. Program Praktikum_7; Uses crt; Var i,n,z,sumz : integer; c,absz,sumi,f1,f2,ion,koef : real; Procedure input; Begin ClrScr; Write('Banyaknya ion = '); ReadLn(n); end; Procedure zkali; Begin sumz := 1; for i := 1 to n do begin write('Muatan ion ',i,' = '); readln(z); sumz := sumz*z; end; absz := abs(sumz); end; Procedure ionic_strength; Begin sumi := 0; for i := 1 to n do Begin Write('Konsentrasi ion ',i,' = '); ReadLn(c); Write('Muatan ion ',i,' = '); ReadLn(z); WriteLn; sumi := sumi+c*z*z; end; ion := sumi/2; end; Procedure koef_aktivitas; Begin f1 := -0.509*absz*sqrt(ion); f2 := f1*2.303; koef := exp(f2); writeln; writeln('Kekuatan ionik = ',ion:10:6); writeln('Koefisien aktivitas = ',koef:10:6); end; {Program utama} Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
ClrScr; input; zkali; WriteLn; ionic_strength; koef_aktivitas; ReadLn; End. Keterangan : Procedure zkali; menghitung perkalian muatan ion ke-i dan harga absolutnya yaitu z1z2. Looping perkalian ditulis dengan persamaan sumz := sumz*z; Procedure ionic_strength; menghitung harga ∑ cizi2 pada looping sumi := sumi+c*z*z; dan menghitung harga kekuatan ionik pada rumus ion := sumi/2; Procedure koef_aktivitas; menghitung harga koefisien aktivitas pada rumus f1 := -0.509*absz*sqrt(ion); f2 := f1*2.303; koef := exp(f2); dimana f1 = log γ± dan f2 = ln γ±, koef adalah koefisien aktivitas. Harga koefisien aktivitas dapat juga dihitung menggunakan rumus koef = 10f1. 6.8 ENERGI ROTASI DAN FUNGSI PARTISI Menghitung energi rotasi molekul diatomik dengan rumus erot ( J ) = J .( J +1).
h2 8π 2 I
J adalah bilangan kuantum rotasi (J = 0, 1, 2, 3, ….) I adalah momen inersia, I = µ r2 untuk molekul diatomik h adalah konstanta Planck degenerasi keadaan energi J adalah 2J + 1. Rumus fungsi partisi rotasi adalah ∞
q rot = ∑( 2 J +1).e
−
J ( J +1) h 2 8π 2 I .kT
J =0
k adalah konstanta Boltzmann r adalah jarak diantara atom-atom m1.m2 m1 + m2
µ adalah massa tereduksi,
mi adalah massa atom i (berat atom / konstanta Avogadro)
{$N+}
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
Program Praktikum_8; Uses CRT; Const maksimal = 100; planck = 6.626076e-34; {Joule-detik} Boltzmann = 1.38066e-23; {Joule/Kelvin} Avogadro = 6.02214e+23; {1/mol} Type urut = array[0..maksimal] of double; Var J,Jmax : integer; h2,ri,ri2,m1km2,m1tm2,faktor,Inersia,RIkatan,pi2,rumus1,masa1,masa2 : double; a,k,T : real; Expon1,Expon2,FPar,Energi : urut; Procedure input; Begin Write('Masa atom 1 dalam gram/mol = '); ReadLn(m1); Write('Masa atom 2 dalam gram/mol = '); ReadLn(m2); Write('Panjang ikatan dalam Angstrom = '); ReadLn(R); Write('Temperatur dalam Kelvin = '); ReadLn(T); Write('Maximal J = '); ReadLn(Jmax); end; Procedure rumus; Begin k := Boltzmann; a := avogadro; h2 := sqr(planck); ri := R * 1e-10; ri2 := sqr(ri); m1km2 := m1 * m2; m1tm2 := m1 + m2; faktor := 1 / (a * 1000); Inersia := (m1km2/m1tm2) * faktor * ri2; pi2 := sqr(pi); rumus1 := h2 / (8 * pi2 * Inersia); j := 0; Fpar[j] := 0; Repeat Energi[J] := rumus1 * J * (J + 1); Expon1[j] := exp(-energi[j]/(k*T)); Expon2[j] := ((2*j)+1)*Expon1[j]; Fpar[j] := Fpar[j] + Expon2[j]; j := j + 1; Until j > Jmax; end; Procedure output; Begin for J := 0 To Jmax do
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
Begin WriteLn('Energi ',J,' = ',Energi[J], 'F partisi ',j,' = ',Fpar[j]); end; end; {program utama} Begin ClrScr; input; rumus; WriteLn; output; ReadLn; End. Keterangan : Dalam program ini diberikan tipe data baru untuk mengurutkan atau menderetkan data yaitu menggunakan Type urut = array[0..maksimal] of double; Variabel yang menggunakan tipe data array ditulis dengan kotak […] seperti contoh berikut Energi[J] := rumus1 * J * (J + 1); Expon1[j] := exp(-energi[j]/(k*T)); Looping untuk menghitung fungsi partisi rotasi adalah j := 0; Fpar[j] := 0; Repeat Energi[J] := rumus1 * J * (J + 1); Expon1[j] := exp(-energi[j]/(k*T)); Expon2[j] := ((2*j)+1)*Expon1[j]; Fpar[j] := Fpar[j] + Expon2[j]; j := j + 1; Until j > Jmax; Looping Repeat……Until menghitung energi rotasi dari bilangan kuantum J = 0 sampai batas looping yaitu Until J > Jmax; Batas looping ini menunjukkan jika J > Jmax maka tidak lagi menghitung besarnya energi rotasi, maksimal J adalah Jmax. Batas looping dapat juga diungkapkan dengan cara lain misalnya Until J := Jmax + 1; Maksudnya looping akan berhenti jika ditemui harga J = Jmax + 1. Penambahan harga J menggunakan rumus J := J + 1; atau dapat juga menggunakan inc(J,1);
6.9 ENERGI AKTIVASI Menghitung energi aktivasi berdasarkan data beberapa temperatur dan konstanta laju reaksi menggunakan rumus
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
k = A.e
−
E RT
k adalah konstanta laju raksi, A adalah faktor Arrhenius, E adalah energi aktivasi dan T adalah temperatur. Persamaan Arrhenius dapat diubah dalam bentuk logaritma sebagai berikut ln k = ln A −
E RT
atau log k = log A −
E 2,303RT
Energi aktivasi reaksi dapat ditentukan jika konstanta laju reaksi diukur pada berbagai temperatur berbeda. Plotting log k terhadap 1/T akan menghasilkan slope sebesar −E / 2,303R, sehingga harga E = −2,303 x slope. Program Praktikum_9; Uses CRT; Const R = 8.314; Var T,K,LK,A,sT : array[1..50] of real; Ea,slope,sumA,rA : real; jd,i : byte; Procedure Input; Begin Write('Jumlah data = '); ReadLn(jd); WriteLn; for i := 1 to jd do begin Write('Temperatur ',i:2,' = '); ReadLn(T[i]); Write('Konstanta ',i:2,' = '); ReadLn(K[i]); WriteLn; end; end; Procedure Hitung_Ea; Begin WriteLn; WriteLn('T':3,'1/T':13,'Ln K':22); for i := 1 to jd do begin LK[i] := ln(K[i]); sT[i] := 1/T[i]; WriteLn(T[i]:6:3,sT[i]:13:6,LK[i]:20:4); end; slope := (LK[jd]-LK[1])/(sT[1]-sT[jd]); slope := abs(slope); Ea := slope*R; end;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
Procedure Hitung_A; Begin sumA := 0; for i := 1 to jd do begin A[i] := K[i]/exp(-Ea/(R*T[i])); sumA := sumA + A[i]; end; rA := sumA/jd; end; Procedure Hasil; Begin WriteLn; WriteLn('Slope = ',slope:6:3,' WriteLn; WriteLn('Fak Frek = ',rA:15); end;
Energi Aktivasi = ':15,Ea:10:3);
{Program Utama} Begin Repeat ClrScr; Input; Hitung_Ea; Hitung_A; Hasil; Until ReadKey = #27; End. Keterangan : Harga slope dalam program ini dicari dari selisih data pertama dengan data terakhir. Mungkin kurang tepat tetapi sebagai contoh hitungan dapat dipakai untuk perkiraan harga. Dapat juga dicoba menggunakan cara rata-rata seperti yang diterapkan untuk menghitung harga faktor Arrhenius. Looping for … to … do dapat dipakai untuk menghitung harga 1/T dan ln k, dan harga faktor Arrhenius. Dalam program ini dikenalkan cara pengulangan program menggunakan looping Repeat … Until. Pengu-langan akan dilakukan jika tombol yang ditekan (ReadKey) adalah selain tombol <Esc>. Jadi jika ditekan tombol <Esc> dengan kode ASCII # 27 maka program akan selesai.
6.10 KELARUTAN Satu liter larutan yang mengandung 0,001 mol NaCl dicampur dengan 1 liter larutan yang mengandung 0,001 mol AgNO3. Bila Ksp AgCl = 1,8 x 10−10 apakah terjadi endapan ? Program Praktikum_10;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
Uses CRT; Const KspAgCl = 1.8e-10; Var a,b,c,d,e,f,g,h : real; kd,opsi : char; simpulan : string[20]; Label 01; Begin 01 : ClrScr; WriteLn('Larutan a liter yang mengandung b mol NaCl dicampur dengan '); WriteLn('c liter larutan yang mengandung d mol AgNO3.'); WriteLn('Apakah terjadi Endapan ?'); WriteLn; WriteLn('Ksp AgCl = ',KspAgCl:10); Write('Diketahui a = '); ReadLn(a); Write(' b = '); ReadLn(b); Write(' c = '); ReadLn(c); Write(' d = '); ReadLn(d); WriteLn('--------------------------------------'); WriteLn; WriteLn('Jawaban :'); WriteLn(a:6:4,' liter larutan mengandung ',b:8:6,' mol Cl-'); delay(1000); WriteLn(c:6:4,' liter larutan mengandung ',d:8:6,' mol Ag+'); delay(1000); e := a + c; WriteLn('Volume campuran = ',e:6:4,' liter'); WriteLn; f := b/e; g := d/e; WriteLn('[Cl-] = ',b:8:6,' / ',e:6:4,' mol/liter = ',f:8:6,' mol/liter'); delay(1000); WriteLn('[Ag+] = ',d:8:6,' / ',e:6:4,' mol/liter = ',g:8:6,' mol/liter'); delay(1000); WriteLn; h := f*g; WriteLn('[Ag+][Cl-] = ',f:8:6,' x ',g:8:6,' = ',h:10); delay(2000); WriteLn; if h < KspAgCl then Begin kd := '<'; simpulan := 'tidak mengEndap'; End else Begin kd := '>'; simpulan := 'mengEndap'; End; WriteLn('Karena [Ag+][Cl-] ',kd,' Ksp AgCl maka AgCl ',simpulan); WriteLn('<Esc> Keluar <Enter> Ulang'); opsi := ReadKey; if opsi = #13 then GoTo 01 else halt;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
ClrScr; End. Keterangan : Dalam program ini dikenalkan teknik menampilkan soal dan jawaban secara bertahap. Untuk mengatur waktu munculnya jawaban digunakan prosedur delay(x) dimana x adalah variabel waktu yang bernilai 1/1000 detik. Jadi jika akan menahan tampilan selama 2 detik maka x diberi harga 2000. Untuk memilih jawaban mengendap atau tidak mengendap digunakan seleksi dengan statemen if … then … else …. Variabel kd bertipe char yaitu tipe data yang berisi 1 karakter baik berupa angka atau huruf atau simbol, sedangkan variabel simpulan bertipe string. Untuk penghematan memori maka panjangnya string dapat dibatasi, misal sebanyal 20 karakter dengan penulisan string[20]. Teknik pengulangan program dilakukan dengan prosedur label yang dideklarasikan dengan harga tertentu misalnya 01. Jika ditekan tombol <enter> dengan kode ASCII #13 maka program akan mengulang mulai dari nomor label ditempatkan yaitu mulai dari letak harga label 01 pada badan program. Jika yang ditekan bukan tombol <enter> maka program akan berhenti. Prosedur halt digunakan untuk keluar dari program. 6.11 RUMUS EMPIRIS MOLEKUL Persen massa C, H dan O dalam vitamin C ditentukan secara eksperimen dengan membakar 2,00 mg cuplikan. Massa CO2 dan H2O yang terbentuk berturut-turut 3,00 mg dan 0,816 mg. Tentukan persen massa C, H dan O, rumus empiris vitamin C, dan rumus molekulnya jika massa molekul relatifnya 180. Program Praktikum_11; Uses CRT; Const ArC = 12; ArH = 1.01; ArO = 16; MrCO2 = 44; MrH2O = 18; pres = 0.1; Var mCup,mCO2,mH2O,mC,mH,mO,pC,pH,pO,molC,molH,molO : real; pmolC,pmolH,pmolO,pmolCi,pmolHi,pmolOi, dpmolC,dpmolH,dpmolO : real; koefCm,koefHm,koefOm,koefCe,koefHe,koefOe,i : byte; rpmolC,rpmolH,rpmolO : byte; Mr,pembagi,faktor,MasRumEm : real; Y,lagi : char; Begin Repeat ClrScr; Write('Berat cuplikan dalam mg = '); ReadLn(mCup); Write('Berat CO2 yang terbentuk dalam mg = '); ReadLn(mCO2); Write('Berat H2O yang terbentuk dalam mg = '); ReadLn(mH2O); Write('Massa Molekul Relatif = '); ReadLn(Mr); {rumus } mC := ((1*ArC)/MrCO2)*mCO2; mH := ((2*ArH)/MrH2O)*mH2O; pC := (mC/mCup)*100; pH := (mH/mCup)*100;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
pO := 100 - pC - pH; molC := pC/ArC; molH := pH/ArH; molO := pO/ArO; if (molC < molH) and (molC < molO) then pembagi := molC; if (molH < molC) and (molH < molO) then pembagi := molH; if (molO < molC) and (molO < molH) then pembagi := molO; pmolC pmolH pmolO
:= molC/pembagi; := molH/pembagi; := molO/pembagi;
i := 1; Repeat i := i + 1; pmolCi := pmolC*i; pmolHi := pmolH*i; pmolOi := pmolO*i; rpmolC := round(pmolCi); rpmolH := round(pmolHi); rpmolO := round(pmolOi); dpmolC := abs(pmolCi - rpmolC); dpmolH := abs(pmolHi - rpmolH); dpmolO := abs(pmolOi - rpmolO); Until (dpmolC <= pres) and (dpmolH <= pres) and (dpmolO <= pres); koefCe := round(pmolCi); koefHe := round(pmolHi); koefOe := round(pmolOi); MasRumEm := (koefCe*ArC)+(koefHe*ArH)+(koefOe*ArO); faktor := Mr/MasRumEm; koefCm := round(faktor*koefCe); koefHm := round(faktor*koefHe); koefOm := round(faktor*koefOe); {Output} ClrScr; WriteLn('Berat cuplikan = ',mcup:6:3,' mg'); WriteLn('Berat CO2 yang terbentuk = ',mCO2:6:3,' mg'); WriteLn('Berat H2O yang terbentuk = ',mH2O:6:3,' mg'); WriteLn('Massa Molekul Relatif = ',Mr:6:3); WriteLn; WriteLn('Massa C = ',mC:6:3,' mg'); WriteLn('Massa H = ',mH:6:3,' mg'); WriteLn; WriteLn('Persen massa C = ',pC:6:2,' %');
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
5
WriteLn('Persen Massa H = ',pH:6:2,' %'); WriteLn('Persen Massa O = ',pO:6:2,' %'); WriteLn; WriteLn('Rumus Empiris = C',pmolC:2:2,' H',pmolH:2:2,' O',pmolO:2:2); WriteLn(' = C',koefCe,' H',koefHe,' O',koefOe); WriteLn; WriteLn('Rumus Molekul = C',koefCm,' H',koefHm,' O',koefOm); WriteLn; Write(‘Lagi (y/t) ? ); ReadLn(lagi); Until UpCase(lagi) <> ‘Y’; End. Keterangan : Mula-mula menghitung massa C dan H (mC, dan mH), lalu menghitung persen C, H dan O (pC, pH, dan pO). Mol C, H dan O (molC, molH, dan molO) dihitung dari pembagian persen C, H dan O dengan massa atom masing-masing. Menentukan perbandingan mol (pmolC,pmolH, dan pmolO) dengan mencari dulu jumlah mol yang paling kecil sebagai pembaginya dengan menggunakan statemen if … then … sebagai berikut if (molC < molH) and (molC < molO) then pembagi := molC; if (molH < molC) and (molH < molO) then pembagi := molH; if (molO < molC) and (molO < molH) then pembagi := molO; Koefisien rumus empiris ditentukan dengan menggunakan looping Repeat … Until sebagai berikut i := 1; Repeat i := i + 1; pmolCi := pmolC*i; pmolHi := pmolH*i; pmolOi := pmolO*i; rpmolC := round(pmolCi); rpmolH := round(pmolHi); rpmolO := round(pmolOi); dpmolC := abs(pmolCi - rpmolC); dpmolH := abs(pmolHi - rpmolH); dpmolO := abs(pmolOi - rpmolO); Until (dpmolC <= pres) and (dpmolH <= pres) and (dpmolO <= pres); koefCe := round(pmolCi); koefHe := round(pmolHi); koefOe := round(pmolOi); Selanjutnya menentukan koefisien rumus molekul dengan terlebih dulu menghitung massa rumus empiris dan faktor pengalinya. MasRumEm := (koefCe*ArC)+(koefHe*ArH)+(koefOe*ArO); faktor := Mr/MasRumEm; koefCm := round(faktor*koefCe);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
koefHm := round(faktor*koefHe); koefOm := round(faktor*koefOe); Dalam program ini juga dikenalkan cara mengulang program menggunakan prosedur UpCase(lagi), Prosedur ini untuk mengubah karakter kecil menjadi besar. Jika ditekan ‘y’ (huruf kecil) maka UpCase akan mengubahnya menjadi huruf besar ‘Y’ sehingga sesuai dengan persyaratan berakhirnya program. Jika ditekan selain ‘y’ atau ‘Y’ misalnya ‘t' atau ‘T' maka program akan berulang. 6.12 ENERGI PENGIKAT INTI Pada reaksi pembentukan inti Helium dari partikel proton dan netron. Reaksi pembentukan inti Helium sebagai berikut 211H +2 01n→24 He + E
Diketahui massa proton sebesar 1,008142 sma, massa netron sebesar 1,008982 sma dan massa inti Helium sebesar 4,002776 sma. Hitunglah energi ikatan per atom He dalam satuan erg , Joule dan MeV ! Program Praktikum_12; Uses CRT; Const mprot = 1.008142; {sma} mnet = 1.008982; {sma} ccah = 2.99e10; {cm/det} fgram = 1.66e-24; {faktor pengubah dari sma ke gram} fJoule= 1e-7; {faktor pengubah dari erg ke Joule} Mev = 1.603e-6; {erg} Var E,Ej,Ev,m,jmt1,jmt2,jmp,jmn,dm,dmg : real; jp,jn : byte; opsi : char; Label 01; Begin 01: ClrScr; GoToXY(10,3); Write('Sebelum pembentukan ikatan : '); GoToXY(10,4); Write('Jumlah proton penyusun = '); Readln(jp); GoToXY(10,5); Write('Jumlah netron penyusun = '); Readln(jn); GoToXY(10,7); Write('Setelah pembentukan ikatan : '); GoToXY(10,8); Write('Massa inti setelah pembentukan ikatan = '); Readln(jmt2); jmp := jp*mprot; {jumlah massa proton} jmn := jn*mnet; {jumlah massa netron} jmt1 := jmp+jmn; {jumlah massa partikel sebelum pembentukan} dm := jmt1-jmt2; {selisih massa dalam sma} dmg := dm*fgram; {selisih massa dalam gram} E := dmg*sqr(ccah); {Energi ikat per atom dalam erg} Ej := E*fJoule; {Energi ikat per atom dalam Joule} Ev := E/Mev; {Energi ikat per atom dalam Mev}
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
ClrScr; GoToXY(10,2); Write('Penghitungan energi ikatan : '); GoToXY(10,4); Write('Jumlah massa proton penyusun = ',jmp:10:6, ' sma'); GoToXY(10,5); Write('Jumlah massa netron penyusun = ',jmn:10:6, ' sma'); GoToXY(10,6); Write('-------------------------------------------- + '); GoToXY(10,7); Write('Jumlah massa partikel penyusun = ',jmt1:10:6,' sma'); GoToXY(10,8); Write('Massa inti setelah berikatan = ',jmt2:10:6,' sma'); GoToXY(10,9); Write('-------------------------------------------- - '); GoToXY(10,10); Write('Selisih massa = ',dm:10:6, ' sma'); GoToXY(10,11); Write(' = ',dm:10:6,' * ',fgram:10,' gram'); GoToXY(10,12); Write(' = ',(dm*fgram):10,' gram'); GoToXY(10,14); Write('Energi ikatan per atom = ',E:15,' erg'); GoToXY(10,15); Write(' = ',Ej:15,' Joule'); GoToXY(10,16); Write(' = ',Ev:15,' Mev'); GoToXY(10,22); Write('Ulangi ? Tekan (Y/T) '); opsi := ReadKey; Case opsi of 't','T' : halt; 'y','Y' : goto 01; end; End. Keterangan : Program ini mengenalkan penempatan string pada koordinat XY mode teks dengan posisi maksimal layar (80,25) menggunakan prosedur GoToXY(X,Y). Pengulangan program menggunakan seleksi Case … of dan Label. Jika penekanan tombol (opsi := ReadKey) adalah ‘t' atau ‘T' maka program akan keluar (halt) dan jika penekanan tombol adalah ‘y’ atau ‘Y’ maka program akan mengulang mulai posisi Label 01 pada badan program.
6.13 TEBAKAN LAMBANG DAN NOMOR ATOM Permainan tebakan lambang dan nomor atom dapat dibuat dengan menggunakan tipe data string berupa deret (array). Semua nomor, lambang, nama, dan berat atom dapat disimpan sebagai data konstanta pada deklarasi. Program Praktikum_13; Uses CRT; Const nomer : array[1..112] of string[3] = ('1','2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14','15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28','29','30', '31','32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45','46','47', '48','49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62','63','64', '65','66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79','80','81', '82','83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96','97','98', '99','100','101','102','103','104','105','106','107','108','109','110','111','112'); Lambang : array[1..112] of string[3] = ('H','He','Li','Be','B', 'C', 'N', 'O', 'F', 'Ne','Na',
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
'Mg','Al','Si','P', 'S', 'Cl','Ar','K', 'Ca','Sc','Ti','V', 'Cr','Mn','Fe', 'Co', 'Ni', 'Cu','Zn','Ga','Ge','As','Se','Br','Kr','Rb','Sr','Y', 'Zr','Nb','Mo','Tc', 'Ru', 'Rh','Pd','Ag','Cd','In','Sn','Sb','Te','I', 'Xe','Cs','Ba','La','Ce','Pr', 'Nd', 'Pm', 'Sm','Eu','Gd','Tb','Dy','Ho','Er','Tm','Yb','Lu','Hf','Ta','W', 'Re','Os', 'Ir', 'Pt', 'Au','Hg','Tl','Pb','Bi','Po','At','Rn','Fr','Ra','Ac','Th','Pa','U', 'Np', 'Pu', 'Am', 'Cm','Bk','Cf','Es','Fm','Md','No','Lr','Rf','Ha','Sg','Ns','Hs','Mt','Uun','Uuu','Uub'); Nama : array[1..112] of string[20] = ('Hydrogen','Helium','Lithium','Beryllium','Boron', 'Carbon','Nitrogen','Oxygen','Fluorine','Neon','Sodium','Magnesium','Aluminium', 'Silicon','Phosphorus','Sulfur','Chlorine','Argon','Potassium','Calcium','Scandium', 'Titanium','Vanadium','Chromium','Manganese','Iron','Cobalt','Nickel','Copper','Zinc', 'Gallium','Germanium','Arsenic','Selenium','Bromine','Krypton','Rubidium','Strontium', 'Yttrium','Zirconium','Niobium','Molybdenum','Technetium','Ruthenium','Rhodium', 'Palladium','Silver','Cadmium','Indium','Tin','Antimony','Tellurium','Iodine','Xenon', 'Cesium','Barium','Lanthanum','Cerium','Praseodymium','Neodymium','Promethium','Samariu m', 'Europium','Gadolinium','Terbium','Dysprosium','Holmium','Erbium','Thulium','Ytterbium', 'Lutetium','Hafnium','Tantalum','Tungsten','Rhenium','Osmium','Iridium','Platinum', 'Gold','Mercury','Thallium','Lead','Bismuth','Polonium','Astatine','Radon','Francium', 'Radium','Actinium','Thorium','Protactinium','Uranium','Neptunium','Plutonium','Americium', 'Curium','Berkelium','Californium','Einsteinium','Fermium','Mendelevium','Nobelium', 'Lawrencium','Rutherfordium','Hahnium','Seaborgium','Neilsbohrium','Hassium','Meitnerium', 'Ununnilium','Unununium','Ununbium'); Berat : array[1..112] of string[5] = ('1.008','4.003','6.939','9.012','10.81','12.01','14.01', '15.99','18.99','20.18','22.99','24.31','26.98','28.09','30.97','32.06','35.45','39.95', '39.10','40.08','44.96','47.90','50.94','51.99','54.94','55.85','58.93','58.71','63.54', '65.37','69.72','72.59','74.92','78.96','79.91','83.80','85.47','87.62','88.91','91.22', '92.91','95.94',' 99 ','101.1','102.9','106.4','107.9','112.4','114.8','118.7','121.8', '127.6','126.9','131.3','132.9','137.3','138.9','140.1','140.9','144.2',' 147 ','150.4', '151.9','157.3','158.9','162.5','164.9','167.3','168.9','174.1','174.9','178.5','180.9', '183.9','186.2','190.2','192.2','195.1','196.9','200.6','204.4','207.2','208.9',' 210 ', ' 210 ',' 222 ',' 223 ',' 226 ',' 227 ','238.0',' 231 ','238.0',' 237 ',' 242 ',' 243 ', ' 247 ',' 249 ',' 251 ',' 254 ',' 253 ',' 256 ',' 254 ',' 257 ',' 260 ',' 262 ',' 263 ', ' 262 ',' 265 ',' 266 ',' 269 ',' 272 ',' 277 '); Var a,b,i,ran,skor : byte; zat,zat2,jawab : string; opsi,opsi2,opsi3 : char; Procedure Lambang_atom; Begin ClrScr; GoToXY(12,2); Write('Komputer sudah memberi nomer atom dan berat atom, '); GoToXY(12,3); Write('Anda diminta untuk mengisi lambang atom pada tanda (-) '); GoToXY(12,4); Write('====================================================='); GoToXY(12,24); Write('Kalau bingung teken <Enter> sazaaaa ....');
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
Randomize; a := Random(60); a := 2 + a; if a < 6 then a := 6; if a > 60 then a := 60; b := Random(19); if b < 7 then b := 7; if b > 19 then b := 19; ran := random(112); zat := nomer[ran]; GoToXY(a,b+1); Write(zat); for i := 1 to 112 do Begin if zat = nomer[i] then Begin GoToXY(a-1,b-1); Write(berat[i]); skor := 0; Repeat GoToXY(a+3,b); Write('error'); delay(100); GoToXY(a+3,b); ClrEol; GoToXY(a+3,b); Write('-'); GoToXY(a+3,b); readln(jawab); if jawab <> lambang[i] then Begin GoToXY(a+3,b); Write(#7); GoToXY(a+3,b); Write('error'); end; skor := skor + 1; if jawab = '' then Begin GoToXY(a+3,b); Write(lambang[i],' GoToXY(1,24); ClrEol; GoToXY(12,24); Write('<Esc> Menu'); GoToXY(50,24); Write('<Enter> Ulang'); Exit; end; until jawab = lambang[i];
');
skor := 11 - skor; if jawab = lambang[i] then Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
Write(#7); GoToXY(1,24); ClrEol; GoToXY(30,22); Write('Benar skor anda ',skor); GoToXY(12,24); Write('<Esc> Menu'); GoToXY(50,24); Write('<Enter> Ulang'); end; end; end; end; Procedure nomor_atom; Begin ClrScr; GoToXY(12,2); Write('Komputer sudah memberi Lambang unsur dan berat atom, '); GoToXY(12,3); Write('Anda diminta untuk menebak nomor atom pada tanda (-) '); GoToXY(12,4); Write('====================================================='); GoToXY(12,24); Write('Kalau bingung teken <Enter> sazaaaa ....'); Randomize; a := Random(60); a := 2 + a; if a < 6 then a := 6; if a > 60 then a := 60; b := Random(19); if b < 7 then b := 7; if b > 19 then b := 19; ran := Random(112); zat := lambang[ran]; zat2:= nama[ran]; GoToXY(a+3,b); Write(zat,' (',zat2,')'); for i := 1 to 112 do Begin if zat = lambang[i] then Begin GoToXY(a-1,b-1); Write(berat[i]); skor := 0; Repeat GoToXY(a,b+1); Write('error'); delay(100); GoToXY(a,b+1); ClrEol; GoToXY(a,b+1); Write('-'); GoToXY(a,b+1); ReadLn(jawab); if jawab <> nomer[i] then Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
GoToXY(a,b+1); Write(#7); GoToXY(a,b+1); Write('error'); end; skor := skor + 1; if jawab = '' then Begin Write(#7); GoToXY(a,b+1); Write(nomer[i],' '); GoToXY(1,24); ClrEol; GoToXY(12,24); Write('<Esc> Menu'); GoToXY(50,24); Write('<Enter> Ulang'); Exit; end; until (jawab = nomer[i]); skor := 11 - skor; if jawab = nomer[i] then Begin Write(#7); GoToXY(1,24); ClrEol; GoToXY(30,22); Write('Benar skor anda ',skor); GoToXY(12,24); Write('<Esc> Menu'); GoToXY(50,24); Write('<Enter> Ulang'); end; end; end; end; Begin Repeat ClrScr; TextColor(yellow); TextBackGround(red); GoToXY(20,5); Write(' MENU TEBAKAN SISTEM PERIODIK '); GoToXY(20,7); Write(' 1. MENEBAK NOMOR ATOM '); GoToXY(20,8); Write(' 2. MENEBAK LAMBANG ATOM '); GoToXY(20,9); Write(' 3. KELUAR '); GoToXY(20,11); Write(' OPSI : '); GoToXY(28,11); ReadLn(opsi); TextBackGround(blue); Case opsi of '1' : Repeat nomor_atom; opsi2 := ReadKey; Until opsi2 = #27; '2' : Repeat Lambang_atom;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
opsi2 := ReadKey; Until opsi2 = #27; '3' : Halt; End; Until opsi3 = #27; End. Keterangan : Teknik penempatan string pada posisi (X,Y) dilakukan secara acak menggunakan fungsi random. Untuk mengawali pembangkit bilangan acak maka sebelumnya dipanggil dulu prosedur Randomize. Jika pada fungsi random tidak dituliskan range-nya maka akan dihasilkan bilangan acak dengan range 0 ≤ X < 1, sebaliknya jika dituliskan range-nya maka harus bertipe Word hasilnya adalah 0 ≤ X < range. Jika range = 0 maka hasilnya adalah 0. Teknik penempatan acak hanya sekedar untuk daya tarik program. Untuk menghapus text dikenalkan prosedur ClrEol (Clear End Of Line) yang akan menghapus mulai posisi X yang ditentukan sampai akhir baris. Untuk menandai salah atau benarnya jawaban diberi tanda bel menggunakan prosedur Write(#7); yang akan berfungsi pada mode DOS saja. Dalam program juga dikenalkan penampilan contoh menu program dengan 3 pilihan. Seleksi pilihan menggunakan prosedur ReadLn(opsi) dimana opsi bertipe char. Dapat juga prosedur ReadLn(opsi)diganti dengan opsi := ReadKey; yang pada pengoperasiannya jika pilihan telah ditekan maka program langsung running tanpa terlebih dahulu menekan tombol <Enter>. Untuk menambah daya tarik tampilan dilakukan teknik pewarnaan teks dan latar belakang. Pewarnaan teks menggunakan prosedur TextColor(X); dimana X bertipe Byte dengan range 0 … 15 sesuai dengan harga konstanta warna yang didefinisikan pada CRT. Untuk pengaturan latar belakang digunakan prosedur TextBackGround(X); dimana X bertipe Byte dengan range 0 … 7 sesuai dengan harga konstanta warna yang didefinisikan pada CRT. Nama warna dapat juga langsung dituliskan menggunakan istilah Inggris seperti yang telah didefinisikan pada CRT. Untuk menjalankan pilihan opsi digunakan aturan seleksi Case … of. Setiap pilihan opsi juga dapat dilakukan pengulangan program menggunakan looping Repeat … Until. Untuk scanning penekanan tombol digunakan penjebak opsi2 := ReadKey. Pilihan opsi akan berhenti kalau tombol yang ditekan adalah tombol <Esc> dengan kode ASCII #27, jika tombol lain, misalnya <Enter> maka pilihan opsi tersebut akan diulang. Pengulangan program keseluruhan menggunakan teknik yang sama, jika ditekan <Esc> maka program akan berhenti. 6.14 kONSTANTA LAJU REAKSI Menghitung harga konstanta laju reaksi (k) berbagai orde reaksi apabila data konsentrasi awal , waktu dan konsentrasi setiap waktu diketahui. Rumusnya
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
Orde 1 : 1 C k r = ln o t Ct Orde 2 :
1 C − Ct k r = o t Co .Ct Orde 3 : kr =
1 1 1 − 2 2.t Ct Co 2
Harga kr diperhitungkan dari harga k setiap waktu dan dicari rata-ratanya. Program Praktikum_14; Uses CRT; Const menit = 100; Var Kt,Ct,T : array[0..menit] of real; Cawal,Kr : real; Jdata,i,pilih : byte; opsi : char; Label 01; Procedure input; Begin Repeat ClrScr; Write('Orde berapa Until pilih < 4;
? '); Read(pilih);
Write('Konsentrasi awal ? '); ReadLn(Cawal); WriteLn; Write('Berapa data masukkan ? '); ReadLn(Jdata); WriteLn; i := 1; While i <= Jdata do Begin Write('t ',i,' = '); Read(t[i]); Write('C ':10,i,' = '); Read(Ct[i]); inc(i,1); WriteLn; End; End; Procedure order1; Begin Kr := 0; i := 1; While i <= Jdata do
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
Begin Kt[i] := (1/t[i])*ln(Cawal/Ct[i]); Kr := Kr + Kt[i]; inc(i,1); End; Kr := Kr/Jdata; End; Procedure order2; Begin Kr := 0; i := 1; Repeat Kt[i] := (1/t[i])*((Cawal-Ct[i])/(Cawal*Ct[i])); Kr := Kr + Kt[i]; inc(i,1); Until i > Jdata; Kr := Kr/Jdata; End; Procedure order3; Begin Kr := 0; for i := Jdata DownTo 1 do Begin Kt[i] := (1/(2*t[i]*sqr(Ct[i])))-(1/(2* t[i]*sqr(Cawal))); Kr := Kr + Kt[i]; End; Kr := Kr/Jdata; End; Procedure output; forward;
{memanggil Procedure yang ada di bawah}
Procedure pilihan(pilih : byte); Begin Case pilih of 1 : Begin order1; output; End; 2 : Begin order2; output; End; 3 : Begin order3; output; End; End; End; Procedure output; Begin ClrScr;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
6
WriteLn('Konsentrasi awal = ',Cawal:8:4); WriteLn; for i := 1 to Jdata do Begin WriteLn('t(',i,') = ',t[i]:6:4,'':5,'Ct(',i,') = ', Ct[i]:8:4,'':5,'Kt(',i,') = ', Kt[i]:10:6); End; WriteLn; WriteLn('K reaksi = ',Kr:10:6); GoToXY(5,24); Write('<Esc> Keluar
<Enter> Ulang');
End; {Program utama} Begin 01 : ClrScr; input; pilihan(pilih); opsi := ReadKey; if opsi = #13 then GoTo 01 else halt; ClrScr; End. Keterangan : Program mengenalkan beberapa bentuk looping yaitu While i <= Jdata do, mungkin bisa diterjemahkan sebagai berikut “selagi i kurang dari atau sama dengan Jdata maka lakukan …..”. Syarat batasnya adalah i <= Jdata sehingga jika i > Jdata maka program akan berhenti. Looping lain Repeat …… Until i > Jdata, dan loopong for i := Jdata DownTo 1 do yang merupakan kebalikan dari looping for… to … do. Untuk memanggil prosedur yang ada di bawahnya dalam program ini dikenalkan penggunaan prosedur forward . Listing prosedur Output ada di bawah prosedur Pilihan padahal dalam prosedur Pilihan ada pemanggilan terhadap prosedur Output, untuk mengatasi digunakan prosedur forward dengan terlebih dulu menempatkan header prosedur Output. Procedure output; forward;
{memanggil Procedure yang ada di bawah}
Procedure pilihan(pilih : byte); Begin Case pilih of 1 : Begin order1; output; End; …………………………; End; End; Procedure output; Begin ………………………;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
End; 6.15 KINETIKA KIMIA Menghitung orde reaksi dengan memperhatikan macam data input : 1. Konsentrasi reaktan dan kecepatan awalnya Misalnya ada 2 buah reaktan, untuk menentukan orde reaktan pertama maka konsentrasi reaktan lain harus konstan, sehingga yang diperhatikan hanya konsentrasi reaktan pertama dan kecepatan awalnya Rumus penyelesaianya dapat diturunkan dari rasio konsentrasi dan kecepatan awalnya sebagai berikut R ≈ Cn Ln( R ) ≈ n.Ln( C ) c r n.Ln 1 = Ln 1 c2 r2 r Ln 1 r2 n= c Ln 1 c2
r adalah kecepatan awal, c adalah konsentrasi reaktan, dan n adalah orde reaktan 2. Konsentrasi reaktan , waktu reaksi, dan konsentrasi produk Prinsip penyelesaiannya sama dengan penyelesaian macam data input pertama, hanya sebelumnya harus dicari dulu lajunya yaitu dengan membagi masing-masing konsentrasi produk dengan waktu reaksinya r=
[ produk ] waktu
Program Praktikum_15; Uses CRT; Type dc = array[1..10,1..10] of real; di = array[1..40] of byte; dr = array[1..40] of real; Var i,j,jr,pilih,ordeke,data : byte; ir,rir,C,rc,orde,t,final : dc; js : di; order,ordepar : dr; sum1,sum2,ordetot : real; Procedure CariOrde; Var ordepar : dr; Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
ClrScr; Repeat GoToXY(21,3); ClrEol; GoToXY(5,3); Write('Jumlah reaktan = '); ReadLn(jr); Until jr > 1; TextColor(white); GoToXY(5,4); Write('Macam data input : '); TextColor(yellow); GoToXY(5,5); Write('1. Konsentrasi reaktan + initial rate '); GoToXY(5,6); Write('2. Konsentrasi reaktan + waktu + konsentrasi produk '); GoToXY(5,7); Write(' Pilihan : '); ReadLn(data); pilih := 1; ordetot := 0; Repeat ClrScr; TextColor(white); GoToXY(5,3); Write('Jumlah reaktan = ',jr); GoToXY(5,4); Write('Mencari orde reaktan ',pilih,' : '); js[pilih] := 2; GoToXY(5,5); Write('Jumlah sampel = ',js[pilih]); if data = 1 then Begin TextColor(yellow); GoToXY(5,7); Write('Untuk menentukan orde reaktan ',pilih,' maka konsentrasi reaktan lain'); GoToXY(5,8); Write('harus konstan, sehingga yang diperhatikan hanya konsentrasi '); GoToXY(5,9); Write('reaktan ',pilih, ' dan initial rate-nya'); GoToXY(5,11); Write('No.':1,'[reaktan ':10,pilih,']','Initial rate':15); end; if data = 2 then Begin TextColor(yellow); GoToXY(5,7); Write('Untuk menentukan orde reaktan ',pilih,' maka konsentrasi reaktan lain'); GoToXY(5,8); Write('harus konstan, sehingga yang diperhatikan hanya konsentrasi '); GoToXY(5,9); Write('reaktan ',pilih,', waktu setimbang dan konsentrasi produknya.'); GoToXY(5,11); Write('No.':1,'[reaktan ':10,pilih,']','waktu':15,'[akhir]':15); end; TextColor(white); for j := 1 to js[pilih] do Begin GoToXY(5,11+j); Write(j:2); end;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
for j := 1 to js[pilih] do Begin GoToXY(15,11+j); Write('-'); GoToXY(15,11+j); read(C[pilih,j]); if data = 1 then Begin GoToXY(30,11+j); Write('-'); GoToXY(30, 11+j); read(Ir[pilih,j]); end; if data = 2 then Begin GoToXY(30,11+j); Write('-'); GoToXY(30,11+j); read(t[pilih,j]); GoToXY(44,11+j); Write('-'); GoToXY(44,11+j); read(final[pilih,j]); Ir[pilih,j] := abs(final[pilih,j]/t[pilih,j]); end; end; sum1 := 0; sum2 := 0; for i := 1 to (js[pilih]-1) do Begin for j := (i+1) to js[pilih] do Begin rc[j,i] := c[pilih,j]/c[pilih,i]; rir[j,i] := Ir[pilih,j]/Ir[pilih,i]; orde[j,i] := (Ln(rir[j,i]))/Ln(rc[j,i]); sum1 := sum1 + orde[j,i]; end; sum2 := sum2 + i; end; ordepar[pilih] := sum1/sum2; ordeke := pilih; order[ordeke] := ordepar[pilih]; ordetot := ordetot + ordepar[pilih]; GoToXY(5,22); Write('Orde reaktan ',pilih,' = ',ordepar[pilih]:4:3); Delay(1000); pilih := pilih + 1; Until pilih > jr; end; Procedure out; Begin GoToXY(5,19); Write('Hasil total : '); for pilih := 1 to jr do Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
GoToXY(5,20+pilih); Write('Orde reaktan ',pilih,' = ',order[pilih]:4:3); end; GoToXY(5,24); Write('Orde total = ',ordetot:4:3); end; Begin ClrScr; Repeat ClrScr; cariOrde; out; Until ReadKey = #27 End. Keterangan : Program mengenalkan tipe data array 2 dimensi yaitu dc = array[1..10,1..10] of real; Penentuan orde terdapat pada bagian sum1 := 0; sum2 := 0; for i := 1 to (js[pilih]-1) do Begin for j := (i+1) to js[pilih] do Begin rc[j,i] := c[pilih,j]/c[pilih,i]; rir[j,i] := Ir[pilih,j]/Ir[pilih,i]; orde[j,i] := (Ln(rir[j,i]))/Ln(rc[j,i]); sum1 := sum1 + orde[j,i]; end; sum2 := sum2 + i; end; ordepar[pilih] := sum1/sum2; ordeke := pilih; order[ordeke] := ordepar[pilih]; ordetot := ordetot + ordepar[pilih]; ordepar adalah variabel orde masing-masing reaktan, sedangkan ordetot adalah orde total reaksi. Penentuan laju pada macam data input kedua adalah Ir[pilih,j] := abs(final[pilih,j]/t[pilih,j]); Didukung dengan penempatan string menggunakan procedur GoToXY(X,Y)maka tampilan tampak lebih interaktif.
6.16 LAJU EFUSI GAS
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
Menghitug harga laju efusi suatu gas dengan rumus u =
2 RT κ po . .1 − M κ−1 pi
κ−1 κ
dimana u adalah laju efusi gas, M adalah massa molar, κ adalah Cp/Cv, po dan pi adalah tekanan luar dan dalam Program Praktikum_16; Uses CRT; Const R = 8.31441; Var T,M,K,pex,pin,R1,R2,R3,R4,R5,R6,R7 : real; opsi : char; Function pangkat(a,b : real) : real; begin pangkat := exp(b*ln(a)); end; Procedure input; begin Write('Temperatur dalam K = '); ReadLn(T); Write('Berat molekular = '); ReadLn(M); Write('Cp/Cv = '); ReadLn(K); Write('Tekanan luar = '); ReadLn(pex); Write('Tekanan dalam = '); ReadLn(pin); end; Procedure hitung; begin R1 := K/(K-1); R2 := 1/R1; R3 := pex/pin; R4 := 1-R3; M := M/1000; R5 := (2*R*T)/M; R6 := pangkat(R4,R2); R7 := Sqrt(R5*R1*R6); end; Procedure Hasil; begin WriteLn; WriteLn('Laju efusi = ',R7:10:5); end; Begin Repeat ClrScr; Input; Hitung; Hasil; opsi := ReadKey;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
Until opsi = #27; End. Keterangan : Dalam program ini dikenalkan pembuatan suatu Function dalam menghitung hasil perpangkatan suatu variabel. Turbo Pascal memang tidak menyediakan suatu fungsi atau prosedur terintegrasi khusus untuk perpangkatan, karena itu harus dibuat sendiri fungsi perpangkatannya. Penggunaannya tampak pada persamaan R6 := pangkat(R4,R2);
6.17 OPERASI MATRIK DAN VEKTOR Menyelesaikan operasi matrik dan vektor berupa penjumlahan matrik, selisih, perkalian skalar matrik, perkalian antar matrik, penentuan matrik transpose, harga determinan, matrik inversi, dan menyelesaikan persamaan linier. Program Praktikum_17; Uses CRT; Const max = 16; Type matrik = array[1..max,1..max] of real; vektor = array[1..max] of real; Var a,b,c,m : matrik; i,j,n,k,r,baris,kolom : integer; opsi : char; Function det(n:integer; a:matrik): real; var ii,jj,kk,ll,ff,nxt : integer; piv,cn,big,temp,term : real; Begin ff := 1; for ii := 1 to n-1 do Begin big := 0; for kk := ii to n do Begin term := abs(a[kk,ii]); if term - big > 0 then Begin big := term; ll := kk; end; end; if ii - ll <> 0 then ff := -ff; for jj := 1 to n+1 do Begin temp := a[ii,jj]; a[ii,jj] := a[ll,jj]; a[ll,jj] := temp;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
end; piv := a[ii,ii]; nxt := ii + 1; for jj := nxt to n do Begin cn := a[jj,ii]/piv; for kk := ii to n+1 do a[jj,kk] := a[jj,kk] - cn*a[ii,kk]; end; end; temp := 1; for ii := 1 to n do temp := temp*a[ii,ii]; det := temp*ff; end; Procedure changecol(baris,kolom,target:integer; var m:matrik; newcol:vektor); var i : integer; Begin for i := 1 to baris do m[i,target] := newcol[i]; end; Procedure solve(n:integer; a:matrik; c:vektor; var x: vektor); var k : integer; d : real; Procedure swap(n,k:integer; var a:matrik; var c : vektor); var e : real; j : integer; Begin for j := 1 to n do Begin e := c[j]; c[j] := a[j,k]; a[j,k] := e; end; end; Begin d := det(n,a); for k := 1 to n do Begin swap(n,k,a,c); x[k] := det(n,a)/d; swap(n,k,a,c); end; end; Procedure invert(n : integer; a : matrik; var b : matrik); var i,tmp : vektor; j : integer; Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
if det(n,a) = 0 then Begin WriteLn('invert : singular matrik'); ReadLn; end else Begin for j := 1 to n do Begin i[j] := 1; solve(n,a,i,tmp); changecol(n,n,j,b,tmp); i[j] := 0; end; end; end; Procedure jumlah(baris,kolom:integer; x,y :matrik; var z : matrik); var i,j : integer; Begin for i := 1 to baris do for j := 1 to kolom do z[i,j] := x[i,j]+y[i,j]; end; Procedure selisih(baris,kolom:integer; x,y :matrik; var z : matrik); var i,j : integer; Begin for i := 1 to baris do for j := 1 to kolom do z[i,j] := x[i,j]-y[i,j]; end; Procedure transpose(baris,kolom:integer; mat : matrik; var matt : matrik); var i,j : integer; Begin for i := 1 to baris do for j := 1 to kolom do matt[j,i] := mat[i,j]; end; Procedure kali_skalar(baris,kolom:integer; konst : real; x:matrik; var z : matrik); var i,j : integer; Begin for i := 1 to baris do for j := 1 to kolom do z[i,j] := konst*x[i,j]; end; Procedure kali_matrik(n,m,k: integer; x,y: matrik; var z: matrik); var i,j,h : integer; Begin for i := 1 to n do for j := 1 to k do Begin z[i,j] := 0;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
for h := 1 to m do z[i,j] := z[i,j] + x[i,h]*y[h,j]; end; end; Procedure readmat(baris,kolom : integer; var m : matrik); var i,j : integer; Begin for i := 1 to baris do Begin for j := 1 to kolom do Begin GoToXY((j*10),i+2); ReadLn(m[i,j]); end; end; end; Procedure Writemat(baris,kolom:integer; var m:matrik); var i,j : integer; Begin for i := 1 to baris do Begin for j := 1 to kolom do Begin GoToXY((j*10),i+2); WriteLn(m[i,j]:10:4); end; WriteLn; end; end; Procedure readvec(n : integer; var v : vektor); var i : integer; Begin GoToXY(70,2); Write('Vektor'); for i := 1 to n do Begin GoToXY(70,i+2); Read(v[i]); end; end; Procedure inversi; Begin ClrScr; GoToXY(1,1); Write('Orde matrik : '); Read(n); baris := n; kolom := n; readmat(n,n,a); ClrScr; invert(n,a,b); GoToXY(1,1); Write('Matrik inversi :'); writemat(n,n,b);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
7
end; Procedure determinan; var dtm : real; Begin ClrScr; Write('Orde matrik : '); ReadLn(n); baris := n; kolom := n; readmat(n,n,a); ClrScr; WriteLn('matrik asal :'); writemat(n,n,a); dtm := det(n,a); WriteLn('Determinan matrik = ',dtm:10:4); end; Procedure dua_matrik(var X,Y : matrik); Begin ClrScr; Write('Orde matrik : '); ReadLn(n); baris := n; kolom := n; GoToXY(10,2); Write('Matrik Pertama : '); for i := 1 to baris do Begin for j := 1 to kolom do Begin GoToXY((j*10),i+2); ReadLn(X[i,j]); end; end; GoToXY(10,baris+5); Write('Matrik Kedua : '); for i := 1 to baris do Begin for j := 1 to kolom do Begin GoToXY((j*10),i+(baris+5)); ReadLn(Y[i,j]); end; end; end; Procedure penjumlahan; var X,Y,Z : matrik; Begin dua_matrik(x,y); jumlah(n,n,x,y,z);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
ClrScr; Writeln('Hasil Penjumlahan :'); writemat(n,n,z); end; Procedure pengurangan; var X,Y,Z : matrik; Begin dua_matrik(x,y); selisih(n,n,x,y,z); ClrScr; Writeln('Hasil Selisih :'); writemat(n,n,z); end; Procedure perkalian; var X,Y,Z : matrik; Begin dua_matrik(x,y); kali_matrik(n,n,n,x,y,z); ClrScr; Writeln('Hasil Perkalian :'); writemat(n,n,z); end; Procedure transpose_matrik; Begin ClrScr; Write('Orde matrik : '); ReadLn(n); baris := n; kolom := n; readmat(n,n,a); ClrScr; WriteLn('Matrik Transpose :'); transpose(n,n,a,b); writemat(n,n,b); end; Procedure perkalian_skalar; var konst : real; Begin ClrScr; Write('Orde matrik : '); ReadLn(n); baris := n; kolom := n; readmat(n,n,a); GoToXY(1,baris+5); Write('Konstanta : '); Read(konst);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
kali_skalar(n,n,konst,a,b); ClrScr; WriteLn('Hasil perkalian skalar :'); writemat(n,n,b); end; Procedure linier; var den : real; v : vektor; m,z : matrik; Begin ClrScr; Write('Orde matrik : '); ReadLn(n); baris := n; kolom := n; readmat(n,n,m); readvec(n,v); den := det(n,m); WriteLn; WriteLn('Penyelesaian persamaan linier :'); WriteLn; for i := 1 to n do Begin z := m; changecol(n,n,i,z,v); WriteLn('x',i:1,' = ',det(n,z)/den:10:4); end end; Procedure Pilihan; Begin ClrScr; TextColor(yellow); WriteLn(' MENU MATRIK '); WriteLn; WriteLn(' 1. Penjumlahan Matrik '); WriteLn(' 2. Selisih Matrik '); WriteLn(' 3. Perkalian Matrik '); WriteLn(' 4. Perkalian Skalar Matrik '); WriteLn(' 5. Inversi Matrik '); WriteLn(' 6. Determinan '); WriteLn(' 7. Transpose '); WriteLn(' 8. Persamaan Linier '); WriteLn(' 9. Keluar '); WriteLn; Write (' Pilihan : '); opsi := ReadKey; Case opsi of '1' : Penjumlahan; '2' : Pengurangan;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
'3' : Perkalian; '4' : Perkalian_skalar; '5' : Inversi; '6' : Determinan; '7' : Transpose_matrik; '8' : Linier; '9' : Halt; end; end; Begin Repeat Pilihan; GoToXY(10,25); Write('<Esc> Keluar <Enter> Menu'); Until ReadKey = #27; End. Keterangan : Program ini memberikan contoh penggunaan deret 2 dimensi untuk data matrik. Salah satu penggunaan operasi matrik dan vektor adalah penyelesaian permasalahan kesetaraan persamaan reaksi pada pembakaran metana yang menghasilkan CO2 dan H2O. CH4
+
O2
→
CO2
+
H2O
Penyelesaiannya menggunakan menu Persamaan Linier. Matrik yang dapat dibentuk dari persamaan ini adalah 1 0 4
0
1
2 0
2 0
0 1 2
Dalam persamaan reaksi ada 4 suku yang menunjukkan 4 zat berbeda (2 reaktan dan 2 produk). Baris pertama untuk banyaknya atom C : suku pertama sebanyak 1 buah , suku kedua sebanyak 0 buah, suku ketiga sebanyak 1 buah dan suku keempat sebanyak 0 buah. Baris kedua untuk menunjukkan banyaknya atom O, dan baris ketiga untuk banyaknya atom H. Matrik hanya memiliki 3 baris karena dalam persamaan reaksi hanya terdapat 3 jenis atom yaitu C, O dan H. Tiga kolom pertama adalah bentuk matrik 3 x 3, sedangkan kolom keempat adalah vektornya. Hasil penyelesaiannya diperoleh vektor : 0,5; 1,0; 0,5. Tiga komponen vektor ini adalah koefisien dari 3 suku pertama dalam persamaan reaksi, sedangkan koefisien suku terakhir dapat langsung dihitung dengan lebih mudah, diberikan harga 1,0. Sehingga diperoleh persamaan reaksi ½ CH4 + 1 O2 → ½ CO2 + 1 H2O atau dibulatkan menjadi 1 CH4 +
2 O2
→
1 CO2 +
2 H2O
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
6.18 MEMBUAT FILE UNIT Suatu fungsi atau prosedur dalam suatu program hanya dapat digunakan oleh program tersebut, tidak dapat digunakan oleh program lain dalam file lain. Problem ini tidak efisien jika diterapkan untuk program besar atau panjang karena harus mengetik ulang dan cara ini boros memori. Untuk mengantisipasiny Pascal menyediakan bentuk pemrograman modular berupa file unit yang dapat digunakan untuk membuat librari (pustaka) dan membagi program besar menjadi modul-modul yang secara logika berkaitan. Perhatikan kembali pembahasan sub-bab 2.26 dan bab 3 untuk membuat file unit berikut ini. {$N+} Unit Math; Interface Uses CRT; Var hasil : extended; i : integer;
{Praktikum 18}
Function pangkat(a : real; b : real) : extended; Function sina(a : real) : real; Function cosa(a : real) : real; Function tana(a : real) : real; Function loga(a : real) : real; Procedure garis_datar (x1,x2,y,jgar : integer); Procedure garis_tegak (y1,y2,x,jgar : integer); implementation Function pangkat; Begin Hasil := exp(b*ln(a)); pangkat := hasil; End; Function sina; Begin Hasil := sin(a/(180/pi)); sina := hasil; End; Function cosa; Begin Hasil := cos(a/(180/pi)); cosa := hasil; End; Function tana; Begin Hasil := sina(a)/cosa(a); tana := hasil; End; Function loga;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
Begin Hasil := Ln(a)/Ln(10); loga := hasil; End; Procedure garis_datar; Begin for i := x1 to x2 do Begin GoToXY(i,y); Write(char(jgar)); End; End; Procedure garis_tegak; Begin for i := y1 to y2 do Begin GoToXY(x,i); Write(char(jgar)); End; End; End. Keterangan : Nama unit harus sama dengan nama filenya. Jika nama unit Math maka nama file programnya harus Math. Unit ini dapat dipakai oleh file lain dengan menyebutkan nama unit dalam klausul Uses. Source Code unit ini adalah math.pas maka agar dapat menjadi math.tpu (Turbo Pascal Unit) harus dikompilasi dulu dengan alamat ke disket/hardisk dengan perintah sebagai berikut : •
Untuk Turbo Pascal 5 : Tekan Arahkan Destination ke Disk (bukan Memori) dengan menekan Tekan
•
Untuk Turbo Pascal 7 :
Langsung tekan
Contoh jenis garis pada Char(jgar) sebagai berikut : kode ASCII 205 untuk garis tunggal datar dan kode ASCII 186 untuk garis tunggal tegak/vertikal
6.19 JARAK ANTAR BIDANG INDEKS MILLER GaCl3 memiliki sistem triklinik. Konstanta kristalnya sebagai berikut α = 119,50 β = 90,80 γ = 118,60; a = 6,94 angstrom, b = 6,84 angstrom, c = 6,82 angstrom. Tulis program untuk menghitung jarak antar bidang indeks Miller (dhkl) menggunakan rumus berikut
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8 h2 2 2 2 2 hk sin α + k sin 2 β + l sin 2 γ + ab ( cos α. cos β. cos γ ) + a2 b2 c2 2kl ( cos β. cos γ − cos α) + 2lh ( cos α. cos γ − cos β ) + 1 − cos 2 α − cos 2 β − cos 2 γ + 2 cos α. cos β. cos γ bc ca P =
(
1/ 2
1 dhkl = P
Hitunglah harga jarak antar bidang indeks Miller untuk bidang 100 dan 110 ! {$N+} Program Praktikum_19; Uses CRT, math; Var a,b,c,alpha,betha,gamma : real; h,k,l : byte; sr1,sr2,r1,r2,r3,r4,r5,r6,r7,r8,dhkl : real; opsi : char; Label 10; Procedure input; Begin GoToXY(1,1); Write('MENGHITUNG JARAK ANTAR BIDANG INDEKS MILLER'); garis_datar(1,79,2,205); GoToXY(1,3); Write('Alpha = Betha = Gamma = '); garis_datar(1,79,4,205); GoToXY(1,5); Write('a = b = c = '); garis_datar(1,79,6,205); GoToXY(1,7); Write('h = k = l = '); garis_datar(1,79,8,205); GoToXY(1,9); Write('dhkl = '); GoToXY(9,3); Read(alpha); GoToXY(27,3); Read(betha); GoToXY(44,3); Read(gamma); GoToXY(9,5); Read(a); GoToXY(27,5); Read(b); GoToXY(44,5); Read(c); GoToXY(9,7); Read(h); GoToXY(27,7); Read(k); GoToXY(44,7); Read(l); end; Procedure Rumus; Begin if h = 1 then sr1 := pangkat(h,2) else sr1 := 0; r1 := (sr1/pangkat(a,2))*Sqr(sina(alpha));
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
)
8
if k = 1 then sr1 := pangkat(k,2) else sr1 := 0; r2 := (sr1/pangkat(b,2))*Sqr(sina(betha)); if l = 1 then sr1 := pangkat(l,2) else sr1 := 0; r3 := (sr1/pangkat(c,2))*Sqr(sina(gamma)); r4 := ((2*h*k)/(a*b))*(cosa(alpha)*cosa(betha)*cosa(gamma)); r5 := ((2*k*l)/(b*c))*(cosa(betha)*cosa(gamma)-cosa(alpha)); r6 := ((2*l*h)/(c*a))*(cosa(gamma)*cosa(alpha)-cosa(betha)); r7 := (1-Sqr(cosa(alpha))-Sqr(cosa(betha))-Sqr(cosa(gamma))+ (2*cosa(alpha)*cosa(betha)*cosa(gamma))); r8 := r1 + r2 + r3 + r4 + r5 + r6 + r7; dhkl := Sqrt(1/r8); end; Procedure hasil; Begin GoToXY(1,9); Write('dhkl = ',dhkl:6:4); garis_datar(1,79,10,205); end; Begin ClrScr; 10: input; rumus; hasil; opsi := readkey; if opsi = #13 then goTo 10 else halt; End. Keterangan : Program ini menggunakan unit math dalam operasinya, yaitu fungsi pangkat, sinus, cosinus dan membuat garis dengan jenis garis tunggal datar. Perhatikan teknik mengulang program tanpa menghilangkan variabel yang akan diisi, sehingga tampak bentuk tampilan interaktif.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
Membuat Program Pelatihan Multimedia
Membuat Program Pelatihan Multimedia Buatlah proyek baru dengan cara : 1.
tempatkan sebuah label pada form dengan memilih icon
pada component
palette standart. 2.
tempatkan button 1,2,3 dengan memilih icon
pada component palette
standart. 3.
tempatkan status bar dengan mengklik icon
4.
tempatkan image dengan mengklik icon
dari conponent paletteWin32. dari component palette additional
kemudian atur ukurannya. 5.
tempatkan RichEdit
dari component palette Win32. kemudian drag pada
foam dan atur besarnya. 6.
pada component palette standart pilih icon
kemudian drag pada form.
Gabungkan image dengan panel
kemudian lakukan langkah berikut : 1 1 Mengubah Properti pada form
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
Form memiliki sejumlah karakteristik atau sifat sperti tinggi,lebar, nama,warna yang disebut properti. Property suatu foam atau komponen lain dapat diubah melalui Objek Inspektor pada halaman yang berjudul properties, contoh: properties Caption
Isi Digunakan untuk amemberi nama
Color
foam,missal Latihan Multimedia Digunakan untuk memberi warna foam, missal clBtnFace
1 1 Memempatkan komponen-komponen pada form komponen Label 1
Properties Caption
isi Digunakan untuk memberi nama label misal Ikatan Kimia
Color
Memberi warna label
Font
Digunakan untuk mengatur jenis ,ukuran dan
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
8
Button 1
Caption
warna huruf Ketik : TEXT
Cursor
Pilih HandPoint
Visible
Digunakan untuk menampilkan Button ,pilih True
Enable
Digunakan untuk mengaktifkan Button,pilih True
Button 2
Button 3
Button 4
Image
Hint
Digunakan untuk memunculkan pesan pada
Caption
status bar ,ketik mau baca text Ketik : GAMBAR
Cursor
Pilih HandPoint
Hint
Ketik : mau lihat gambar
Visible
Pilih : True
Enable Caption
Pilih : True Ketik :VIDEO
Cursor
Pilih HandPoint
Hint
Ketik : mau lihat video
Visible
Pilih : True
Enable Caption
Pilih : True Ketik : KELUAR
Cursor
Pilih HandPoint
Hint
Ketik : keluar ah…..
Visible
Pilih : True
Enable Picture
Pilih : True Digunakan untuk memilih gambar yang akan
dimunculkan klik load untuk mencari kemudian klik ok
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Stretch Pilih : true agar gambar sesuai dengan ukuran Statusbar
RichEdit 1
AutoHint
image Pilih : True
Visible
Pilih : True
Enable Color
Pilih : True Pilih : clAqua
Lines
Klik tanda sebelah kanannya lalu hapus tulisan RichEdit1 kemudian klik OK
Scroollbars Pilih : ssBoth Panel1 Caption Hapus tulisan Panel1 Setelah menempatkan dan mengatur property masing-masing komponen maka tampilan akan menjadi seperti berikut :
Menampilkan text melalui Button text Klik dua kali dengan cepat button text pada form Delphi, maka akan muncul tampilan unit sebagai berikut:
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Diantara tulisan begin dan end; tuliskan kode kejadian sebagai berikut : Panel1.visible:=false; Image1.visible:=false; RichEdit1.visible:=true; RichEdit1.line.LoadFromFile(‘nama file text yang akan dtampilkanr.rtf’); Save All kemudian jalankan form. Catatan : - sebelumnya buatlah file text dengan format rtf menggunakan Microsof World kemudian simpan pada directory yang sama tempa anda menyimpan form
Menampilkan gambar melalui button gambar klik dua kali dengan cepat button gambar sehingga muncul unit kerja anda seperti gambar diatas, lalu ketikkan kode kejadian Sebagai berikut : RichEdit1.Visible:=False; Panel1.Visible:=True; Image1.Visible:=true: Image1.Picture.LoadFromFile(‘nama file gambar .jpg’); Save All kemudian jalankan form. Catatan : temptkan file gambar yang akan dibuka pada directory penyimpanan form saudara.beberapa file gambar yang dapat diterjemahka Delphi antara lain jpg,bmp,dll
Menampilkan Video melalui button video Sebelumnya tambahkan pada Uses Shell API,Mplayer kemudianTempatkan komponen MediaPlayer1 dari Component Palette System dengan memilih icon pada form akan muncul tampilan seperti berikut:
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
sehingga
9
atur propertinya sebagai berikut : Auto Open Pilih False Colored Button Pilih False VIsible Pili False Visible Button Pilih False untuk semua Button Klik dua kali pada Button video kemudian ketikkan kode kejadian sebagai berikut : Image1.Visibl:=false; RichEdit1.Visible :=False; Panel1.Visible:=false; MediaPlayer1.FilenName:=’nama file yang akan dibuka.mpg’; MediaaPlayer1.Open ; Panel1.Show; MediaPlayr1.Display:=panel1; With Panel1 do Media Player1.DisplayRect:=Rect(2,2,Width,Height); If MediaPlayer1,DeviceID=0 then Begin MessageDlg(‘belum ada file yang dibuka’,mtInformation,[mbOK],0); Exit; End; MediaPlayer1.Play; End; Save All kemudian jalankan form. File film selain mpg, yang dapat dibaca oleh Delphi adalah AVI,
Mengahiri program Klik dua kali dengan cepat button keluar ,kmudian tuliskan kode kejadian sebagai berikut: If MesageDlg(‘yakinkah anda akan keluar?’,mt Confirmation,mbOKCancel,0) = mrOk than Application.Trminate; End;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Membuat Program Soal Interaktif Buatlah proyek baru dengan membuka Form Delphi baru, kemudian tepatkan Komponen-komponen sebagai berikut:
Setelah menempatkan komponen tersebut kemudian aturlah Properti melalui objek Inspector sebagai berikut : Button 1
Button 2
Button 3
Caption
Kalkulator
Name
Btnkalkulator
Enable Caption
true A
Name
BtnA
Enable Caption
False B
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Name
BtnB
Enable Caption
False C
Name
BtnC
Enable Caption
False mulai
Name
Btnmulai
Enable Caption
False Maju>
Name
Btnmaju
Enable Caption
False keluar
Name
Btnkeluar
Label 1
Enable Caption
False Keterangan 1
Label2
name Caption
Labelketerangan1 Keterangan 2
Label 3
name Caption
Labelketerangan2 60
RichEdit
name Lines
Labelwaktu Hilangkan tulisan RichEdit
Button 4
Button 5
Button 6
Button 7
Pilih ssBoth Timer
Scroolbar Enable
Pilih False
Interval
1000 (Menyatakan 1 Detik)
Name
Timer1
Dapat juga ditambahkan bevel untuk memberi bingkai komonen-komponen form.
Menampilkan soal melalui RichEdit dengan bantuan button mulai Sebelumnya kita harus menempatkan file soal yang hendak ditampilkan seperti ulasan sebelumnya tentang menampilkan text menggunakan button text. Beri nama file-file tersebut dengan nama 11.rtf,12.rtf,13.rtf dan seterusnya sampai 20.rtf. Dengan mangklik dua kali dengan cepat pada button mulai kemudian ketikkan kode kejadian sebagai berikut : BtnA.Enable:=true; BtnB.Enable:=true;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
BtnC.Enable:=true; Btnmaju.Enable:=true; Btnmulai.Enable:=true; RichEdit1.Visibl:= true; FileName:=’11.rtf’; RichEdit1.Lines.LoadFromFile(Filename); Js:= 1; Jss:=InToStr (js); Labelketerangan1.Caption:=’jumlah Soal;’+jss; Jb:=0; Jbs:=IntToStr(jb); Labelketerangan2.Caption:=jumlah benar:’+jbs; Timer1.Enable:=true; Form!.Visible:=false; X:=0; End;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Menampilkan Soal Berikutnya Menggunakan Button Maju Klik dua kali button maju dengan cepat kemudian tuliskan kode kejadian sebagai berikut : BtnA.Enable:=true; BtnB.Enable:=true; BtnC.Enable:=true; RichEdit1.Visible:=true; Js:=js+1; filename:=copy(filename,1,); Fni:=StrToInt(filename); Fni:=fni+1; If fni <20 then fni :=11; Fns:=IntToStr(fni); Filename:=fns+’.rtf’; RichEdit1.Visible:=true; RichEdit1.Lines.loadFromFile(filename); Jss:=IntToStr(js); Labelketerangan2.Caption:=’jumlah soal:’+jss; Beberapa variable eperti js,jss,jb,jbs harus ditambahkan terlebih dahulu dalam Uses.
Mengeluarkan button kalkulator menggunakan button kalkulator sebelumnya carilah file yang bernama cal.exe kemudian copy dan tempatkan pada tem[pat penyimpanan form.kemudian kli dua kali dan tuliskan kode kejadian sebagai berikut : ShellExecute(Handle,’Open’,’Calc.exe’,nil,nil,SW_SHOW); End;
Mengaktifkan Buton Sebelum menuliskan kode kejadian kita perlu mementukan option untuk soal yang jawabannya benar setlah itu baru kita tuliskan kode kejadian sebagai berikut : BtnA.Enable:=false; BtnB.Enable:=false; BtnC.Enable:=false; If filename=’11.rtf’then Begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Labelketerangan2.Caption :=’benar’; Jb:=jb+1; Jbs:=IntToStr(jb); Labelketerangan2.caption :=’jumlah benar:’+jbs; End; Pernyataan ini berlaku untuk semua file dengan jwaban A.untuk kejadia B dan C sama tingal mnyesuaikanfile soal mana yangoption jawabannya sesuai dengan button tersebut.
Mengatur lamanya waktu mengerjakan soal menggunakan timer X:=X+2; Xs:=IntToStr(60-X); Labelwaktu.Caption :=Xs; Xb:=StrToInt(Xs); If Xb=0 then Begin Btnmulai.Enable:=true; Btnmaju.Enable:=false; X:=-1; Labelketerangan2.Caption:=’jumlah benar:’; Labelketerangan1.Caption :=’jumlah Soal:’; RichEdit1.Clear; Timer1.Enable:=false; Labelwaktu.Caption;=’60’; Jb:=0; Js:=0; End;
Mengahiri aplikasi melalui Button keluar Untuk mengahiri aplikasi,kliok dua kali button keluar kemudian tukiska kode kejadian sebagai berikut : Application .terminate; End;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
PEMROGRAMAN GRAFIK DELPHI
PROGRAM 1 GRAFIK ARRAY Tempatkan komponen-komponen pada form seperti di bawah ini:
Kemudian ubahlah propertinya sebagai berikut: Objek Chart1
Chart2
Properti Series1 Titles Axis Panel Series2 Titles Axis
Nilai properti Pilih : Line Ketik : PANJANG GELOMBANG MAKSIMAL Bagian foot, ketik : PANJANG GELOMBANG Bagian title, ketik : ADSORBANSI Aktifkan gradient, pilih warna yang disukai Pilih : Area Ketik : GRAFIK Bagian foot, ketik : X Bagian title, ketik : Y
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
9
Label1 Label2 Edit1 Edit2 Button1 Button2 Memo1
Panel Caption Font Caption Font Text Text Caption Caption Lines
Aktifkan gradient, pilih warna yang disukai Ketik : Lamda keTahoma, style : bold, size : 12, color : black Ketik : Adsorbansi Tahoma, style : bold, size : 12, color : black (kosong) (kosong) Ketik : Grafik Ketik : Selesai (kosong)
Kemudian tuliskan kode kejadian pada tiap komponen seperti berikut : unit garray; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart; type TForm1 = class(TForm) Chart1: TChart; Series1: TLineSeries; Memo1: TMemo; Button1: TButton; Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Button2: TButton; Label2: TLabel; Chart2: TChart; Series2: TAreaSeries; procedure Button2Click(Sender: TObject); procedure Memo1Change(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Data : array of real ; implementation {$R *.DFM}
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
procedure TForm1.Button2Click(Sender: TObject); begin application.terminate; end; procedure TForm1.Memo1Change(Sender: TObject); begin if edit1.text='11' then memo1.ScrollBars:=ssVertical; end; procedure TForm1.Button1Click(Sender: TObject); begin if edit2.Text ='' then messagedlg('Data belum diisi',mtError,[mbok],0) else begin setlength(data,strtoint(edit1.text)+1); data[strtoint(edit1.text)] := strtofloat(edit2.text); series1.Add(strtofloat(edit2.text),'',clred); series2.Add(strtofloat(edit2.text),'',clBLUE); memo1.lines.add(edit1.text+' --> '+edit2.text); edit1.text :=inttostr(strtoint(edit1.text)+1); edit2.Text := floattostr(strtofloat(edit2.text)); edit2.text :=''; edit2.SetFocus; end; end; end. Hasil Running
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
PROGRAM 2 GRAFIK FUNGSI Tempatkan komponen-komponen pada form seperti berikut :
Ubah properti masing-masing komponen sebagaimana berikut ini: Objek Chart1
Properti Series2 Titles Axis
Nilai properti Pilih : Line Ketik : GRAFIK FUNGSI Bagian foot, ketik : X Bagian title, ketik : Y Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Aktifkan gradient, pilih warna yang disukai Ketik : PILIHAN FUNGSI Tahoma, style : Bold, size : 16, color : Blue Ketik : Y = 2x2 + 3x + 5 Tahoma, style : Bold, size : 12, color : Blue Ketik : Y = sin x Tahoma, style : Bold, size : 12, color : Blue Ketik : Y = cos x – 2 sin x Tahoma, style : Bold, size : 12, color : Blue Ketik : Batas Tahoma, style : Bold, size : 12, color : Blue Ketik : Skala x Tahoma, style : Bold, size : 12, color : Blue
Label7, 8, 9
Panel Caption Font Caption Font Caption Font Caption Font Caption Font Caption Font Caption
Radiobutton1, 2, 3 Button1 Button2
Font Caption Caption Caption
Tahoma, style : Bold, size : 12, color : Blue (kosong) Grafik Selesai
Label1 Label2 Label3 Label4 Label5 Label6
:
Menuliskan kode kejadian pada masing-masing komponen
unit gfungsi; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, StdCtrls, Chart, DBChart, Db,
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
DBTables; type TForm1 = class(TForm) Chart1: TChart; Button2: TButton; Edit1: TEdit; Label1: TLabel; Button1: TButton; Label2: TLabel; Label3: TLabel; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; Edit2: TEdit; Edit3: TEdit; Label5: TLabel; Label6: TLabel; Label9: TLabel; series1: TFastLineSeries; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure RadioButton3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button2Click(Sender: TObject); begin application.terminate; end; procedure TForm1.Button1Click(Sender: TObject); var i : integer; function FX(x : integer):real; begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
FX:=2*x*x+3*x+5; end; function ft(t:integer): real; begin ft := cos(t)*sin(t); end; begin series1.Clear; series1.XValues.Multiplier:=strtoint(edit2.text)/strtoint(edit3.text); for i := 1 to strtoint(edit1.text) do if radiobutton1.Checked then series1.add(FX(i)) else if radiobutton2.checked then series1.add(sin(pi/180*i)) else if radiobutton3.checked then series1.add(-2*sin(pi/180*i)+cos(pi/180*i)) end; procedure TForm1.RadioButton1Click(Sender: TObject); begin radiobutton1.checked:=true; radiobutton2.checked:=false; radiobutton3.checked:=false; end; procedure TForm1.RadioButton2Click(Sender: TObject); begin radiobutton2.checked:=true; radiobutton1.checked:=false; radiobutton3.checked:=false; end; procedure TForm1.RadioButton3Click(Sender: TObject); begin radiobutton3.checked:=true; radiobutton2.checked:=false; radiobutton1.checked:=false; end; end. Hasil Running
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
ANALISIS NUMERIK UNTUK PROBLEM KIMIA
PENDAHULUAN Sejalan dengan semakin kompleksnya aplikasi sains dan teknologi dalam kehidupan sehari-hari maka semakin rumit pula penyelesaian problem-problem penghitungan kimia. Untuk problem sederhana mungkin dapat diselesaikan dengan pendekatan analitik. Pendekatan analitik memang memberikan hasil eksak, tetapi memerlukan kemampuan yang tinggi dalam memanipulasi matematik sehingga hanya digunakan untuk menyelesaikan sebagian kecil problem kimia. Alternatif pendekatan penyelesaian lain adalah menggunakan metode numerik. Metode numerik hanya memberikan penyelesaian pendekatan (approximation), tetapi tidak memerlukan kemampuan memanipulasi matematik yang terlalu tinggi, dan dapat digunakan untuk menyelesaikan lebih banyak problem kimia daripada metode analitik. Contoh untuk diferensiasi atau integrasi persamaan
y = x2 dengan mudah dapat diselesaikan secara analitik menjadi dy d (x2 ) = =2x dx dx 1
2 3 ∫ ydx = ∫ x dx = 3 x
Kasus lain untuk persamaan y=
2x3 1 +5x
tidak dapat dengan cepat diselesaikan secara analitik, diperlukan teknik manipulasi matematik yang lebih tinggi. Tetapi persamaan ini dengan mudah dan cepat dapat diselesaikan secara analisis numerik. Berkembangnya program-program komputasi menggunakan komputer semakin menempatkan metode numerik pada posisi yang strategis dalam penyelesaian problem-problem kimia. Kecepatan dan ketepatan pendekatan penyelesaian komputasi semakin dapat diperbaiki dan dimodifikasi sehingga mendekati feasibilitas metode analitik. DIFERENSIASI NUMERIK
Tujuan membentuk derivativ adalah untuk menghitung slope (kemiringan). Misalnya diketahui y = f(x) dengan cara forward maka persamaan untuk slope garis tangent pada titik [x,f(x)] adalah
f ' ( x) =
dy df ( x ) f ( x + dx) − f ( x ) f ( x + ∆x ) − f ( x ) = = = lim dx dx dx ∆x ∆x→0
Derivativ kedua adalah slope dari slope, yaitu
f ' ' ( x) =
dy ' d 2 f ( x) f ' ( x + dx ) − f ' ( x) f ' ( x + ∆x ) − f ' ( x ) = = = lim 2 ∆x→0 dx dx dx ∆x
atau
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
f ' ' ( x) =
dy ' d 2 f ( x) f ( x + 2 * dx) − 2 * f ( x + dx) + f ( x ) = = 2 dx dx dx 2
f ' ' ( x) =
dy ' d 2 f ( x) f ( x + 2 * ∆x ) − 2 * f ( x + ∆x ) + f ( x) = = lim 2 2 dx ∆x →0 dx ∆x
dengan cara backward maka persamaan untuk slope garis tangent pada titik [x,f(x)] adalah
f ' ( x) =
dy df ( x) f ( x ) − f ( x − dx) f ( x) − f ( x − ∆x) = = = lim ∆x→0 dx dx dx ∆x
Derivativ kedua adalah slope dari slope, yaitu
f ' ' ( x) =
dy ' d 2 f ( x ) f ' ( x ) − f ' ( x − dx) f ' ( x ) − f ' ( x − ∆x ) = = = lim 2 ∆x→0 dx dx dx ∆x
dengan cara central maka persamaan untuk slope garis tangent pada titik [x,f(x)] adalah
f ' ( x) =
dy df ( x ) f ( x + dx) − f ( x − dx) f ( x + ∆x ) − f ( x − ∆x ) = = = lim ∆x→0 dx dx 2 * dx 2 * ∆x
Derivativ kedua adalah slope dari slope, yaitu
dy ' d 2 f ( x) f ' ( x + dx) − f ' ( x − dx) f ' ( x + ∆x) − f ' ( x − ∆x) f ' ' ( x) = = = = lim 2 ∆x→0 dx dx 2 * dx 2 * ∆x Contoh problem kimia Menghitung harga ∆S dan ∆Cp pada kesetimbangan elektrokimia dengan rumus ∂E ∆S = nF ∂T p ∂2 E ∆C p = nFT 2 ∂T p
dimana n adalah bilangan muatan, F adalah konstanta Faraday, dan E adalah fungsi temperatur, misalnya E = 0,23659 – 4,8564 x 10-4 t – 3,4205 x 10-6 t2 + 5,869 x 10-9 t3
Jawaban Jika diketahui n = 1, F = 86485, dipakai dt = 0,1 dan temperatur pada 250 C maka hitungan secara numerik menghasilkan nilai (∂E/∂T)p Forward
= -6.4595860067 x 10-04
nilai (∂2E/∂T2)p Forward
= -6.4536253376 x 10-04
nilai (∂2E/∂T2)p Backward =
= -6.4566056722 x 10-04
nilai (∂2E/∂T2)p Central
=
-5.9571220845 x 10-06 nilai (∂E/∂T)p Backward -5.9641934058 x 10-06 nilai (∂E/∂T)p Central
=
-5.9606634295 x 10-06 kemudian dengan cara Central dihasilkan
∆S ∆Cp
= -62.2966 = -171.3842
Sedangkan secara analitik menghasilkan harga yang hampir sama yaitu
∆S
= -62.297
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
∆Cp
= -171.4 (Alberty, 1987 : 259).
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
PROGRAM 3 DIFERENSIASI NUMERIK DAN GRAFIK FUNGSI Tempatkan komponen-komponen berikut ini pada form :
Objek StaticText1 StaticText2 StaticText3 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Edit1 Edit2 Edit3 Edit4 Edit5 Edit6 Edit7 Edit8 Edit9 Edit10 Button1 Button2 Button3 Button4
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text Text Text Text Text Text Text Text Text Caption Caption Caption Caption
Nilai properti DIFERENSIASI NUMERIK Input Output T Celc E(t) dEf d2Ef dEb d2Eb dEc d2Ec dS dCp (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) Hitung Ulang Grafik Keluar
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
RadioButton1 RadioButton2 Chart1
Caption Caption Series1 Titles Axis Panel
Garis Bar Pilih : Line Ketik : GRAFIK FUNGSI Bagian foot, ketik : X Bagian title, ketik : Y Aktifkan gradient, pilih warna yang disukai
Tuliskan kode kejadian komponen pada jendela unit editor : unit uderiv; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit; StaticText1: TStaticText; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Chart1: TChart; Series1: TLineSeries; RadioButton1: TRadioButton; RadioButton2: TRadioButton; Series2: TAreaSeries; StaticText2: TStaticText; Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
StaticText3: TStaticText; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Const n = 1; F = 96485; dt = 0.1; Var tc,Tk,dS,dCp : real; Form1: TForm1; i : integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); Function E(tc:real):real; begin E := 0.23659-4.8564e-4*tc-3.4205e-6*tc*tc+5.869e-9*tc*tc*tc; end; Function dEf(tc:real):real; begin dEf := (E(tc+dt)-E(tc))/dt; end; Function d2Ef(tc:real):real; begin d2Ef := (dEf(tc+dt)-dEf(tc))/dt; end; Function dEb(tc:real):real; begin dEb := (E(tc)-E(tc-dt))/dt; end; Function d2Eb(tc:real):real; begin d2Eb := (dEb(tc)-dEb(tc-dt))/dt; end;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Function dEc(tc:real):real; begin dEc := (E(tc+dt)-E(tc-dt))/(2*dt); end; Function d2Ec(tc:real):real; begin d2Ec := (dEc(tc+dt)-dEc(tc-dt))/(2*dt); end; begin if edit1.Text =' ' then messagedlg('Data belum diisi',mtError,[mbok],0) else begin tc := strtofloat(edit1.Text); dS := n*F*dEc(tc); Tk := tc + 273; dCp := n*F*Tk*d2Ec(tc); edit2.Text := floattostr(E(tc)); edit3.Text := floattostr(dEf(tc)); edit4.Text := floattostr(d2Ef(tc)); edit5.Text := floattostr(dEb(tc)); edit6.Text := floattostr(d2Eb(tc)); edit7.Text := floattostr(dEc(tc)); edit8.Text := floattostr(d2Ec(tc)); edit9.Text := floattostr(dS); edit10.Text := floattostr(dCp); edit1.SetFocus; end; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text := ' '; edit2.Text := ' '; edit3.Text := ' '; edit4.Text := ' '; edit5.Text := ' '; edit6.Text := ' '; edit7.Text := ' '; edit8.Text := ' '; edit9.Text := ' '; edit10.Text := ' '; edit1.SetFocus; end; procedure TForm1.Button4Click(Sender: TObject); begin if messageDlg ('Yakin akan keluar?',mtConfirmation,mbOkCancel,0) = mrOk then Application.Terminate;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
end; procedure TForm1.Button3Click(Sender: TObject); var i : integer; Function Ei(i:integer):real; begin Ei := 0.23659-4.8564e-4*i-3.4205e-6*i*i+5.869e-9*i*i*i; end; begin series1.Clear; series2.Clear; if edit1.Text =' ' then messagedlg('Data belum diisi',mtError,[mbok],0) else begin for i := 1 to 2*strtoint(edit1.text) do if radiobutton1.Checked then begin series1.add(Ei(i)) end else if radiobutton2.Checked then begin series2.add(Ei(i)); end; end; end; procedure TForm1.RadioButton1Click(Sender: TObject); begin radiobutton1.checked:=true; radiobutton2.checked:=false; end; procedure TForm1.RadioButton2Click(Sender: TObject); begin radiobutton2.checked:=true; radiobutton1.checked:=false; end; end.
Hasil Running :
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
AKAR PERSAMAAN
Suatu persamaan linier sederhana atau persamaan kuadratik dapat dengan mudah diselesaikan secara analitik. Begitu pula persamaan aljabar derajat 3 atau 4 mungkin dapat diselesaikan secara analitik, hanya saja diperlukan rumus yang kompleks. Untuk persamaan yang kompleks lebih disukai penyelesaiannya menggunakan metode numerik. Persamaan berikut tidak dapat diselesaikan dengan mudah secara analitik
x 6 + 4 x 5 − 5 x 4 + x 3 − 3 x 2 − 9 x + 11 = 0
begitu pula persamaan berikut ini
x 2 = sin x
Beberapa tipe persamaan di bawah ini dapat diselesaikan menggunakan metode numerik Persamaan aljabar x 7 + 3 x 4 − 8 x 2 − 17 x + 1 = 0 Persamaan transendental
10 x 2 = e x
Fungsi implisit
e −( x
2 +z2 )
2
= x 2 z + z 2 x3
Untuk penyelesaian maka tiga tipe persamaan tersebut ditransformasi dalam bentuk ternormalisasi
f ( x) = 0
2
f ( x) = 10 x 2 − e x = 0 f ( x) = e −( x
2 +z 2 )
− x 2 z − z 2 x3 = 0
Ungkapan fungsi implisit dianggap sebagai suatu fungsi f(x); z ditentukan sebagai suatu parameter dengan harga yang ditentukan. Kemudian ungkapan tersebut hanyalah suatu fungsi terhadap x. Fungsi dapat memiliki satu atau lebih harga nol atau tidak sama sekali. Problem umum diperlakukan dengan transformasi sederhana untuk menentukan akar-akar fungsi y = f(x). Metode Newton Metode Newton (beberapa buku menyebut metode Newton-Raphson) untuk penentuan akar mungkin metode yang paling dikenal dalam mencari harga nol suatu fungsi. Agar lebih mudah dipahami metode ini dapat dijelaskan dengan gambar berikut.
f(x) Y f(xi)
f(xi+1) akar
f(xi+2) f(xi+3)
Xi+3
Xi+2
Xi+1
Xi
X
Gambar 1 Ekstrapolasi metode Newton dengan tangent lokal untuk mencari estimasi akar fungsi berikutnya Diasumsikan titik nol berharga Xi sebagai titik awal. Pertama, harga fungsi yang bersesuaian f(xi) dihitung. Kemudian harga tangent pada posisi tersebut sampai grafik fungsi dihitung dan titik interseksi tangent
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 ini dengan sumbu x ditentukan. Titik interseksi ini ditentukan sebagai harga x baru yaitu Xi+1 dalam mencari harga nol dan penghitungan diulangi dengan akar estimasi baru ini seperti hitungan sebelumnya. Derivatif df(xi) / dx pada posisi xi sama dengan tangent di xi sampai grafik fungsi. Jika segitiga antara f(xi), xi dan xi+1 diperhatikan maka diperoleh
df f ( xi ) ( xi ) = f ' ( xi ) = dx xi − xi +1 Suatu hasil transformasi sederhana dalam instruksi untuk prosedur iterasi metode Newton adalah
xi − xi +1 =
f ( xi ) f ' ( xi )
xi +1 = xi −
f ( xi ) f ' ( xi )
Rumus menunjukkan bahwa untuk setiap iterasi harga fungsi f(xi) dan f’(xi) diperlukan. Agar lebih jelas algortima metode Newton perhatikan diagram alir berikut Start
input harga awal x
menghitung f(x) dan f’(x)
Xbaru = X –[f(x)/ f’(x)]
X = Xbaru
apakah |Xbaru - X | < ε
no
yes Output akar f
(x) Stop Gambar 2 Diagram alir untuk metode Newton Metode Secant Pada intinya metode Secant untuk menyelesaikan f (x) mencoba mengatasi kelemahan metode Newton dengan menggantikan garis singgung (tangent) f ‘(x) kurva y = f (x) pada (xr, f (x)) dengan garis potong (secant) melalui titik pada kurva di xi-1 dan xi. Karena itu derivativ digantikan dengan rasio selisih tertentu ∆y/∆x yang seringnya lebih mudah untuk dihitung. Rasio ∆y/∆x didefinisikan sebagai
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 ∆y = f ( x ) − f (x ) i −1 i ∆x = x −x i −1 i
dan estimasi xi+1 baru dihitung dari bentuk modifikasi persamaan metode Newton sebagai berikut ∆x xi +1 = xi − f ( xi ) ∆y
xi −1 − xi xi +1 = xi − f ( xi ) f (x ) − f (x ) i −1
i
xi −1 − xi xi +1 = xi − f ( xi ) f (x ) − f (x ) i −1
i
xi − xi −1 xi +1 = xi − f (x ) − f (x i
i −1
)
f ( xi )
Salah satu kelemahannya adalah membutuhkan 2 titik awal yaitu (xo,f(xo)) dan (x1,f(x1)) untuk memberi titik awal rasio ∆y/∆x. Contoh problem kimia 1.
Hitunglah volume spesifik dari pemanasan uap pada 100 atm dan 350 0C menggunakan persamaan keadaan Van der Waals
(p+
a )(V − b) = RT V2
dimana a=
27 R 2Tc 2 ( m 3 ) 2 atm /( kg.mol ) 2 64 pc
b=
RTc ( m 3 / kg.mol ) 8 pc
R = 8.314 (Joule/mol.K) Tc = 647,3
pc = 218,0
T = 623,0
p = 100
Jawaban Penyusunan kembali persamaan dalam bentuk polinomial f (V ) = pV 3 −(bp + RT )V 2 +aV −ab = 0
Turunan pertama dari persamaan ini f ' (V ) =3 pV 2 −2(bp +RT )V +a = 0
untuk mengurangi iterasi, perkiraan awal dibuat menggunakan hukum gas ideal
V0 = RT p = 51,7962 f (51,796) = 100 (51,796)3 − (3,0858 x 100 + 8,314 x 623) x (51,796)2 + 56047,7975 x 51,796 − 172952,8399
f ‘ (51,796) = 3 x 100 (51,796)2 − 2 x (3,0858 x 100 + 8,314 x 623) x 51,796 + 56047,7975 Dengan menggunakan metode Newton (Newton-Raphson) perkiraan selanjutnya didasarkan pada slope fungsi ini yang diilustrasikan sebagai f (V ) Vn +1 = Vn − f '(Vn ) n Hasil akhir diperoleh volume spesifik sebesar 42,7063 m3/kg
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 2.
Suatu elektrolit lemah K2A berdisosiasi menjadi 3 ion K2A === 2K+ + A2Konstanta kesetimbangannya Kc dapat dituliskan sebagai berikut 4α 3c02 Kc = 1−α Hitung derajat disosiasi α jika diketahui Kc = 0.01 dan co = 0,001 !
Jawaban Penyusunan ulang persamaan 4α3c0 2 Kc = 1 −α f (α) = 4α3c0 2 − K c (1 −α) = 0 f (α) = 4c0 2α3 + K cα − K c = 0 Turunan pertama dari persamaan ini f ' (α ) = 12c0 2α 2 + K c = 0 Perkiraan awal (αo) dapat diambil harga nol, kemudian harga f (α) dan f’ (α) dihitung dan dimasukkan dalam rumus iterasi Newton (Newton-Raphson) f (α ) α n +1 = α n − f '(αn ) n Hasil akhir dengan ketelitian 0,000001 diperoleh harga derajat disosiasi sebesar 0,9996004792.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
PROGRAM 4 AKAR PERSAMAAN NUMERIK DAN GRAFIK FUNGSI
Tempatkan komponen-komponen pada form dan ubahlah propertiesnya sebagai berikut :
Objek StaticText1 StaticText2 StaticText3 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Edit1 Edit2 Edit3 Edit4 Edit5 Button1 Button2 Button3 Button4
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text Text Text Text Caption, Name Caption, Name Caption, Name Caption, Name
Nilai properti AKAR PERSAMAAN Input Output T kritis P kritis Tekanan Temperatur V estimasi Awal Akhir (kosong) (kosong) (kosong) (kosong) (kosong) Hitung Grafik Ulang Keluar
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Memo1 Memo2 Chart1
Lines Lines Series1 Titles Axis Panel
(kosong) (kosong) Pilih : Area Ketik : AKAR PERSAMAAN Bagian foot, ketik : X Bagian title, ketik : Y Aktifkan gradient, pilih warna yang disukai
unit uakar; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series; type TForm1 = class(TForm) StaticText1: TStaticText; StaticText2: TStaticText; StaticText3: TStaticText; StaticText4: TStaticText; StaticText5: TStaticText; StaticText6: TStaticText; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; StaticText7: TStaticText; StaticText8: TStaticText; Edit5: TEdit; Memo1: TMemo; Chart1: TChart; Hitung: TButton; Grafik: TButton; Keluar: TButton; Memo2: TMemo; StaticText9: TStaticText; StaticText10: TStaticText; Ulang: TButton; Series1: TAreaSeries; procedure HitungClick(Sender: TObject); procedure KeluarClick(Sender: TObject); procedure GrafikClick(Sender: TObject); procedure UlangClick(Sender: TObject); private { Private declarations } public
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
{ Public declarations } end; Const dx = 0.001; presisi = 1e-5; {epsilon} R = 8.314; Var
p, T, pc, Tc, a, b, awal, akhir,Va,Vb n
: extended; : integer;
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.HitungClick(Sender: TObject); function f(x : extended) : extended; begin f :=(p*x*x*x)-((b*p+R*T)*x*x)+(a*x)-(a*b); end; Function df(x : extended) : extended; begin df := (f(x+dx) - f(x-dx))/(2*dx); end; Procedure Hitung_abVa; begin a := (27*sqr(R)*sqr(Tc))/(64*pc); b := (R*Tc)/(8*pc); Va := (R*T)/p; end; Procedure Newton(var Va,Vb : extended); begin Vb := Va - (f(Va)/df(Va)); awal := Va; akhir := Vb; Va := Vb; end; begin if edit1.Text =' ' then messagedlg('Data belum diisi',mtError,[mbok],0) else begin Tc := strtofloat(edit1.Text); pc := strtofloat(edit2.Text); p := strtofloat(edit3.Text); T := strtofloat(edit4.Text);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Hitung_abVa; edit5.Text := floattostr(Va); n := 1; repeat Newton(Va,Vb); Memo1.Lines.Add(floattostr(awal)); Memo2.Lines.Add(floattostr(akhir)); inc(n,1); until abs(akhir-awal) < presisi; edit1.SetFocus; end; edit1.SetFocus; end; procedure TForm1.KeluarClick(Sender: TObject); begin Application.Terminate; end; procedure TForm1.GrafikClick(Sender: TObject); var n : integer; function fn(n : integer) : extended; begin fn :=(p*n*n*n)-((b*p+R*T)*n*n)+(a*n)-(a*b); end; begin series1.Clear; if edit1.Text ='' then messagedlg('Data belum diisi',mtError,[mbok],0) else begin for n := -100 to 100 do begin series1.add(fn(n)); end; end; edit1.SetFocus; end; procedure TForm1.UlangClick(Sender: TObject); begin edit1.Text := ' '; edit2.Text := ' '; edit3.Text := ' '; edit4.Text := ' '; edit5.Text := ' '; memo1.Clear; memo2.Clear; edit1.SetFocus;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
end; end. Hasil Running
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
INTEGRASI NUMERIK Dalam kimia sering dihadapkan pada problem suatu fungsi f (x) yang merepresentasikan laju perubahan suatu kuantitas terhadap suatu variabel. Suatu bentuk fungsi f ( x) =
dF ( x ) dx
yang merupakan proses kerja balik dari derivativ f (x) menjadi fungsi F (x) dikenal sebagai integrasi. Untuk suatu bentuk fungsi sederhana mungkin dapat diselesaikan dengan cara analitik, tetapi fakta empirik maupun teroretik dalam problem bidang kimia, khususnya kimia fisika teoretis, seringkali tidak memiliki integral analitik. Karena itu alternatif terbaik adalah menggunakan cara integrasi numerik. Secara prinsip grafik menghitung integrasi suatu fungsi berarti menghitung luas di bawah kurva fungsi f (x) diantara titik awal sampai titik akhir. Konsekuensi dari prinsip sederhana ini maka banyak cara untuk menghitung luas di bawah kurva. Untuk selanjutnya akan dibahas beberapa cara integrasi yang dikenal.
Metode Euler (Aturan Trapezoid) Prinsip metode integrasi Euler adalah menghitung luas di bawah kurva dengan rumus trapesium
f(X4) f(X3) f(X2)
f(x)
f(X1) f(Xo) Xo
X1
X2
X3
X4
Gambar 4.3 Grafik fungsi metode Euler Sebagai contoh pada batas X0 sampai X4 dibagi menjadi 4 bagian yang besarnya sama, ∆X. Tampak pada grafik ∆X = X1 – X0 = X2 – X1 = X3 – X2 = X4 – X3 Pada grafik terlihat ada luas bagian atas (La) dan luas bagian bawah (Lb), masing-masing dihitung secara terpisah. Lb = f ( xo ).∆x + f ( x1 ).∆x + f ( x2 ).∆x + f ( x3 ).∆x La = ................... f ( x1 ).∆x + f ( x 2 ).∆x + f ( x3 ).∆x + f ( x4 ).∆x
Harga luas yang benar didekati dengan menghitung rata-rata La dan Lb. Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Luas ≈ L =
( Lb + La ) 2
f (x ) f (x ) L = 2 o + f ( x1 ) + f ( x2 ) + f ( x3 ) + 2 4 .∆ x
atau L=
∆x 2
( f ( xo ) + 2 f ( x1 ) + 2 f ( x2 ) + 2 f ( x3 ) + f ( x4 ) ).
Rumus untuk n bagian
L = ∆2x ( f ( xo ) + 2 f ( x1 ) + 2 f ( x 2 ) + 2 f ( x3 ) + ..... + 2 f ( xn −1 ) + f ( xn ) ).
Metode Simpson (Aturan Parabola) Prinsip metode integrasi Euler adalah menghitung luas suatu trapezoid sebagai suatu penaksiran integral atas suatu subinterval. Dalam metode Simpson dua subinterval digabung, dan luas tidak ditaksir dengan 2 trapezoid tetapi dengan luas di bawah parabola.
f (x)
Xo
X1 X2 X3 X4 X5X6X7 X8X9 Xn
Gambar 4.4 Grafik fungsi integral antara Xo dan Xn menggunakan metode Simpson Dalam contoh ini interval integrasi (Xo, Xn) dibagi menjadi 10 subinterval. Panjang ∆X subinterval adalah x − xo ∆x = n n
n = jumlah subinterval
Dalam kasus kurva dalam interval (Xo, X2) adalah grafik parabola, maka luas di bawah kurva dapat diungkapkan sebagai berikut L = ∆3x ( f ( xo ) + 4 f ( x1 ) + f ( x2 ))
Jumlahkan semua subinterval maka diperoleh rumus berikut
L=
∆x 3
( f ( xo ) + 4 f ( x1 ) + 2 f ( x2 ) + 4 f ( x3 ) + 2 f ( x4 ) + 4 f ( x5 ) + 2 f ( x6 ) + 4 f ( x7 ) + 2 f ( x8 ) + 4 f ( x9 ) + f ( x10 ))
Jika integral tertentu dengan interval (Xo, Xn) untuk suatu fungsi yang berubah-ubah tajam maka metode Simpson memerlukan interval yang dibagi menjadi 2n subinterval sehingga diperoleh rumus
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 n n L2n = ∆6nx f ( xo ) + f ( x2n ) + 4 ∑ f ( x2i −1 ) + ∑ f ( x2i ) i =1 i =1
Contoh problem kimia 1. Kapasitas panas molar pada volume konstan untuk O2 (g) diberikan sebagai berikut Cv =17,23 +13,61.10 −3 T −42,55.10 −7 T 2 (J/K-1 mol-1) Berapakah perubahan energi dalam jika satu mol oksigen dipanaskan dari 298 K sampai 500 K ?
Jawaban Secara analitik : 500 ∆U = ∫298 Cv dT = 4437 (J/mol)
Secara numerik menggunakan metode Euler :
∆U = 4439 (J/mol) Secara numerik menggunakan metode Simpson :
∆U = 4437,6413 (J/mol) Tampak hitungan menggunakan metode Simpson lebih mendekati hitungan eksak secara analitik daripada hitungan menggunakan metode Euler. 2. Periksalah harga fungsi error untuk x = 0 sampai x = 1 dengan interval 0,1 dengan menggunakan metode Euler dan Simpson. Bandingkan dengan harga pada tabel di buku teks (Castellan, 1983 : 65) ! Rumus : erf ( x) =
2 x −x 2 dx ∫e
π
0
Jawaban Contoh hasil komputasi metode Euler : x 0,1 0,2 0,3
Jumlah iterasi 16000 32000 32000
Step
Harga erf(x)
Erf(x) tabel
0,00000625 0,00000625 0,000009375
0,1124698982 0,2227093651 0,3286364275
0,112 0,223 0,329
Harga erf(x)
Erf(x) tabel
Contoh hasil komputasi metode Simpson : x
Jumlah iterasi
Step
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
0,1 0,2 0,3
4 4 4
0,025 0,025 0,075
0,1124629189 0,2227026774 0,3286273768
0,112 0,223 0,329
Perhatikan ! Sangat tajam sekali perbedaan kecepatan dan ketepatan metode Euler dengan Simpson.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
PROGRAM 5 INTEGRASI NUMERIK Tempatkan komponen-komponen pada form seperti berikut ini kemudian ubah nilai propertinya.
Objek StaticText1 StaticText2 StaticText3 StaticText4 StaticText5 StaticText6 Button1 Button2 Button3 Button4 Edit1 Edit2 Edit3 Memo1 Memo2 Chart
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text Text Lines Lines Series1 Titles Axis Panel
Nilai properti INTEGRASI NUMERIK BATAS AWAL BATAS AKLHIR JUMLAH ITERASI BAGIAN HASIL HITUNG GRAFIK ULANG KELUAR (kosong) (kosong) (kosong) (kosong) (kosong) Pilih : Area Ketik : GRAFIK INTEGRASI NUMERIK Bagian foot, ketik : X Bagian title, ketik : Y Aktifkan gradient, pilih warna yang disukai
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Tuliskan kode kejadian untuk masing-masing komponen seperti berikut pada jendela unit editor : unit uintegrasi; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series, Buttons; type TForm1 = class(TForm) StaticText1: TStaticText; StaticText2: TStaticText; StaticText3: TStaticText; StaticText4: TStaticText; StaticText5: TStaticText; StaticText6: TStaticText; Memo1: TMemo; Memo2: TMemo; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Chart1: TChart; Series1: TLineSeries; Hitung: TBitBtn; Grafik: TBitBtn; Ulang: TButton; Keluar: TButton; procedure HitungClick(Sender: TObject); procedure UlangClick(Sender: TObject); procedure GrafikClick(Sender: TObject); procedure KeluarClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; t0, tf, h, sum : real; N : integer; implementation {$R *.dfm} procedure TForm1.HitungClick(Sender: TObject);
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
function y(x : real):real; begin y := 17.23 + 13.61E-3*x - 42.55E-7*x*x; end; procedure Integrasi_Euler; var h, x : real; i : integer; begin sum := 0; h := (tf-t0)/N; x := t0; sum := sum + y(x)/2; for i := 1 to N-1 do begin x := t0 + i*h; sum := sum + y(x); end; x := tf; sum := sum + y(x)/2; sum := sum*h; Memo1.Lines.Add(Inttostr(N)); Memo2.Lines.Add(floattostr(sum)); end; begin Memo1.Clear; Memo2.Clear; Series1.Clear; Edit1.SetFocus; t0:= strtofloat(edit1.Text); tf:= strtofloat(edit2.Text); N:= strtoint(edit3.Text); Integrasi_Euler; Edit1.SetFocus; end; procedure TForm1.UlangClick(Sender: TObject); begin Memo1.Clear; Memo2.Clear; Series1.Clear; Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit1.SetFocus;
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
end; procedure TForm1.GrafikClick(Sender: TObject); var i : integer; function yi(i : integer) : extended; begin yi := 17.23 + 13.61E-3*i - 42.55E-7*i*i; end; begin series1.Clear; if edit1.Text ='' then messagedlg('Data belum diisi',mtError,[mbok],0) else begin for i := 0 to N do begin series1.add(yi(i)); end; end; edit1.SetFocus; end; procedure TForm1.KeluarClick(Sender: TObject); begin Application.Terminate; end; end.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
4.5 PENYELESAIAN NUMERIK PERSAMAAN DIFERENSIAL ORDINER Banyak penomena eksperimental dalam kimia dapat digambarkan dengan persamaan diferensial. Contohnya dalam aliran aliran panas, ekspansi suatu gas, kristalisasi suatu padatan dan tentunya reaksi kimia. Persamaan diferensialnya berbentuk
dny dx n
= y ( n) = f ( x, y , y (1) , y ( 2) ,..., y ( n −1) )
Dalam problem kinetika kimia misalnya reaksi order pertama konsekutif k1
k2
A
B
C
Untuk penyelesainnya maka diubah dalam bentuk persamaan diferensial d [ A] dt d [ B] dt d [C ] dt
= −k1[ A] = k1[ A] −k 2 [ B ] = k 2 [ B]
Persamaan diferensial dapat diselesaikan secara analitik sebagai berikut [ A] = [ A]o e −k1t k [ A] [ B ] = ( k1 −ko) (e −k1t − e −k2t ) 2 1 [C ] = [ A]o 1 + ( k −1k ) (k 2 e −k1t − k1e −k2t ) 1 2
Untuk mendapatkan penyelesaian seperti ini memerlukan kemampuan manipulasi matematika yang tinggi. Penyelesaian secara analitik sangat sulit dipakai untuk memecahkan problem reaksi kimia yang kompleks, padahal faktanya sebagian besar reaksi kimia merupakan reaksi kompleks. Karena itulah sangat baik dipakai metode numerik untuk menyelesaikan persamaan diferensial yang kompleks.
4.5.1 Metode Euler Perhatik an suatu persamaan diferensial
dy = f ( x. y ) dan harga awal dx
y (a) = ya. Dalam bentuk
umum sisi sebelah kanan persamaan diferensial adalah fungsi 2 variabel yaitu variabel bebas x dan variabel tergantung y. Untuk menyelesaikan persamaan diferensial ini berarti harus dicari suatu fungsi y = g(x) yang memenuhi persamaan diferensial dan kondisi awal sekaligus Sebagai contoh : dy = x. y dengan harga awal y(0) = 1 dx
Penyelesaiannya adalah :
1 2
y = g(x) = e 2 x
Apabila dikehendaki penyelesaian untuk x = 1 maka dengan menggunakan fungsi g(x) untuk menghitung g(1) akan diperoleh y = 1,648721. Hasil ini diperoleh menggunakan suatu fungsi analitik karena persamaan diferensial di atas termasuk sederhana. Untuk penyelesaian persamaan diferensial komplek maka umumnya menggunakan metode numerik.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Langkah pertama untuk memahami metode numerik Euler adalah penaksiran persamaan diferensial dengan suatu persamaan perbedaan dari
y' =
dy = f ( x. y ) dx
diperole h ∆y ∆x
≈ f ( x, y )
dengan susun ulang persamaan diferensial di atas maka diperoleh rumus ∆y ≈ f ( x, y ).∆x
Dalam bentuk iterasi diubah menjadi yi +1 = yi + h. f ( xi , yi )
dimana h = ∆x = ukuran step. Hitungan numerik berawal pada xo dimana y = yo dan berlanjut secara bertahap seperti contoh di bawah ini harga awal
yo
xo
step 1 y1 = yo + ∆x . f (xo,yo)
x1 = xo + ∆x
step 2 y2 = y1 + ∆x . f (x1,y1)
x2 = x1 + ∆x
step 3 y3 = y2 + ∆x . f (x2,y2)
x3 = x2 + ∆x
dan seterusnya. Kesalahan hitung akan semakin kecil apabila harga ∆x semakin kecil. Dalam berbagai teks diperoleh bukti bahwa kesalahan hitung proporsional dengan ukuran step kesalahan ∼ ∆x Seperti halnya prosedur Euler dalam integrasi maka tidak ada kriteria terprogram untuk terminasi program dan perulangan tanpa batas digunakan untuk menghitung lagi dan lagi sampai didapat hasil yang lebih tepat melalui penambahan yang kecil. Metode Euler menentukan penaksiran yi+1 ke xi+1 dengan menggunakan garis slope f (xi,yi) dari titik (xi,yi) hal ini dapat mengarah kepada kesalahan yang besar jika ukuran step relatif terlalu besar. Satu cara untuk memperbaiki metode Euler sederhana adalah menemukan cara terbaik
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
untuk memilih arah darimana suatu penyelesaian penaksiran bergerak dari suatu titik (xi,yi). Suatu metode satu tahap mempunyai bentuk
x = xo y = yo yi +1 = yi + hΦ( xi , yi ; h)
Fungsi Φ(xi,yi;h) memprediksi arah dimana penyelesaian berawal pada titik (xi,yi). Sebagai ganti penaksiran Euler sederhana yi +1 = yi + h. f ( xi , yi ) sebagai penaksiran ke xi+1 maka kita dapat meletakkan satu titik lain dekat lintasan xi dan menentukan estimasi slope Φ menjadi rata-rata slope pada (xi,yi) dan (xi+1,yi+1). Dengan cara ini diperoleh metode Euler Modifikasi x = xo y = yo m1 = f ( xi , yi ) m2 = f ( xi +1 , yi + hm1 ) m +m yi +1 = yi + h 1 2 2
atau yi +1 = yi +
h ( m1 + m2 ) 2
Dalam Euler Modifikasi ada 2 step yaitu step prediktor dan korektor Step : yi+1 =
prediktor yi + h.m1
Step :
korektor yi +1 = yi +
h ( m1 + m2 ) 2
Jika prosedur prediktor-korektor sederhana ini digunakan maka kesalahan hitungan akan berkurang dengan berkurangnya ukuran step h, perbaikan ini tidak hanya proporisonal terhadap h tetapi juga kesalahan adalah fungsi h3. kesalaha 3 n ∼ h
4.5.2 Metode Runge-Kutta Orde 4 Metode numerik Runge-Kutta Orde 4 (RK4), disebut juga Runge-Kutta-Nystroem (RKN), sering dipakai untuk menyelesaikan problem-problem sains, akan dijelaskan di sini tanpa bukti-bukti matematika. Metode RK4 ini reliabel, baik dan tidak terlalu sulit untuk diprogram. Metode RK4 ini termasuk self-starting (dapat memulai sendiri tanpa bantuan metode lain), dan manfaat lain, berguna untuk untuk memulai metode numerik lain yang lebih komples dan canggih. Metode RK4 mirip dengan metode Euler tetapi dengan besar kesalahan yang makin kecil
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
kesalaha n ∼ h4 Algoritma (alur pikir) RK4 membutuhkan 4 besaran yaitu m1, m2, m3, dan m4. Perhatikan suatu persamaan diferensial berikut dy = y ' = f ( x, y ) dx
Penghitungan titik penyelesaian selanjutnya (xi+1,yi+1), dimulai dengan (xi,yi) dikerjakan menggunakan skema berikut
m1 = h. f ( xi , yi ) h m1 , yi + ) 2 2 h m2 m3 = h. f ( xi + , yi + ) 2 2 m4 = h. f ( xi + h, yi + m3) m2 = h. f ( xi +
xi +1 = xi + h 1 yi +1 = yi + .( m1 + 2m 2 + 2m3 + m 4) 6
Contoh problem kimia 1. Konstanta dekomposisi kd suatu zat A selama suatu dekomposisi radiolitik diasumsikan proporsional dengan intensitas radiasi D ( kd = koD). Persamaan diferensialnya d [ A] dt
= −k d .[ A] = −ko.D.[ A]
Intensitas radiasi D berkurang sesuai dengan hukum waktu eksponensial D = Do.e−kt Harga parameternya diasumsikan k = 0,001 s−1 Do.ko = 0,001 s−1 Jika harga ini digunakan akan diperoleh persamaan diferensial berikut d [ A] dt
= −0,001.e −0,001.t .[ A]
Persamaan diferensial ini dapat diselesaikan menggunakan metode Euler atau Runge-Kutta Orde 4. Hasil hitungan
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
menggunakan 2 metode itu pada keadaan to = 0, takhir = 1, jumlah iterasi = 100, dan [A]o = 0,1 sebagai berikut Euler : 0,0999000989 Euler Modifikasi : 0,0999000999 Runge-Kutta : 0,0999000999 Penyelesaian analitik problem ini sebagai berikut [ A]o ko. Do = k . 1 − e −kt log [ A ] ko . Do [ A]o .(1−e − kt ) = 10 k [ A]
(
[ A] =
)
[ A ]o ko . Do . 1− e − kt 10 k
Hasil hitungan secara analitik adalah 0,09977012120851. Jika dibandingkan dengan hasil metode Euler maka diperoleh selisih sebesar 0,000129977691487, atau % kesalahan sebesar 0,1302771710741 %.
4.5.3 Metode Euler dan Runge-Kutta Untuk Sistem Persamaan Diferensial Mekanisme reaksi sederhana berikut diasumsikan untuk aksi enzim E+S E+S
k1 → k2 → k3
ES ES ES →
P+E
Berdasarkan mekanisme reaksi tersebut dapat diturunkan suatu sistem persamaan diferensial sebagai berikut
d[E ] = −k1.[ E ].[ S ] + k 2.[ ES ] + k 3.[ ES ] dt d [ ES ] = +k1.[ E ].[ S ] − k 2.[ ES ] − k 3.[ ES ] dt d[S ] = −k1.[ E ].[ S ] + k 2.[ ES ] dt d [ P] = +k 3.[ ES ] dt
Jika sistem ini diperlakukan secara analitik maka akan diperoleh kinetika Michaelis-Menten. Contoh lain sistem persamaan diferensial adalah problem kinetika kimia misalnya reaksi order pertama konsekutif k1 A
k2 B
C
Untuk penyelesainnya maka diubah dalam bentuk persamaan diferensial
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1 d [ A] dt d [ B] dt d [C ] dt
= −k1[ A] = k1[ A] −k 2 [ B ] = k 2 [ B]
Sistem persamaan diferensial ini dapat diselesaikan menggunakan metode Euler, Euler Modifikasi maupun Runge-Kutta orde 4. Contoh mekanisme reaksi lain yang lebih kompleks adalah k1=1 A
M+M k2=10
A+M
B +C k3=4
C
M+D k4=20
M+M
E +C
Dari mekanisme ini dapat diturunkan sistem persamaan diferensial sebagai berikut d [ A] = −[ A] −10[ A][ M ] dt d[M ] = +2[ A] −10[ A][ M ] +4[C ] −40[ M ][ M ] dt d[ B] = +10[ A][ M ] dt d [C ] = +10[ A][ M ] −4[C ] +20[ M ][ M ] dt d [ D] = +4[C ] dt d[E] = +20[ M ][ M ] dt
Banyaknya fungsi yang dimiliki oleh metode numerik dalam program komputer adalah sebanyak persamaan diferensial yang terbentuk dari mekanisme reaksi. Untuk suatu sistem mekanisme reaksi yang sederhana atau agak kompleks mungkin dapat diselesaikan dengan metode numerik Euler dan modifikasinya ataupun Runge-Kutta orde 4, tetapi untuk suatu sistem yang sangat kompleks, yang melibatkan banyak tahapan dasar dalam mekanisme reaksinya, dan harga konstanta laju reaksi yang sangat besar, biasa disebut sebagai “stiff equations” (persamaan kaku), maka metode numerik biasa tidak dapat digunakan untuk menyelesaikan secara efektif dan efisien, bahkan mungkin akan menghasilkan penyimpangan yang besar. Untuk kasus persamaan diferensial yang kompleksitasnya sangat tinggi maka digunakan metode numerik khusus untuk “stiff equations”. Dikenal istilah “metode khusus untuk kasus khusus”.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
PROGRAM 6 PENYELESAIAN SISTEM PERSAMAAN DIFERENSIAL Tempatkan komponen-komponen pada form berikut : Objek Speedbutton1 Speedbutton2 Speedbutton3 Speedbutton4 Speedbutton5 Speedbutton6 Speedbutton7 Label1 Label2 Label3 Label4 Label5 Edit1 Edit2 Edit3 Edit4 Edit5 Edit6 Edit7 Panel1 Chart1
Panel2 Memo1 Memo2 GroupBox1 Radiobutton1 Radiobutton2 Radiobutton3 Radiobutton4 Bevel1 Bevel2 Bevel3
Properti Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Text Text Text Text Text Text Text Caption Series1 Titles Axis Panel Caption Lines Scroolbars Lines Scroolbars Caption Caption Caption Caption Caption Shape Shape Shape
Nilai properti REAKSI KONSEKUTIF: A ---> B ---> C KONSENTRASI AWAL KONSTANTA LAJU REAKSI SUMBU X ZAT HITUNG KELUAR ZAT A ZAT B ZAT C k-1 k-2 (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) (kosong) Pilih : Line Ketik : GRAFIK INTEGRASI NUMERIK Bagian foot, ketik : X Bagian title, ketik : Y Aktifkan gradient, pilih warna yang disukai (kosong) (kosong) ssBoth (kosong) ssBoth Display Grafik Digital EULER RUNGE-KUTTA4 bsBox bsTopLine bsBox
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Tuliskan kode kejadian pada unit editor seperti dibawah ini : unit Ueuler2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart; type TForm1 = class(TForm) SpeedButton1: TSpeedButton; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; Label4: TLabel; Edit4: TEdit; Label5: TLabel; Edit5: TEdit; SpeedButton4: TSpeedButton; Edit6: TEdit; SpeedButton5: TSpeedButton; Edit7: TEdit; Panel1: TPanel; Chart1: TChart; Series1: TLineSeries; Panel2: TPanel; Memo1: TMemo; Memo2: TMemo; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; Bevel1: TBevel; SpeedButton6: TSpeedButton; SpeedButton7: TSpeedButton; Bevel2: TBevel; RadioButton3: TRadioButton; RadioButton4: TRadioButton; Bevel3: TBevel; procedure SpeedButton6Click(Sender: TObject); procedure SpeedButton7Click(Sender: TObject); private { Private declarations }
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
public { Public declarations } end; Const dim=3; plot=1e-10; Type mat=array[1..dim] of real; Var i,j,N,zat : integer; t,h,t0,tf,k1,k2,k3,k4,k5 : real; y,y0,yt,yEuler,m1,m2,m3,m4 : mat; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.SpeedButton6Click(Sender: TObject); Function fx(i:integer; t: real; y: mat): real; Begin Case i of 1: fx := -k1*y[1]; 2: fx := +k1*y[1]-k2*y[2]; 3: fx := +k2*y[2]; end; end; Procedure Euler; var i: integer; Begin for i:= 1 to dim do m1[i]:= fx(i,t,y); for i:= 1 to dim do yEuler[i]:= y[i]+ (h*m1[i]); for i:= 1 to dim do m2[i]:= fx(i,t+h,yEuler); for i:= 1 to dim do y[i]:= y[i]+ 0.5*h*(m1[i]+m2[i]); for i:= 1 to dim do yt[i]:= y[i]+ j*plot; if radiobutton1.Checked = true then begin Panel2.Visible := false; Panel1.Visible := true; Memo1.Visible := false; Memo2.Visible := false; Chart1.Visible := true; series1.Add(yt[zat]); end; if radiobutton2.Checked = true then begin
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Panel1.Visible := false; Panel2.Visible := true; Series1.Clear; Chart1.Visible := false; Memo1.Visible := true; Memo2.Visible := true; if j <= N/2 then Memo1.Lines.Add(' '+inttostr(j)+'-->'+floattostr(yt[zat])) else Memo2.Lines.Add(' '+inttostr(j)+'-->'+floattostr(yt[zat])) end; t:= t0 + j*h; end; Procedure RungeKutta4; var i: integer; Begin for i:= 1 to dim do m1[i]:= fx(i,t,y); for i:= 1 to dim do yEuler[i]:= y[i]+ (h*m1[i]/2); for i:= 1 to dim do m2[i]:= fx(i,t+h/2,yEuler); for i:= 1 to dim do yEuler[i]:= y[i]+ (h*m2[i]/2); for i:= 1 to dim do m3[i]:= fx(i,t+h/2,yEuler); for i:= 1 to dim do yEuler[i]:= y[i]+ (h*m3[i]); for i:= 1 to dim do m4[i]:= fx(i,t+h,yEuler); for i:= 1 to dim do y[i]:= y[i]+ (h/6)*(m1[i]+2*m2[i]+2*m3[i]+m4[i]); for i:= 1 to dim do yt[i]:= y[i]+ j*plot; if radiobutton1.Checked = true then begin Panel2.Visible := false; Panel1.Visible := true; Memo1.Visible := false; Memo2.Visible := false; Chart1.Visible := true; series1.Add(yt[zat]); end; if radiobutton2.Checked = true then begin Panel1.Visible := false; Panel2.Visible := true; Series1.Clear; Chart1.Visible := false; Memo1.Visible := true; Memo2.Visible := true; if j <= N/2 then Memo1.Lines.Add(' '+inttostr(j)+'-->'+floattostr(yt[zat])) else Memo2.Lines.Add(' '+inttostr(j)+'-->'+floattostr(yt[zat]))
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
end; t:= t0 + j*h; end; begin series1.Clear; Memo1.Clear; memo2.Clear; Edit7.SetFocus; zat:= strtoint(edit7.Text); N:= strtoint(edit6.Text); t0:= 1; tf:= N; t := t0; y0[1]:= strtofloat(Edit1.Text); y0[2]:= strtofloat(Edit2.Text); y0[3]:= strtofloat(Edit3.Text); k1 := StrToFloat(Edit4.Text); k2 := StrToFloat(Edit5.Text); y:= y0; h:= (tf-t0)/N; for j := 1 to N do Begin if radiobutton3.Checked = true then Euler; if radiobutton4.Checked = true then RungeKutta4; end; Edit7.SetFocus; end; procedure TForm1.SpeedButton7Click(Sender: TObject); begin Close; end; end.
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Hasil Running untuk metode Euler dalam bentuk grafik
Hasil Running untuk metode Euler dalam bentuk digital
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes
1
Diktat Mata Kuliah Kimia Komputasi Jurusan Kimia FMIPA Unnes