Great job and nice code! After read the code, I get a question:
In mesh.py, get_vertice() try to get the center point in each mesh cell. x = np.linspace(0, w, mesh_size) may corrected to x = np.linspace(0, w, mesh_size + 1) ? Since the get_vertice() was called without mesh_size+1.
Is that true ?