NIM : 18/427661/PA/18621
Tugas Praktikum Pengantar Teori Optimisasi
Soal :
Carilah tiitk optimum dari fungsi berikut, kemudian tampilkan grafiknya dalam dua dan tiga
dimensi:
Jawab
Syntax:
import sympy as sym
import numpy as np
import pandas as pd
#function grad
def grad(f,nilai,n):
G=[]
for i in range (n):
G.append(sym.diff(f,x[i])) #turunan parsial pertama dari f terha
dap x_i
G[i] = sym.lambdify(x,G[i]) #ubah turunan jadi function
calc='G[%d](%f' %(i, nilai[0,0])
for j in range (1,n):
calc=calc+',%f' %nilai[0,j]
calc=calc+')'
G[i]=eval(calc)
G = np.matrix(G).transpose()
return (G)
#function hessian
def hessian(f,nilai,n):
H=[]
for i in range(n):
row = []
for j in range (n):
row.append(sym.diff(sym.diff(f,x[i]),x[j]))
row[j] = sym.lambdify(x,row[j])
calc = 'row[%d](%f' %(j, nilai [0,0])
for k in range (1,n):
calc = calc +',%f' %nilai[0,k]
calc= calc+')'
row[j]=eval(calc)
H.append(row)
H=np.matrix(H)
return (H)
#inisialisasi variabel
x_awal = np.matrix([0,3])
n = x_awal.shape[1]
tol = 0.0001
#ubah x0,x1,... menjadi simbol
x = []
for i in range(n):
x.append(sym.Symbol('%d' %i))
f = ((x[0])**2 -2*x[0] +4*(x[1])**2 -8*x[1])**2
f_func = sym.lambdify(x,f)
e = [None]
xk = [x_awal]
calc = 'f_func(%f' %x_awal[0,0]
for i in range (1,n):
calc=calc+',%f' %x_awal[0,i]
calc=calc+')'
fxk = [eval(calc)]
#hitung metode newton iterasi pertama
G = grad(f,x_awal,n)
H = hessian(f,x_awal,n)
x_berikutnya = x_awal-(np.linalg.inv(H)*G).transpose()
xk.append(x_berikutnya)
e.append(np.linalg.norm(x_berikutnya-x_awal))
calc = 'f_func(%f' %x_berikutnya[0,0]
for i in range (1,n):
calc = calc + ',%f' %x_berikutnya[0,i]
calc = calc+')'
fxk.append(eval(calc))
#jalankan metode newton
i=1
while e[i]>tol:
G = grad(f,xk[i],n)
H = hessian(f,xk[i], n)
x_berikutnya = xk[i]-(np.linalg.inv(H)*G).transpose()
xk.append(x_berikutnya)
e.append(np.linalg.norm(xk[i+1]-xk[i]))
calc = 'f_func(%f' %x_berikutnya[0,0]
for j in range (1,n):
calc = calc + ',%f' %x_berikutnya[0,j]
calc = calc+')'
fxk.append(eval(calc))
i = i+1
#output
xp = xk[i]
fxp = fxk[i]
print ("Titik Optimum dari f adalah ",xp)
print("Nilai Optimum dari f adalah ", fxp)
data ={'x':xk, 'f(x)':fxk, 'e':e}
print(pd.DataFrame(data))
Output:
x=np.linspace(-100,100)
y=np.linspace(-100,100)
X,Y=np.meshgrid (x,y)
G=f(X,Y)
#plt.scatter(xp[0],xp[1])
plt.contour(X,Y,G,10)
plt.title('Grafik Fungsi 2 Dimensi')
plt.grid()
plt.show()
Output:
x=np.linspace(-100, 100, 100)
y=np.linspace(-100, 100, 100)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
ax = plt.axes(projection = '3d')
ax.contour3D(X, Y, Z, 100)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.title('Grafik Fungsi 3 Dimensi')
Output:
Interpretasi:
Dengan menggunakan Metode Newton n Variabel, diperoleh titik optimum dari
2
fungsi f ( x )=( x 12 −2 x 1 +4 x 22−8 x 2 ) dengan toleransi 0,0001 dan titik awal [0 3] yaitu
[[0.45767401 2.08465188]] dan nilai Optimum dari f adalah 7.103866736488418e-12.
Jawab
Syntax:
import sympy as sym
import numpy as np
import pandas as pd
#function grad
def grad(f,nilai,n):
G=[]
for i in range (n):
G.append(sym.diff(f,x[i])) #turunan parsial pertama dari f t
erhadap x_i
G[i] = sym.lambdify(x,G[i]) #ubah turunan jadi function
calc='G[%d](%f' %(i, nilai[0,0])
for j in range (1,n):
calc=calc+',%f' %nilai[0,j]
calc=calc+')'
G[i]=eval(calc)
G = np.matrix(G).transpose()
return (G)
#function hessian
def hessian(f,nilai,n):
H=[]
for i in range(n):
row = []
for j in range (n):
row.append(sym.diff(sym.diff(f,x[i]),x[j]))
row[j] = sym.lambdify(x,row[j])
calc = 'row[%d](%f' %(j, nilai [0,0])
for k in range (1,n):
calc = calc +',%f' %nilai[0,k]
calc= calc+')'
row[j]=eval(calc)
H.append(row)
H=np.matrix(H)
return (H)
#inisialisasi variabel
x_awal = np.matrix([0,3])
n = x_awal.shape[1]
tol = 0.0001
#ubah x0,x1,... menjadi simbol
x = []
for i in range(n):
x.append(sym.Symbol('%d' %i))
f = 2*(x[0])**2 +x[1]**2 +x[0]*x[1] -x[0] -3*x[1]
f_func = sym.lambdify(x,f)
e = [None]
xk = [x_awal]
calc = 'f_func(%f' %x_awal[0,0]
for i in range (1,n):
calc=calc+',%f' %x_awal[0,i]
calc=calc+')'
fxk = [eval(calc)]
#hitung metode newton iterasi pertama
G = grad(f,x_awal,n)
H = hessian(f,x_awal,n)
x_berikutnya = x_awal-(np.linalg.inv(H)*G).transpose()
xk.append(x_berikutnya)
e.append(np.linalg.norm(x_berikutnya-x_awal))
calc = 'f_func(%f' %x_berikutnya[0,0]
for i in range (1,n):
calc = calc + ',%f' %x_berikutnya[0,i]
calc = calc+')'
fxk.append(eval(calc))
#jalankan metode newton
i=1
while e[i]>tol:
G = grad(f,xk[i],n)
H = hessian(f,xk[i], n)
x_berikutnya = xk[i]-(np.linalg.inv(H)*G).transpose()
xk.append(x_berikutnya)
e.append(np.linalg.norm(xk[i+1]-xk[i]))
calc = 'f_func(%f' %x_berikutnya[0,0]
for j in range (1,n):
calc = calc + ',%f' %x_berikutnya[0,j]
calc = calc+')'
fxk.append(eval(calc))
i = i+1
#output
xp = xk[i]
fxp = fxk[i]
print ("Titik Optimum dari f adalah ",xp)
print("Nilai Optimum dari f adalah ", fxp)
data ={'x':xk, 'f(x)':fxk, 'e':e}
print(pd.DataFrame(data))
Output:
x=np.linspace(-100,100)
y=np.linspace(-100,100)
X,Y=np.meshgrid (x,y)
G=f(X,Y)
#plt.scatter(xp[0],xp[1])
plt.contour(X,Y,G,10)
plt.title('Grafik Fungsi 2 Dimensi')
plt.grid()
plt.show()
Output:
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
ax = plt.axes(projection = '3d')
ax.contour3D(X, Y, Z, 100)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.title('Grafik Fungsi 3 Dimensi')
Output:
Interpretasi:
Dengan menggunakan Metode Newton n Variabel, diperoleh titik optimum dari
fungsi f (x)=2 x 12+ x22 + x 1 x 2−x 1−3 x 2dengan toleransi 0,0001 dan titik awal [0 3] yaitu
[[-0.14285729 1.57142814]] dan nilai Optimum dari f adalah -2.2857142857139996