import sympy, math sympy.init_printing() def secmin(f, g0, g1, g2): g = [g0, g1, g2] fs = [f(g0), f(g1), f(g2)] s = [None] while True: while len(s) < len(g): n = len(s) s.append((fs[n] - fs[n-1])/(g[n] - g[n-1])) if s[-1] == s[-2]: return gn = (g[-1] + g[-2] - s[-1] * (g[-1] - g[-3])/(s[-1] - s[-2]))/2 if gn == g[-1]: return g.append(gn) fs.append(f(gn)) yield g[-1], fs[-1] for a in [3, -3, 5]: for b in [3, -1, -2, 6]: print("##", a, b) for gn, fn in secmin(lambda x: (x-a)*(x-b), 1, 2, 15): print(gn, fn) k = lambda x: (x+1)*x*(x-1) for gn, fn in secmin(k, .7, .8, .9): print(gn, fn) .57735**2 x = sympy.symbols('x') ks = k(x) ks ks.diff().simplify() for gn, fn in secmin(k, .7, -.8, -.9): print(gn, fn) gn+(1/3)**(1/2) for i, (gn, fn) in enumerate(secmin(lambda x: (x+1)**3, 1, 2, 3)): print(i, gn, fn) for gn, fn in secmin(lambda x: math.sin(2*math.sin(x*5)), 1, 2, 3): print(gn, fn) math.sin(2*math.sin(2.3326063009*5))