Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

Cara pakai python untuk menyelesaikan

problem optimasi nonlinear multivariables


tanpa constraints

Mencari vektor gradien, titik kritis, matriks Hessian,


eigenvalue, dan status sufficient condition. Pakai
perintah Matrix, jacobian, symbols, dan subs yg ada
di library sympy. Pakai perintah array, linalg, dan
eig yg ada di library numpy. Install sympy & numpy
terlebih dahulu via VSC
In [11]: from sympy import *
import numpy as np

# mendefinisikan simbol yang dipakai sbg decision variables


x,y,z = symbols('x y z')

# mendefinisikan rumus fungsi tujuan. * perkalian, ** pangkat. contoh soal C


fungsi = Matrix([3*x**2*y+y**3-3*x**2-3*y**2+z**3-3*z])

# mendefinisikan variabel yg dipakai untuk menurunkan fungsi secara parsial


variabel = Matrix([x,y,z])

In [12]: # Find vektor gradien yg elemennya berupa turunan pertama parsial (isinya rumus)
gradien = fungsi.jacobian(variabel)
gradien

Out[12]: [ 6xy − 6x 3x
2
+ 3y
2
− 6y 3z
2
− 3]

In [13]: # Find matriks Hessian yg elemennya berupa turunan kedua parsial (isinya rumus)
hesian = gradien.jacobian(variabel)
hesian

Out[13]: ⎡
6y − 6 6x 0

⎢ 6x 6y − 6 0 ⎥
⎣ ⎦
0 0 6z 

In [14]: # mencari semua titik kritis. solve artinya gradien=0. turunan pertama parsial=0
solve(gradien)
Out[14]: [{x: -1, y: 1, z: -1},
{x: -1, y: 1, z: 1},
{x: 0, y: 0, z: -1},
{x: 0, y: 0, z: 1},
{x: 0, y: 2, z: -1},
{x: 0, y: 2, z: 1},
{x: 1, y: 1, z: -1},
{x: 1, y: 1, z: 1}]

In [15]: # menghitung matriks Hessian titik kritis ke-1, yaitu x=-1, y=1, z=-1
hesianvalue1 = hesian.subs([(x,-1),(y,1),(z,-1)])
hesianvalue1

Out[15]: ⎡
0 −6 0


⎢ −6 0 0 ⎥

⎣ ⎦
0 0 −6 

In [16]: # menghitung matriks Hessian titik kritis ke-2, yaitu x=-1, y=1, z=1
hesianvalue2 = hesian.subs([(x,-1),(y,1),(z,1)])
hesianvalue2

Out[16]: ⎡
0 −6 0


⎢ −6 0 0⎥
⎣ ⎦
0 0 6 

In [17]: # menghitung matriks Hessian titik kritis ke-3, yaitu x=0, y=0, z=-1
hesianvalue3 = hesian.subs([(x,0),(y,0),(z,-1)])
hesianvalue3

Out[17]: ⎡
−6 0 0

⎢ 0 −6 0 ⎥
⎣ ⎦
0 0 −6 

In [18]: # menghitung matriks Hessian titik kritis ke-4, yaitu x=0, y=0, z=1
hesianvalue4 = hesian.subs([(x,0),(y,0),(z,1)])
hesianvalue4

Out[18]: ⎡
−6 0 0


⎢ 0 −6 0⎥
⎣ ⎦
0 0 6 

In [19]: # menghitung matriks Hessian titik kritis ke-5, yaitu x=0, y=2, z=-1
hesianvalue5 = hesian.subs([(x,0),(y,2),(z,-1)])
hesianvalue5

Out[19]: ⎡
6 0 0


⎢0 6 0 ⎥

⎣ ⎦
0 0 −6 

In [20]: # menghitung matriks Hessian titik kritis ke-6, yaitu x=0, y=2, z=1
hesianvalue6 = hesian.subs([(x,0),(y,2),(z,1)])
hesianvalue6
Out[20]: ⎡
6 0 0


⎢0 6 0⎥
⎣ ⎦
0 0 6 

In [21]: # menghitung matriks Hessian titik kritis ke-7, yaitu x=1, y=1, z=-1
hesianvalue7 = hesian.subs([(x,1),(y,1),(z,-1)])
hesianvalue7

Out[21]: ⎡
0 6 0


⎢6 0 0 ⎥
⎣ ⎦
0 0 −6 

