I Wayan Sudiarta Metode Numerik 11.2 Metode Iterasi Agar lebih mudah dilihat, sistem persamaan linier di tuliskan kembali yaitu a1,1x1 + a1,2x2 + b1 ··· + a1,nxn = a2,1x1 + a2,2x2 + ··· + a2,nxn = b2 ... ... an,1x1 + an,2x2 + ··· + an,nxn =bn (11.16) Jika semua elemen diagonal, ai,i lebih dominan di bandingkan dengan elemen lainnya pada baris yang sama, kita dapat mengubah sistem persamaan ini men jadi, 1 x1 = [b1 − (a1,2x2 + ··· + a1,nxn)] a1,1 1 x2 = [b2 − (a2,1x1 + ··· + a2,nxn)] ... ... a2,2 1 xn = [bn − (an,1x1 + ··· + an,n−1xn−1)] (11.17) an,n Ini dapat dituliskan secara singkat dengan notasi vektor x = {x1,...,xn} menjadi berbentuk persamaan x = g(x) (11.18) dengan fungsi g(x) didefinisikan seperti di sisi kanan persamaan di atas. Perlu kita ingat bahwa persamaan 233 382
ini hampir sama dengan persamaan yang digunakan untuk solusi persamaan nonlinier dengan metode ite rasi titik tetap. Dengan metode iterasi titik tetap, persamaan itera sinya berbentuk berikut ini. x(k+1) = g(x(k)) (11.19) Agar lebih mudah mengerti metode iterasi titik te tap, kita perhatikan contoh sistem persamaan linier berikut ini. 4x + y − z = 1 x − 5y + z = 3 (11.20) (11.21) x + y + 2z = 2 (11.22) Perhatikan bagian diagonal persamaan di atas. Jika nilai diagonalnya lebih dominan di setiap baris, kita dapat menggunakan metode iterasi titik tetap seperti penyelesaian persamaan nonlinier. Sistem persamaan linier di atas diubah menjadi per samaan untuk metode solusi titik tetap seperti berikut ini. x = (11.23) y 1 4 (1 − y + z) 1 (25 (3−−x −x − z) 234 382 y) (11.24) z = − 1 2 (11.25)
I Wayan Sudiarta Metode Numerik Metode Jacobi Dengan metode Jacobi, dari persamaan (11.25) kita membuat rumus iterasi sebagai berikut: xk+1 = 1 (11.26) yk+1 4 (1 − yk + zk) 1 5 (3 − − xk − yk) xk zk) (11.27) zk+1 = = − 12(2 − (11.28) Untuk mengawali iterasi, kita dapat menggunakan nilai awal x0 = y0 = z0 = 0. Dengan menggunakan fa silitas program spreadsheet seperti MsExcel dihasilkan nilai-nilai untuk 10 iterasi diberikan pada Tabel 11.1. Metode Gauss-Seidel Sedikit berbeda dalam proses perhitungannya, kita membuat rumus iterasi Gauss-Seidel untuk persamaan (11.25) yaitu xk+1 = 1 4 (1 − yk + zk) (11.29) yk+1 (3 − xk+1 (11.30) 1 − zk 1 5 ) 2 (2 − xk+1 −−yk+1) zk+1 = = (11.31) Perbedaan metode Jacobi dengan metode Gauss Seidel adalah nilai yang digunakan untuk menghitung nilai iterasi berikutnya. Pada metode Gauss-Seidel, 235 382
Tabel 11.1: Hasil iterasi dengan metode iterasi Jacobi. k xk yk zk 0 0 0 0 1 0.25 -0.6 1 2 0.65 -0.35 1.175 3 0.63125 -0.235 0.85 4 0.52125 -0.30375 0.801875 5 0.52640625 -0.335375 0.89125 6 0.55665625 -0.31646875 0.904484375 7 0.555238281 -0.307771875 0.87990625 8 0.546919531 -0.312971094 0.876266797 9 0.547309473 -0.315362734 0.883025781 10 0.549597129 -0.313932949 0.884026631 nilai perhitungan bisa langsung digunakan tanpa me nunggu semua variabel sudah selesai dihitung seperti pada metode Jacobi. Dengan nilai awal yang sama seperti metode Jacobi dan menggunakan program spreadsheet diperoleh hasil nilai-nilai variabel x, y dan z untuk 10 iterasi ditam pilkan pada Tabel 11.2. Memperhatikan perubahan nilai solusi pada Tabel 11.1 dan 11.2, kita dapat menyimpulkan bahwa me tode Gauss-Seidel memiliki laju konvergen lebih cepat dibandingkan metode Jacobi. 236 382
I Wayan Sudiarta Metode Numerik Tabel 11.2: Hasil iterasi dengan metode iterasi Gauss Seidel. k xk yk zk 0 0 0 0 1 0.25 -0.55 1.15 2 0.675 -0.235 0.78 3 0.50375 -0.34325 0.91975 4 0.56575 -0.3029 0.868575 5 0.54286875 -0.31771125 0.88742125 6 0.551283125 -0.312259125 0.880488 7 0.548186781 -0.314265044 0.883039131 8 0.549326044 -0.313526965 0.882100461 9 0.548906856 -0.313798537 0.88244584 10 0.549061094 -0.313698613 0.882318759 k8 11.3 Penggunaan Python Referensi yang digunakan dalam penulisan kode Python pada bab ini adalah 1. https://www.math.ubc.ca/~pwalls/math python/linear-algebra/solving-linearsystems/ 2. https://docs.scipy.org/doc/scipy/ reference/generated/scipy.linalg.solve. html 237 382
3. https://docs.sympy.org/latest/modules/ solvers/solvers.html [1]: import numpy as np import scipy.linalg as la import sympy as sp sp.init_printing() Operasi Matriks [2]: # Contoh Matriks 3x3 A = np.array([1,2,3,4,5,6,7,8,9]). print(A) ↩→reshape((3,3)) [[1 2 3] [4 5 6] [7 8 9]] [3]: # Untuk menukar baris i dengan baris j ↩→sebuat matriks # matriks T memiliki elemen yang sama ↩→dengan matriks identitas # kecuali Tii = 0, Tjj = 0, Tij = 1, Tji ↩→= 1 # Menukar baris dengan perkalian matriks T T = np.eye(3) 238 382
I Wayan Sudiarta Metode Numerik T[1,1] = 0 T[2,2] = 0 T[1,2] = 1 T[2,1] = 1 print(T) [[1. 0. 0.] [0. 0. 1.] [0. 1. 0.]] [4]: # Operasi matriks T dari sebelah kiri ↩→pada A untuk menukar baris T@A [4]: array([[1., 2., 3.], [7., 8., 9.], [4., 5., 6.]]) [5]: # Sedangkan Operasi dari sebelah kanan ↩→untuk menukar kolom A@T [5]: array([[1., 3., 2.], [4., 6., 5.], [7., 9., 8.]]) [6]: # Definisikan fungsi # Modifikasi dari: Ref. 1 239 382
# Menukar baris i dengan baris j def swap_row(A,i,j): n = A.shape[0] # tentukan jumlah ↩→baris E = np.eye(n) E[i,i] = 0 E[j,j] = 0 E[i,j] = 1 E[j,i] = 1 return E @ A [7]: # Buat matriks yang berisi # baris i dari matriks A # ditempatkan pada baris j def get_row(A,i,j): nE = A.shape[0] np.zeros((n,n)) E[j,i] = 1 return E @ A [8]: # Kalikan skala s pada # baris i dari matriks A def scale_row(A, i, s): nE = A.shape[0] np.eye(n) E[i,i] = s return E @ A 240 382
I Wayan Sudiarta Metode Numerik [ 9 ] : swap_row ( A , 1,2 ) [ 9] : array ( [ [ 1 . , 2. , 3. ) , [ 7. , 8. , 9. ] , [ 4. , 5. , 6. ] ] ) [ 10] : get_row ( 1,0,2 ) [ 10] : array ( [ [ 0 . , 0. , 0. ] , [ 0. , 0. , 0. ] , ( 1. , 2. , 3. ] ] ) [ 11 ] : scale_row ( A , 0,3 ) [ 11 ] : array ( [ [ 3 . , 6. , 9. ) , [ 4. , 5. , 6. ] , [ 7. , 8. , 9. ] ] ). 1. Metode Eliminasi Gauss dan Back Substitution Contoh sistem persamaan linier : 2x + 3y – z = 2 x – 2y +2 = 5 ( 11.32 ) ( 11.33) ( 11.34 ) ( 11.35 ) 3x + y + 2z = 1 241 | 382
> [ 12] : # Dari persamaan di atas di peroleh A = np.array ( [ [ 2 , 3 , -1 ] , [ 1 , -2 , 1 ] , [ 3 , 41 2] ] ) b = np.array ( [ [ 2 ] , [ 5] , [ 1 ] ] ) print ( A ) print ( b) [ [ 2 3 -1 ] [ 1 -2 1 ] [ 3 1 2] ] [ [ 2] [ 5] [ 1 ] ] [ 13] : # Membuat Matriks Augmented B np.hstack ( [A , b] ) print ( B) = [ [ 2 3-1 2 ] [ 1 -2 1 5] [ 3 1 2 1 ] ] [ 14] : # PROSES ELIMINASI # ingat indeks mulai dari o B B ( 1/2 ) * get_row ( B , 0 , 1 ) В. BВ. ( 3/2 ) * get_row ( B , 0,2 ) = = 242 | 382
I Wayan Sudiarta Metode Numerik print(B) [[ 2. -1. 2. ] [ 0. 3. -3.5 1.5 4. ] -3.5 3.5 -2. ]] [15]: B = B - get_row(B,1,2) print(B) [[ 2. 3. -1. 2. ] [ 0. -3.5 1.5 4. ] 0. 2. -6. ]] [ ]: [16]: # PROSES SUBSTITUSI print(B) B = scale_row(B,2,1/2) [[ 2. -1. [ 0. 3. -3.5 1.5 2. ] 4. ] 0. 1. -3. ]] [17]: B = B - 1.5*get_row(B,2,1) print(B) 243 382
3 . -1 . 2. ] [ [ 2 . [ 0 . [ 0 . -3.5 0 . 8.5] 0 . 1 . -3 . ] ] [ 18] : B = scale_row ( B , 1,1/ ( - 3.5 ) ) print ( B) [ [ 2 . 3 . -1 . 2 . [ 다 ] 1 . : [ 0 . 0 . -2 . 4428571437 [ 0 . 0 . 1 . -3 . 니 ] ] [ 19] : B = B - 3* get_row ( B , 1,0 ) + get_row ( B , 2,0 ) print ( B) [ [ 2 0 . 0 . 6 . . 428571429] [ 0 . 1 . 0 . -2 . 442857143] [ 0 . ] ] 0 . 1 . -3 . [ 20] : B. scale_row ( B , 0,1 / 2 ) 244 | 382
I Wayan Sudiarta Metode Numerik [ 21 ] : # Kolom terakhir adalah solusi sistemu persamaan linier print (B ) [ [ 1 . 0 . 0 . 3 . 414285714] [ 0 . 1 . 0 . -2 . 442857143] [ 0 . 0 . 1 . -3 . 다[ 누 ] ] [ 22] : # Dengan menggunakan Moduł Scipy.linalg x = la solve ( A , b ) print ( x ) [ [ 3.14285714] [ -2.42857143] [ -3 . ] ] [ 23] : #Dengan menggunakan Modul Sympy.solve A2 sp . Matrix ( A) b2 sp . Matrix ( b ) x2 = A2 . solve ( b2 ) print ( x2 ) = Matrix ( [ [ 22/7] , [ -17/7] , [ -3] ] ) 245 | 382
Sympy for Matrix Operations Referensi yang digunakan untuk bagian ini adalah 1. https://docs.sympy.org/latest/modules/ matrices/matrices.html Penggunaan fungsi operasi baris elementary_row_op(op= operasi , n, k, m). Pilihan ’operasi’ yang digunakan yaitu • n->kn untuk mengalikan baris ke n dengan skala k. • n <->m untuk menukar baris ke-n dengan ke m. • n-> n+km+ untuk menambahkan baris ke-n de ngan k kali baris ke-m. Perlu diperhatikan bahwa tanda panah (->) yang di gunakan pada fungsi baris ini berlawanan arah dengan yang digunakan pada bab ini. Agar lebih jelas perha tikan contoh-contoh penggunaan berikut ini. [24]: A = sp. ↩→Matrix([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) A 1 2 3 4 5 6 7 8 9 10 11 246 382 12
I Wayan Sudiarta Metode Numerik [ 25] : # A. elementary_row_op ( 'n->kn ', n=0 , k=5) A.elementary_row_op ( ' n- > kn ' , 0 , 5 ) 5 10 15 20 5 6 7 8 9 10 11 12 [ 26] : # A.elementary_row_op ( 'n < - > m ', n=1 , m = 2 ) A.elementary_row_op ( ' n< ->m ' , 1 , 2 ) 1 2 3 4 9 10 11 12 5 6 7 8 [27] : # Notes A. elementary_row_op ( 'n- > n +km ' , u An=0, k=1 , m = 2 ) A. elementary_row_op ( 'n-> n +km ' , 0 , 1 , 2 ) 10 12 14 16 5 6 7 8 9 10 11 12 [ 28] : A = np.array ( [ [ 2 , 3 , -1 ] , [ 1 , -2 , 1 ] , [ 3 , u 41 2] ] ) b = np .array ( [ [ 2 ] , [ 5 ] , [ 1 ] ] ) B sp .Matrix (np.hstack ( [ A , b ] ) ) B 2 3 -1 2 1 -2 1 5 3 1 2 1 247 | 382
[ 29] : B2 = B.elementary_row_op ('n- >n +km ' , 1 , - ( 1 / 42) , 0 ) B2 2 3 -1 2 0 -3.5 1.5 4.0 3 1 2 1 [ 30] : B3 = B2.elementary_row_op ( ' n- > n + km ', 2 , u 4 ( 3/2 ) , 0 ) B3 2 3 -1 2 0 -3.5 1.5 4.0 0 -3.5 3.5 -2.0 [ 31 ] : B4 = B3. elementary_row_op ( 'n- > n + km ' , 2 , u 4-1 , 1 ) , B4 2 3 -1 2 0 -3.5 1.5 4.0 0 0 2.0 -6.0 [32] : B5 = B4.elementary_row_op ( ' n- >kn ' , 2 , 1/2 ). B5 2 3 -1 2 0 -3.5 1.5 4.0 0 0 1.0 -3.248 382
I Wayan Sudiarta Metode Numerik [ 33] : B6 = B5.elementary_row_op ( ' n->n+km ' , 1 , -1 . 45 , 2 ) B6 2 3 -1 2 0 -3.5 0 8.5 0 0 1.0 -3.0 [ 34] : B7 = B6.elementary_row_op ( ' n- >kn ' , 1 , 2/7 ) B7 2 3 -1 2 0 -1.0 0 2.42857142857143 0 0 1.0 -3.0 [35] : B8 = B7.elementary_row_op ( ' n- > n + km ' , 0 , 1,0 +2) B9 = B8 . elementary_row_op ( 'n- > n +km ' , 0 , 3 , 41 ) B9. elementary_row_op ( 'n-> kn ' , 0 , 1/2 ) ( 1.0 0 0 -1.0 0 3.14285714285714 0 2.42857142857143 0 0 1.0 -3.0 Metode Iterasi Agar lebih mudah mengerti metode iterasi dapat di gunakan, mari perhatikan contoh sistem persamaan linier berikut ini . 249 382
4x + y − z = 1 x − 5y + z = 3 x + y + 2z = 2 (11.36) (11.37) (11.38) Persamaan ini memiliki bentuk matriks Ax = B, de ngan matriks A yaitu 4 1 −1 A = 1 −5 1 (11.39) 1 1 2 Perhatikan bagian diagonal matriks di atas. Jika nilai diagonalnya lebih dominan di setiap baris, kita dapat menggunakan metode iterasi titik tetap seperti penyelesaian persamaan nonlinier. Sistem persamaan linier di atas diubah menjadi me tode solusi titik tetap seperti berikut ini. x = (11.40) y (11.41) 1 4 (1 − y + z) 1 − 1 2 (25 (3−−x x − z) 250 382− y) z = (11.42)
I Wayan Sudiarta Metode Numerik Metode Jacobi Kemudian dengan metode Jacobi, kita membuat ru mus iterasi yaitu xn+1 = 1 (11.43) yn+1 4 (1 − yn + zn) 1 − 1 2 (25 (3−−xnx−n −ynz ) n) (11.44) zn+1 = = (11.45) Metode Gauss-Seidel Kemudian dengan metode Gauss-Seidel, kita membuat rumus iterasi yaitu xn+1 = (11.46) yn+1 1 4 (1 − yn + zn) − zn) 1 2 (2 xn+1 − yn+1) 1 − 5(3 − − xn+1 (11.47) zn+1 = = (11.48) Perbedaan metode Jacobi dengan metode Gauss Seidel adalah nilai yang mana digunakan untuk meng hitung nilai iterasi berikutnya. Pada metode Gauss Seidel, nilai perhitungan bisa langsung digunakan tan pa menunggu semua variabel sudah selesai dihitung. [36]: # Metode Jacobi tol = 1.0E-10 # Toleransi delta = 1000 # xn = 0.0 251 382
= yn 0.0 zn 0.0 n 0 while delta > tol : n += 1 = = # un +1 = F (an ) xnp1 ( 1 /4.0) * ( 1.0 - yn + zn) ynp1 - ( 1 /5.0 ) * (3.0 - xn zn) znp1 = ( 1 / 2.0) * ( 2.0 - xn yn) delta = abs ( xnp1 xn) + abs ( ynp1 u -yn) + abs ( znp1 zn) # Simpan untuk iterasi berikutnya xnp1 yn ynp1 znp1 xn = = zn = print ( [n , xn , yn , zn] ) [ 38 , 0.5490196078513073 , -0 . 43137254901990133 , 0.8823529412001478] Metode Gauss - Seidel [ 37] : # Metode Jacobi tol = 1.0E- 10 # Toleransi delta = 1000 # xn 0.0. 0.0 = yn 252 | 382
I Wayan Sudiarta Metode Numerik zn 0.0 n = O while delta > tol : n + = 1 = = ynp1 # xn +1 = F (an ) xnp1 ( 1 /4.0) * ( 1.0 - yn + zn) - ( 1 / 5.0) * (3.0 xnp1 - zn) znp1 = ( 1 / 2.0) * ( 2.0 xnp1 ynp1 ) delta = abs ( xnp1 xn) + abs ( ynp1 -u Gyn) + abs ( znp1 zn) # Simpan untuk iterasi berikutnya xnp1 yn ynp1 znp1 xn = = zn = print ( [n , xn , yn , zn] ) [ 26 , 0.5490196078478193 , -0 . 431372549019304513 , 0.8823529411726129] [ 38] : # Dengan menggunakan Modul Scipy.linalg # Dari persamaan di atas di peroleh A = np.array ( [ [ 4 , 1 , -1 ] , [ 1 , -5 1 ] , [ 1 , u 41 , 2] ] ) b = np.array ( [ [ 1 ] , [ 3] , [ 2] ] ) x = la . solve ( A , b ) 253 | 382
print(x) [[ 0.54901961] [-0.31372549] [ 0.88235294]] [39]: #Dengan menggunakan Modul Sympy.solve A2b = sp.Matrix(A) = sp.Matrix(b) x2 = A2.solve(b2) print(x2) Matrix([[28/51], [-16/51], [15/17]]) Soal-Soal Soal 11.1. Diberikan sistem persamaan linier berikut ini: x + y + z = 1 x + 2y + 4z = −1 x + 3y + 9z = 1 Gunakan metode eliminasi Gauss dengan subs titusi kembali untuk menyelesaikan persamaan ini. 254 382
I Wayan Sudiarta Metode Numerik Soal 11.2. Gunakan metode metode iterasi Jacobi atau Gauss-Seidel untuk menyelesaikan sistem persa maan linier berikut ini: 2x + y + z = 2 x + 4y + 2z = 1 x + 3y + 9z = 1 Soal 11.3. Gunakan metode eliminasi Gauss dengan substitusi kembali untuk menyelesaikan sistem persa maan linier berikut ini: a + b + 4d = 1 2a − b + 5c = 3 5a + 2b + c + 2d = 2 −3a + 2c + 6d = −1 255 382
Bab 12 Optimasi “Most of us “sub-optimize,” that is, we go for the short-term and the transitory. Go beyond these les ser goals to use your gift of life you have been given.” – Michael Ray Pada bab ini akan membahas metode optimasi atau mencari nilai optimum (nilai maksimum atau mini mum). Ada banyak metode yang dapat digunakan untuk ini. Pada bab ini dibahas hanya dua metode yaitu: (1) metode Newton dan (2) metode Gradien. 12.1 Fungsi Satu Variabel Perhatikan fungsi f(x) yang ditampilkan sebagai sebu ah kurva pada Gambar 12.1. Kita ingin mendapatkan posisi dengan nilai fungsi yang maksimum atau mi nimum (optimum). Kita sudah mengetahui di bidang 257 382
kalkulus atau matematika, pada posisi puncak (maksi mum) atau lembah (minimum) memiliki turunan fung si sama dengan nol. f (x)=0 (12.1) y y = f(x) P x Q Gambar 12.1: Sebuah fungsi dengan nilai maksimum lokal pada P dan nilai minimum lokal pada Q Persamaan (12.1) merupakan sebuah persamaan no nlinier. Metode numerik untuk mendapatkan akar persamaan nonlinier dapat diaplikasikan untuk men dapatkan posisi optimum. 258 382
I Wayan Sudiarta Metode Numerik Umpama kita sudah mendapatkan solusi persamaan di atas. Kita ingin mengetahui apakah pada posisi ter sebut merupakan titik maksimum atau minimum. Uji yang biasa dilakukan adalah dengan menghitung nilai turunan kedua fungsi pada posisi optimumnya. Jika nilai turunan kedua f (x) > 0, bernilai positif, berar ti pada titik tersebut merupakan titik minimum lokal, sedangkan jika f (x) < 0 bernilai negatif, merupakan titik maksimum lokal dan jika f (x)=0, maka f(x) belum bisa ditentukan. Dengan menggunakan metode Newton-Raphson, ki ta mulai dari titik awal, contohnya x0, dan selanjutnya menggunakan persamaan iterasi xn+1 = xn − f (xn) (12.2) f (xn Selain metode Newton-Raphson, metode pencarian menggunakan turunan dapat juga digunakan atau di sebut metode gradien (kemiringan), descent (turun) atau ascent (naik). Kita mencari posisi maksimum dengan memperhatikan kemiringan fungsi (atau turu nannya) kemudian kita berpindah atau melangkah ke arah yang sesuai turunannya, sedangkan mencari mi nimum ke arah berlawanan dengan arah turunannya. ) Agar tidak membingungkan antara mencari posisi minimum atau maksimum, kita tetapkan pada bagian ini kita hanya mencari titik minimum. Untuk apli kasi mencari titik maksimum dapat diperoleh dengan 259 382
mengubah fungsi menjadi negatif fungsi atau −f(x) sehingga mengubah permasalahan menjadi pencarian minimum. Perhatikan bahwa posisi dengan nilai mak simum fungsi f(x) sama dengan posisi dengan nilai minimum untuk fungsi −f(x). Persamaan pencarian dengan metode gradien ada lah xn+1 = xn − f (xn)h (12.3) dengan h adalah nilai atau faktor yang menentukan panjang satu langkah. Kita perlu perhatikan bah wa persamaan metode gradien ini mirip dengan me tode Newton-Raphson dengan nilai langkah sebesar h = 1/f (xn). 12.2 Fungsi Dua Variabel Pada banyak kasus, fungsi yang digunakan bergantung pada lebih dari satu variabel bebas. Pada bagian ini kita tinjau terlebih dahulu kasus dua variabel bebas. Seperti sebelumnya, syarat untuk posisi minimum atau maksimum adalah ∂f(x, y) ∂x = 0 ∂f(x, y) ∂y = 0 (12.4) Rumus iterasi metode Newton untuk mendapatkan posisi minimum lokal (Chapra dan Canale, 2006) yaitu x (12.5) n+1 = xn − H−1i ∇f 260 382
I Wayan Sudiarta Metode Numerik dengan -- C ( 12.6 ) a2f a2 £ Əx2 дхду Hi - 22 f 22 £ ( 12.7) Әхду dy2 af Əx Vf = af ( 12.8) ду Seperti sebelumnya metode gradien memiliki rumus iterasi yang hampir sama yaitu Xn+1 = xn - hv f ( 12.9) 12.3 Fungsi Tiga Variabel atau Lebih Posisi minimum atau maksimum dari fungsi dengan tiga atau lebih variabel bebas dapat diperoleh dengan cara yang sama dengan metode untuk dua variabel. Seperti sebelumnya, syarat pada posisi minimum atau maksimum adalah af( x) Oxj = 0 untuk Xxj; = 1,2, ... , N ( 12.10) Seperti metode Newton untuk fungsi dua variabel, rumus iterasi untuk bariabel banyak adalah Xn + 1 = Xn – H ; 'Vf ( 12.11 ) dengan Hi adalah matriks Hessian. 261 | 382
Sedangkam metode gradien mempunyai rumus se bagai berikut . Xn+1 = xn – hf ( 12.12 ) 12.4 Penggunaan Python [ 1 ] : %matplotlib inline import numpy as np import matplotlib.pyplot as plt from sympy import * init_printing ( ) [ 2] : x = symbols ( ' x ' ) [3] : # Define Fungsi f X**4 2 *x** 3 f X4 – 2x3 Metode Newton- Raphson [ 4] : # Turunan pertama fx diff ( f >, x ) fx 473 6.72 [ 5] : fxx diff ( fx , x , 2 ) fxx 262 | 382
I Wayan Sudiarta Metode Numerik 12 (2x − 1) [6]: g = lambdify(x, f, numpy ) [7]: xd = np.linspace(-2,3,100) yd = g(xd) plt.plot(xd, yd) plt.ylim([-2,4]) plt.xlabel( $x$ ) plt.ylabel( $y$ ) plt.show() [8]: tol = 1.0E-10 # Toleransi delta = 1000 # xn = 2.0 263 382
xd = [ ] while delta > tol : xd.append ( xn) xnp1 = xn - fx . subs ( x , xn ) /fxx.subs ( x , u 4 xn ) delta = abs ( xnp1 - xn) # Simpan untuk iterasi berikutnya xn xnp1 = # Cetak Hasil print ( ' Posisi Minumum = print ( ' Nilai Minimum ' , xn ) g ( xn) ) = 1 Posisi Minumum 1.50000000015617 Nilai Minimum = -1.68750000000000 [ 9] : # Cetak iterasi print ( xd) [ 2.0 , 1.77777777777778 , 1.66326713186617 , 1 . 459855405241909 , 1.56034586307058 , 1.53725232609531 , 1.52310716017879 , 1 . 451437473003852 , 1.50895825515780 , 1.50558884849335 , 1.50348911867163 , 1 . 450217917566244 , 1.50136139075795 , 264382
I Wayan Sudiarta Metode Numerik 1.50085063744563, 1.50053155792989, 1. ↩→50033218838070, 1.50020760394277, 1.50012974707643, 1.50008108981839, 1. ↩→50005068031453, 1.50003167487551, 1.50001979667178, 1.50001237287087, 1. ↩→50000773302516, 1.50000483313325, 1.50000302070536, 1.50000188793971, 1. ↩→50000117996187, 1.50000073747600, 1.50000046092243, 1.50000028807649, 1. ↩→50000018004780, 1.50000011252987, 1.50000007033117, 1.50000004395698, 1. ↩→50000002747311, 1.50000001717069, 1.50000001073168, 1.50000000670730, 1. ↩→50000000419206, 1.50000000262004, 1.50000000163753, 1.50000000102345, 1. ↩→50000000063966, 1.50000000039979, 1.50000000024987] Metode Steepest Descent [10]: # Tentukan panjang langkah h = 0.1 tol = 1.0E-10 # Toleransi delta = 1000 # xn = 2.0 xd = [] 265 382
while delta > tol: xd.append(xn) xnp1 = xn - fx.subs(x,xn)*h delta = abs(xnp1 - xn) # Simpan untuk iterasi berikutnya xn = xnp1 # Cetak Hasil print( Posisi Nilai Minimum Minumum = , xn) = , g(xn)) Posisi Minumum = 1.49999999999546 Nilai Minimum = -1.68750000000000 [11]: print(xd) [2.0, 1.20000000000000, 1.37280000000000, 1. ↩→46868742225920, 1.49570444970768, 1.49954833457216, 1.49995458869208, 1. ↩→49999545639462, 1.49999954561469, 1.49999995456122, 1.49999999545612, 1. ↩→49999999954561, 1.49999999995456] 266 382
I Wayan Sudiarta Metode Numerik Fungsi Dua Variabel Metode Steepest Descent [ 12] : # Tambah simbol y y = symbols ( ' y ' ) [ 13] : f = -2 * x*y 3*y + 2 *x** 2 + y** 2 - 1 f 2x2 – 2xy + y2 – 3y – 1 = [ 14] : # Buat Cntour Plot xd yd np.linspace (-2 , 6,50 ) Xd , Yd = np.meshgrid ( xd , yd) [15] : 8 lambdify ( [ x , y ) , f , ' numpy ' ) [ 16] : Zd = g ( xd , Yd) [ 17] : fig , ax = plt . 4subplots ( constrained_layout=True ) CS = ax.contour ( Xd , Yd , zd , 20 , cmap=plt . 4cm . bwr) cbar fig.colorbar (CS ) ax.set_aspect ( ' equal ' ) plt.show (). 267 | 382
[18]: # Turunan-Turunan fx = diff(f, x) fy = diff(f, y) [19]: # metode Steepest Descent # Tentukan panjang langkah h = 0.1 tol = 1.0E-10 # Toleransi delta = 1000 # xn = 2.0 268 382
I Wayan Sudiarta Metode Numerik = yn = 1.0. xyd [ ] while delta > tol : xyd . append ( [xn , yn ] ) xnp1 fx.evalf ( subs= { x : xn , y : u -yn } ) * h ynp1 = yn - fy.evalf (subs= { x : xn , y : u 4yn } ) * h = xn delta abs ( xnp1 - xn) + abs ( ynp1 - yn ) # Simpan untuk iterasi berikutnya xn = xnp1 yn = ynp1 # Cetak Hasil 1 print ( ' Posisi Minumum = ' , xn ,, yn ) print ( ' Nilai Minimum ' , g ( xn , yn) ) Posisi Minumum = 1.49999999953898 2 . 499999999925406 Nilai Minimum = -5.50000000000000 [ 20] : print ( xyd [ 0:20] ) [ [ 2.0 , 1.0) , ( 1.40000000000000 , 1 . 450000000000000] , [ 1.14000000000000 , 269 | 382
1.78000000000000], [1.04000000000000, 1. ↩→95200000000000], [1.01440000000000, 2.06960000000000], [1.02256000000000, 2. ↩→15856000000000], [1.04524800000000, 2.23136000000000], [1.07342080000000, 2. ↩→29413760000000], [1.10288000000000, 2.34999424000000], [1.13172684800000, 2. ↩→40057139200000], [1.15915038720000, 2.44680248320000], [1.18485072896000, 2. ↩→48927206400000], [1.20876485017600, 2.52838779699200], [1.23093646950400, 2. ↩→56446320762880], [1.25145452322816, 2.59775786000384], [1.27042428593766, 2. ↩→62849719264870], [1.28795401009234, 2.65688261130650], [1.30414892831670, 2. ↩→68309689106366], [1.31910873520275, 2.70730729851427], [1.33292670082451, 2. ↩→72966758585197]] Metode Newton [21]: from numpy.linalg import inv # Turunan-Turunan untuk matriks Hessian fxx = diff(f, x, 2) fyy = diff(f, y, 2) fxy = diff(fx, y) 270 382
I Wayan Sudiarta Metode Numerik [ 22] : # Contoh hitungan Matriks Hessian xn 1 = yn 1 hxx = float ( fxx.evalf ( subs ={x : xn , y : yn} ) ) hyy = float ( fyy.evalf ( subs ={x : xn , y : yn} ) ) hxy float ( fxy.evalf ( subs={x : xn , y : yn} ) ) hess np .array ( [ [hxx , hxy] , [ hxy , hyy] ] ) = = print ( hess) inv ( hess ) [ [ 4. -2 . ] [ -2 . 2. ) ] [ 22] : array ( [ [ 0.5 , 0.5] , [ 0.5 , 1. ] ] ). [ 23] : # Tentukan panjang langkah h = 0.1 tol = 1.0E- 10 # Toleransi delta = 1000 # xn 2.0 = yn 1.0. xyd [ ] while delta > tol : 271 | 382
xyd.append ( [xn ,yn ] ) == # Hitung matriks Hessian hxx = float ( fxx . evalf ( subs = { x : xn , y : u yn } ) ) hyy float ( fyy.evalf ( subs = { x : xn , y : u Gyn} ) ) hxy float ( fxy.evalf ( subs={x : xn , y : u 4yn} ) ) hess = np.array ( [ [hxx ,, hxy] , [hxy ,u Shyy] ] ) لا و ihess = inv ( hess ) xnp1 = xn - ihess [ 0,0] * fx . Gevalf ( subs = { x : xn , y : yn} ) u Gihess [ 0,1 ] * fy.evalf ( subs={x : xn , y : yn} ) ynp1 yn ihess [ 1,0] * fx . Hevalf ( subs={x : xn , y : yn} ) u vihess [ 1,1 ] * fy.evalf ( subs= { x : xn , y : yn } ) = delta = abs ( xnp1 xn) + abs ( ynp1 - yn) # Simpan untuk iterasi berikutnya xn = xnp1 yn ynp1 = # Cetak Hasil 272 | 382
I Wayan Sudiarta Metode Numerik print( Posisi Minumum = print( Nilai Minimum = , xn, yn) , g(xn, yn)) Posisi Minumum 1.50000000000000 3. ↩→00000000000000= Nilai Minimum = -5.50000000000000 [24]: print(xyd) [[2.0, 1.0], [1.50000000000000, 3. ↩→00000000000000]] Soal-Soal Soal 12.1. Tentukan secara numerik posisi untuk nilai maksimum lokal dan minimum lokal dari fungsi f(x) = x3 − 3x − 1 dengan metode Newton-Raphson. Soal 12.2. Tentukan secara numerik nilai maksimum fungsi dari fungsi f(x) = 1 − x2/2 + x4/24 dengan metode steepest descent. Soal 12.3. Fungsi intensitas radiasi cahaya pada su hu tertentu terhadap panjang gelombang mempunyai bentuk sebagai berikut. f(λ) = a (12.13) λ5 exp(−b/λ) 1 − 1 273 382
dengan a dan b adalah konstanta yang bergantung pa da ketetapan Planck, laju cahaya dan suhu. Tentuk an posisi dan nilai maksimum fungsi ini untuk nilai a = 8π dan b = 0.1. Soal 12.4. Gunakan metode steepest descent untuk menentukan lokasi minimum fungsi f(x, y) berikut ini. f(x, y)=2x + 3y −x2 + 2x4 − xy + 5y2 (12.14) Soal 12.5. Gunakan metode Newton untuk menen tukan lokasi minimum fungsi f(x, y) berikut ini. f(x, y)=5x − y − x2 + x4 + xy + 2y2 (12.15) 274 382
Bab 13 Persamaan Diferensial Biasa "When the solution is simple, God is answering." – Albert Einstein “Identify your problems but give your power and energy to solutions.” – Anthony Robbins = Pada bab ini, kita mempelajari metode penyelesai an secara numerik persamaan diferensial biasa (PDB) yang berbentuk dy f(x, y) dx (13.1) dengan nilai awal y(a) = y0. Persamaan (13.1) tanpa sebuah nilai awal (di sini y(a) = y0) mempunyai tak terhingga jumlah solusinya. 275 382
Tetapi biasanya mempunyai hanya satu solusi yang unik untuk satu nilai awal. Oleh karena itu perma salan ini dinamakan juga dengan initial value problem (IVP) atau permasalahan nilai awal. Sebagai contoh, persamaan y = −y mempunyai solusi y = Ae−x de ngan A merupakan sebuah konstanta sembarang. Ke adaan atau kondisi atau syarat awal menentukan ni lai konstanta A. Jika kita mempunyai syarat awal y(0) = 1, solusi persamaan tersebut menjadi y = e−x. Persamaan y = −y di atas merupakan PDB yang sederhana dan mempunyai solusi analitik. Tetapi se cara umum banyak PDB yang tidak memiliki solusi analitik sehingga harus diselesaikan secara numerik. Umpamanya kita memerlukan sebuah solusi dari su atu PDB pada interval [a, b]. Kita membuat aproksi masi solusi pada titik-titik di daerah [a, b] yang berja rak sama (atau interval sama). Di sini kita membagi [a, b] menjadi N bagian dan jarak antar titik-titik ada lah ∆x = (b − a)/N. Jadi posisi titik-titik tersebut adalah xn = a + n∆x dengan n = 0,1,2,··· ,N (13.2) Dengan kata lain, solusi PDB berbentuk persamaan (13.1), berupa nilai-nilai y yaitu {y0,y1 ,...,yN} untuk posisi {x0,x1,...,xN }. Nilai-nilai y ini ditentukan se cara iterasi mulai dari titik awal (x0,y0), kemudian dilanjutkan ke titik berikutnya (x1,y1) dan seterusnya 276 382
I Wayan Sudiarta Metode Numerik sampai pada titik (xN,yN). Supaya mempermudah penulisan rumus atau persamaan kita telah menggu nakan notasi yn = y(xn). Metode numerik yang dibahas pada buku ini yaitu 1. Metode Euler 2. Metode Heun 3. Metode Taylor 4. Metode Runge-Kutta 13.1 Metode Euler Metode Euler merupakan yang paling sederhana un tuk mendapatkan solusi numerik PDB. Metode nume rik untuk PDB didapatkan dengan melakukan pende katan turunan (dengan metode ke depan, lihat bab sebelumnya) yaitu [ dy ≈ yn+1 − yn = dx f(xn,yn) (13.3) ] ∆x x=xn Setelah pengaturan sederhana, kita mendapatkan persamaan numerik, yn+1 = yn + f(xn,yn)∆x (13.4) Dengan persamaan (13.4), solusi untuk titik perta ma dari PDB adalah y1 = y0 + ∆xf(x (13.5) 0,y0) 277 382
Setelah y1 didapatkan, kemudian dilanjutkan untuk mendapatkan nilai y2 yaitu y2 = y1 + ∆xf(x1 ,y1) (13.6) Selanjutnya dilakukan dengan cara yang sama untuk n = 3,...,N. Persamaan (13.4) digunakan berulang ulang sampai nilai yN diperoleh. Sebagai contoh kita ingin mencari solusi numerik persamaan y = −y, y(0) = 1 pada interval [0,1]. Hal pertama yang kita tentukan adalah nilai ∆x. Untuk contoh ini kita akan gunakan ∆x = 0.2. Solusi persa maan pada beberapa titik diberikan berikut ini. y0 = 1 y1 = y0 + f(x0 ,y0)∆x =1+(−1)(0.2) = 0.8 y2 = y1 + f(x1 ,y1)∆x = 0.8+(−0.8)(0.2) = 0.64 y3 = y2 + f(x2 ,y2)∆x = 0.64 + (−0.64)(0.2) = 0.512 y4 = y3 + f(x3,y3)∆x = 0.512 + (−0.512)(0.2) = 0.4096 13.2 Metode Heun Hasil numerik PDB dengan metode Euler dapat di perbaiki menggunakan metode Heun. Penurunan per samaan numerik dapat dilakukan dengan menggunak an teorema kalkulus untuk integrasi. Integrasi untuk persamaan y = f(x, y) pada interval pertama [x0,x1] 278 382
I Wayan Sudiarta Metode Numerik Tabel 13.1: Solusi numerik dengan metode Euler un tuk persamaan y = −y dan y(0) = 1. xn yn y Galat Relatif 0 1 1 0.00000 0.2 0.8 0.818730753 -0.02288 0.4 0.64 0.670320046 -0.04523 0.6 0.512 0.548811636 -0.06708 0.8 0.4096 0.449328964 -0.08842 1 0.32768 0.367879441 -0.10927 1.2 0.262144 0.301194212 -0.12965 1.4 0.2097152 0.246596964 -0.14956 1.6 0.16777216 0.201896518 -0.16902 1.8 0.134217728 0.165298888 -0.18803 2 0.107374182 0.135335283 -0.20661 didapatkan ∫ x1 x0 f(x, y)dx = ∫ x x0 1 y (x)dx = y(x1)−y(x0) = y1 −y0 (13.7) Jadi nilai y1 adalah 1 y1 = y0 + ∫xx0 f(x, y)dx (13.8) y1 = y0 + Dengan menggunakan metode trapesium untuk ap roksimasi integral pada persamaan (13.7), diperoleh ∆x[f(x0 ,y0) + f(x1,y1)] (13.9) 2 Pada persamaan (13.8) terdapat y1 pada bagian kanan yang belum diketahui. Untuk mendapatkan y1, 279 382
kita menggunakan dengan hasil y1 metode Euler. Jadi rumus metode Heun adalah z1 = y0 + ) ∆xf(x0 ,y0 y1 ∆x = y0 + )] [f(x0 ,y0) + f(x1 ,z1 2 (13.10) Seperti pada metode Euler sebelumnya, proses ini diteruskan berulang-ulang sampai semua titik yang menjadi solusi persamaan diferensial. Secara umum rumus iterasi metode Heun adalah zn+1 = ) yn + ∆xf(xn ,yn yn+1 = ∆x 2 [f(xn,yn) + f(xn+1,zn+1)] yn + (13.11) Bagian sisi kanan pada persamaan (13.11) me rupakan rata-rata nilai f(x, y) yaitu [f(xn ) + f(xn+1 ,y ,yn n+1)]/2. Oleh karena ini, cara menurunan metode Heun juga bisa dilakukan dengan mempertim bangkan rata-rata turunan sebagai pengganti nilai tu runan yang ada pada metode Euler. Sehingga pende katan turunan metode Heun lebih akurat dibandingkan dengan metode Euler. Baris kedua pada persamaan (13.11) dapat juga di artikan sebagai korektor untuk metode Euler. Persamaan numerik Heun dapat ditulis dalam ben tuk berbeda seperti persamaan (13.12) yang nantinya dapat dibandingkan dengan metode RK2. Bentuk lain 280 382
I Wayan Sudiarta Metode Numerik dari persamaan numerik Heun yaitu kl = f (xn , yn ) k2 = f( xn+1 , Yn + Axkl) Ax Yn + 1 = Yn + [kl + k2] 2 ( 13.12 ) Menggunakan contoh yang sama dengan metode Eu ler , PDB berbentuk y' ( x) = -y, proses mendapatkan solusi untuk beberapa titik diberikan berikut ini . Yo = 1 z1 = yo + f (xo, yo) Ax = 1 + ( - 1 ) ( 0.2 ) = 0.8 Y1 = yo + ( 1/2 ) [ f( x0 , yo) + f ( x1 , z1 ) ] Ax = 1 + 0.5 [ ( - 1 ) + ( -0.8 ) ] ( 0.2 ) = 0.82 22 = yi + f ( 21,41) Ax = 0.82 + ( -0.82 ) ( 0.2 ) = 0.656 y2 = y1 + ( 1/2) [ f( x1 , yı ) + f ( x2,22 ) ] AX 0.82 +0.5 [ ( -0.82) + ( -0.656) ] ( 0.2 ) = 0.6724 = 23 = y2 + f ( C2, 42) Ax = 0.6724 + ( - 0.6724 )(0.2) = 0.5379 Y3 = y2 + ( 1/2) [ f( x2 , Y2 ) + f ( x3 , 23 ) ] AX = 0.6724 +0.5 * [( - 0.6724) + ( -0.5379) ] ( 0.2 ) = 0.5513 dan seterusnya 281 382
Tabel 13.2: Solusi numerik dengan metode Heun untuk persamaan y = −y dan y(0) = 1. xn yn y(eksak) Galat Relatif 0 1 1 0.00000 0.2 0.82 0.818730753 0.00155 0.4 0.6724 0.670320046 0.00310 0.6 0.551368 0.548811636 0.00466 0.8 0.45212176 0.449328964 0.00622 1 0.370739843 0.367879441 0.00778 1.2 0.304006671 0.301194212 0.00934 1.4 0.249285471 0.246596964 0.01090 1.6 0.204414086 0.201896518 0.01247 1.8 0.16761955 0.165298888 0.01404 2 0.137448031 0.135335283 0.01561 Dengan membandingkan hasil dari metode Euler dan Heun pada Tabel 13.1 dan 13.2, kita dapat me nyimpulkan bahwa metode Heun memiliki akurasi yang lebih tinggi dibandingkan dengan metode Euler. Karena alasan ini, kita sebaiknya menggunakan me tode Heun untuk pehitungan awal sebelum memakai metode yang lebih tinggi seperti metode Runge-Kutta orde 4 atau metode prediktor-korektor yang lain. 13.3 Metode Taylor Pada persamaan (13.1), kita mendapatkan sebuah fungsi f(x, y) yang merupakan turunan pertaman da 282 382