import sympy from sympy import symbols, cos, Function, pi, diff
""" CAUCHY's METHOD of FINDING MINIMA OF A FUNCTION """
x = symbols('x') y = symbols('y') f = Function('f') """ function and initial point """
f = x*x + 2*y*y - 0.3*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.7 p = [0.1,0.1] def fib(n) : """ Fibonacci sequence """
a = 0 b = 1 if n <= 1 : return n else: for i in range(1, n): c = a + b a = b b = c return b def grad(X) : """ Gradient of the function """
x0 = X[0] y0 = X[1] s1 = - ((f.diff(x)).subs([(x,x0),(y,y0)])) s2 = - ((f.diff(y)).subs([(x,x0),(y,y0)])) return s1.evalf(), s2.evalf() S = grad(p)
def lam_star(func,X) : """ Calculating Optimum lambda"""
x0 = X[0] y0 = X[1] dl = 0.01 l = 0 z = f.subs([(x,x0 + l*S[0]),(y,y0 + l*S[1])]) minima = 0 while minima == 0 : l = l + dl znew = f.subs([(x,x0 + l*S[0]),(y,y0 + l*S[1])]) if znew > f.subs([(x,x0 + (l-dl)*S[0]),(y,y0 + (l-dl)*S[1])]) : minima = 1 else : minima = 0 else : z = znew n = 25 fn = fib(n) a = l - 2*dl b = l l0 = b - a fa = f.subs([(x,x0 + a*S[0]),(y,y0 + a*S[1])]) fb = f.subs([(x,x0 + b*S[0]),(y,y0 + b*S[1])]) for i in range(1,n) : L = fib(n-i)*l0/fn c = b - L d = a + L if c == d : d = c + 0.0001 fc = f.subs([(x,x0 + c*S[0]),(y,y0 + c*S[1])]) fd = f.subs([(x,x0 + d*S[0]),(y,y0 + d*S[1])]) if fc <= fd : b = d fb = fd else : a = c fa = fc if fc <= fd : l_star = c else: l_star = d return l_star """ Finding minima of the function """
Xnew = [0.1,0.1] conv = 0 while conv == 0 : x_sol = Xnew Fx = grad(x_sol) s = [-Fx[0],-Fx[1]] lam = lam_star(f,x_sol) Xnew = [x_sol[0]+s[0]*lam, x_sol[1]+s[1]*lam] if ((abs(Fx[0]) <= 1e-1) & ((abs(Fx[1]) <= 1e-1))) : conv = 1 print(x_sol) https://stackoverflow.com/questions/67377560/why-is-my-code-running-forever-its-been-a-long-time-since-i-run-the-code-yet May 04, 2021 at 09:07AM
没有评论:
发表评论