iminuit1.py 841 B

12345678910111213141516171819202122232425262728293031
  1. """Use iminuit to find the minimum of a 3D scalar field"""
  2. from vedo import show, Point, Line, printc
  3. from iminuit import Minuit
  4. # pip install iminuit # https://github.com/scikit-hep/iminuit
  5. import numpy as np
  6. def fcn(x, y, z):
  7. f = (x - 4) ** 4 + (y - 3) ** 4 + (z - 2) ** 2
  8. if not vals or f < vals[-1]:
  9. path.append([x,y,z])
  10. vals.append(f)
  11. return f
  12. paths = []
  13. for x,y,z in np.random.rand(200, 3)*3:
  14. path, vals = [], []
  15. m = Minuit(fcn, x=x, y=y, z=z)
  16. m.errordef = m.LEAST_SQUARES
  17. # m.simplex() # run simplex optimiser
  18. m.migrad() # run migrad optimiser
  19. line = Line(path).cmap('jet_r', vals).lw(2).alpha(0.25)
  20. paths.append(line)
  21. printc('Last optimization output:', c='green7', invert=1)
  22. printc(m, c='green7', italic=1)
  23. show(paths, Point([4,3,2]), __doc__, axes=1).close()