hamiltonian function