In [22]: # menghitung matriks Hessian titik kritis ke-8 (terakhir), yaitu x=1, y=1, z=1
hesianvalue8 = hesian.subs([(x,1),(y,1),(z,1)])
hesianvalue8

Out[22]: ⎡
0 6 0

⎢6 0 0⎥
⎣ ⎦
0 0 6 

Menghitung eigenvalue dari matriks Hessian.


Library sympy (symbolic python) menghasilkan
output bertipe objek bukan float (bilangan real),
shg perlu dikonversi ke tipe real number (float) agar
dapat dihitung eigenvaluenya oleh library numpy
(numerical python) pakai perintah
".astype(np.float64)"

Interpretasi output:
1.Array pertama (paling kiri dan paling atas) adalah nilai
eigenvalues yg ingin dicari.

2.Array kedua (berupa matrix) adalah matrix eigenvector. Satu


skalar eigenvalue memiliki satu vektor eigenvector, karena ada
3 nilai eigenvalue maka ada 3 vektor eigenvector.

3. Sufficient condition: jika semua eigenvalues bernilai positif


maka fungsi tujuan concave up shg titik kritis tsb adalah titik
minimum lokal, jika semua eigenvalues bernilai negatif maka
fungsi tujuan concave down shg titik kritis tsb adalah titik
maksimum lokal, jika eigenvalues ada yg bernilai positif dan
negatif tetapi tdk ada yg bernilai nol, maka titik kritis tsb
adalah titik belok/saddle point
In [24]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-1 (L1)
L1=np.array(hesianvalue1).astype(np.float64)
print(np.linalg.eig(L1))
(array([ 6., -6., -6.]), array([[ 0.70710678, 0.70710678, 0. ],
[-0.70710678, 0.70710678, 0. ],
[ 0. , 0. , 1. ]]))

In [25]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-2 (L2)
L2=np.array(hesianvalue2).astype(np.float64)
print(np.linalg.eig(L2))

(array([ 6., -6., 6.]), array([[ 0.70710678, 0.70710678, 0. ],


[-0.70710678, 0.70710678, 0. ],
[ 0. , 0. , 1. ]]))

In [26]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-3 (L3)
L3=np.array(hesianvalue3).astype(np.float64)
print(np.linalg.eig(L3))

(array([-6., -6., -6.]), array([[1., 0., 0.],


[0., 1., 0.],
[0., 0., 1.]]))

In [27]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-4 (L4)
L4=np.array(hesianvalue4).astype(np.float64)
print(np.linalg.eig(L4))

(array([-6., -6., 6.]), array([[1., 0., 0.],


[0., 1., 0.],
[0., 0., 1.]]))

In [28]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-5 (L5)
L5=np.array(hesianvalue5).astype(np.float64)
print(np.linalg.eig(L5))

(array([ 6., 6., -6.]), array([[1., 0., 0.],


[0., 1., 0.],
[0., 0., 1.]]))

In [29]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-6 (L6)
L6=np.array(hesianvalue6).astype(np.float64)
print(np.linalg.eig(L6))

(array([6., 6., 6.]), array([[1., 0., 0.],


[0., 1., 0.],
[0., 0., 1.]]))

In [30]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-7 (L7)
L7=np.array(hesianvalue7).astype(np.float64)
print(np.linalg.eig(L7))

(array([ 6., -6., -6.]), array([[ 0.70710678, -0.70710678, 0. ],


[ 0.70710678, 0.70710678, 0. ],
[ 0. , 0. , 1. ]]))

In [31]: # Menghitung eigenvalue dari matriks Hessian titik kritis ke-8 (terakhir) (L8)
L8=np.array(hesianvalue8).astype(np.float64)
print(np.linalg.eig(L8))

(array([ 6., -6., 6.]), array([[ 0.70710678, -0.70710678, 0. ],


[ 0.70710678, 0.70710678, 0. ],
[ 0. , 0. , 1. ]]))

PERHATIAN: semua blok program harus


dirunning berurutan mulai dari paling atas
hingga terakhir paling bawah agar hasil
sebelumnya dapat menjadi input blok
program berikutnya

Kesimpulan: 1. Ada 8 titik kritis, 2. Ada satu titik


puncak minimum (minimum lokal), yaitu titik kritis
ke-6 dg titik kritis x=0,y=2,z=1, dan satu titik
puncak maksimum (maksimum lokal), yaitu titik
kritis ke-3 dg titik kritis x=0,y=0,z=-1, dan 6 titik
kritis lainnya adalah titik belok

You might also like