from cmath import cos, exp, pi, sin
import numpy as np
from matplotlib import pyplot as plt
def G(x):
x1,x2,x3 = x[0][0],x[1][0],x[2][0]
g = np.array([[(3 * x1 - cos(x2*x3) - 3/2).real],
[(4 * x1**2 - 625 * x2**2 + 2*x2 -1).real],
[(exp(-x1*x2) + 20*x3 + (10*pi-3)/3).real]])
return g
def F(x):
g = G(x)
g_T = np.array(list(zip(*g)))
f = 1/2 * np.dot(g_T, g)
return f
def J_G(x):
x1,x2,x3 = x[0][0],x[1][0],x[2][0]
jg = np.array([[3, (sin(x2*x3)*x3).real, (sin(x2*x3)*x2).real],
[8*x1.real, -1250*x2.real+2, 0],
[(-x2*exp(-x1*x2)).real, -(x1*exp(-x1*x2)).real, 20]])
return jg
def F_prime(x):
jg = J_G(x)
jg_T = np.array(list(zip(*jg)))
return np.dot(jg_T, G(x))
def Gama(x0, x1):
deta_x = np.array(list(zip(*(x1-x0))))
deta_F_prime = F_prime(x1-x0)
module_F_prime = np.dot(np.array(list(zip(*deta_F_prime))), deta_F_prime)
gama = np.dot(deta_x, deta_F_prime)[0][0]/module_F_prime[0][0]**2
return gama
def gradient_descent():
x0 = np.array([[0],
[0],
[0]])
maxIt = 1000
gama = 0.001
for i in range(maxIt):
print(F(x0)[0][0])
x1 = x0 - gama * F_prime(x0)
if F(x1)[0][0] > F(x0)[0][0]: return x0
#gama = Gama(x0, x1)
x0 = x1
return x1
res = gradient_descent()
print(res)