clc
clear all
close all

% First way: meshgrid + mesh (or surf)
figure
X = -3:.05:3;
Y = X;
[x, y] = meshgrid(X, Y);
z = x.^2 + y.^2;
surf(x, y, z)
xlabel('x')
ylabel('y')
zlabel('z')

figure
contour(x, y, z) % or contourf
xlabel('x')
ylabel('y')
grid

% If you want to display the levels, do as follows:
figure
[c] = contour(x, y, z)
clabel(c);
xlabel('x')
ylabel('y')
grid

% Second way: anonymous function fsurf
figure
z = @(x, y) x.^2 + y.^2;
fsurf(z, [-3 3 -3 3])
xlabel('x')
ylabel('y')
zlabel('z')

figure
fcontour(z) 
% I could also specify the intervals
% fcontour(z, [-3, 3, -3, 3])
xlabel('x')
ylabel('y')
grid on

% If I also want to display the level, I need to use a handle
figure
h = fcontour(z);
xlabel('x')
ylabel('y')
grid on
h.LevelList = [2, 4, 6, 8];
colorbar

figure
X = -1.5:.05:1.5;
Y = X;
[x, y] = meshgrid(X, Y);
z = exp(x.*y);
surf(x, y, z)
xlabel('x')
ylabel('y')
zlabel('z')

figure
[c] = contour(x, y, z);
clabel(c);
xlabel('x')
ylabel('y')
grid on