#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 26 20:47:03 2024

@author: sam
"""

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

minimum = []

def f(x,y):
    return (x-1)**2 + y**2

def plot(n):
    for i in range(n):
        xi = xn + i*pn*0.2
        plt.plot(xi[0],xi[1],'.')

def fline(t):
    xb = xn + t*pn*0.2
    return f(xb[0],xb[1])

def minbracket(f,a,b,N):
    h = (b-a)/N
    for i in range(1,int(N)):
        x = a+h*i
        if f(x)<f(x-h) and f(x)<f(x+h):
            minimum.append([x-h,x+h])
        else:
            continue

def goldensearch(f,a,b,tol):
    j = 0
    for i in minimum:
        a = i[0]
        b = i[1]
        while abs(b-a) > tol:
            Φ = (1+np.sqrt(5))/2
            c = b - (b-a)/Φ
            d = a + (b-a)/Φ
            if f(d)<f(c):
                a = c
                c = d
            else:
                b = d
        minimum[j] = [(a+b)/2]
        j += 1
    return c



xn = np.array([-2,-1])
pn = np.array([1,0])



minbracket(fline,0,20,20)

for i in range(len(minimum)):
    [a,b] = minimum[i][:]
    print(goldensearch(fline,a,b,1e-4))