Зачем изобретать велосипед? Есть уже готовые процедуры даже в 3D.
Например, в Maple по команде
restart; with(plots); f := proc (a, b, c) options operator, arrow; c*exp(-(x-a)^2-(y-b)^2) end proc; moon := f(0, 0, -3)+f(2, 2, 2)+f(-2, -2, 2)+f(-1, 2, 3)+f(1, -2, 2)+f(2, 0, 2); plot3d(moon, x = -3 .. 3, y = -3 .. 3, contours = 20, style = patchcontour, axes = frame, shading = ZHUE, orientation = [60, 50]);
получается неплохой рисунок поверхности с изолиниями по высотам:
Изображение можно мышкой поворачивать как угодно, увеличивать, изучать экстремальные точки и т.д. Например, посмотреть в плане: