#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 20 16:08:54 2024

@author: sam
"""

import numpy as np

minimum = []

'''functions'''
def f(x):
    return x**2 + x*np.sin(x**2)

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(c)<f(d):
                b = d
            elif f(d)<f(c):
                a = c
        minimum[j] = [(a+b)/2]
        j += 1



'''run code'''
a = 1
b = 5
N = 1e5
tol = 1e-5

minbracket(f,a,b,N)
goldensearch(f,a,b,tol)
for i in range(len(minimum)):
    print(minimum[i])