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)