# -*- coding: utf-8 -*-
"""
Created on Wed Aug 10 17:54:01 2022

@author: Chris
Lab 3 Q3
"""
import numpy as np
import matplotlib.pyplot as plt
import math as maths

def f(x):
    f = x*np.cos(x)+x*np.sin(x/2)
    #f = x*np.sin(x**2)+x**2
    return f

def golden(f,a,b,tol):
    phi = (1 + 5**0.5) / 2
    
    while np.abs(b-a)>tol:
        
        #pick two new points:
        c = b - (b-a)/phi
        d = a + (b-a)/phi
        
        if f(d)<f(c):
            a = c
            c = d
        else:
            b = d
            
    #print("minimum found at",c)
    return c

def minbracket(f,a,b,N):
    blist = []
    h = (b-a)/N
    for i in range(1,N):
        
        xa = a+(i-1)*h
        xb = a+i*h
        xc = a+(i+1)*h
        
        if f(xb)<f(xa) and f(xb)<f(xc):
            #print('Minimum found between',xa,'and',xc)
            blist.append([xa,xb])
    return blist     
    

a = -10      #leftmost point in search
b = 10       #rightmost point in search
N = 200      # number of intervals
tol = 1e-5

blist = minbracket(f,a,b,N)

for i in range(len(blist)):
    a1,b1 = blist[i]
    min1 = golden(f,a1,b1,tol)
    print('Minimum found at',min1)
    







