% Det här är en script-fil som berättar om hur man konstruerar
% en graf till en funktion av två variabler (dvs en funktionsyta).
%                                                       /|\ y
% Vi börjar med att plotta grafen till funktionen    ____|3______
%                f(x,y)=x+cos(x.^2 + y.^3),          |   |       |
% över något lämpligt område D i planet.             |   |  D    |
% Vi väljer D: -1 < x < 2, 1 < y < 3:                |___|______ |
%                                                       1|         
%                                                ________|__________\ x
%                                                   -1   |       2  /

close all              % Vi stänger alla figurfönster
x = -2:0.1:2; y = 1:0.1:3;     % Steglängden 0.1 är indelningens finhet.

% Härnäst måste vi skapa ett rutnät i xy-planet som svarar mot, i vårt 
% fall, området D = [-1 2]x[1 3]. Detta rutnät använder sedan MATLAB för
% att generera grafen:

[X,Y] = meshgrid(x,y);      % Rutnätet genereras: Det består av  
                            % (1+(3/0.1))*(1+2/0.1) = 31*21 = 651 punkter.
% För varje punkt i rutnätet innehåller matriserna X och Y motsvarande  
% x-koordinat respektive y-koordinat.
%
% För att skapa grafen måste vi till sist bestämma alla funktionsvärden z = f(x,y) 
% i dessa punkter.

Z = X + cos((X.^2 + Y.^3));
% Härnäst plottar vi funktionsytan i graffönster 1 och sedan några nivåkurvor i 
% graffönster 2:

figure(1)
mesh(X,Y,Z)
pause

figure(2)
contour(X,Y,Z,4);   % Den sista siffran anger antalet nivåkurvor som skall ritas.
pause

% Experimentera nu genom att ändra i uttrycket för f(x,y)och genom att byta område.
% Fundera också över vad det innebär beräkningsmässigt att ändra i finheten i rutnätet 
% ovan.

% Det områden vi tittade på ovan är rektangulära, låt oss nu istället konstruera 
% funktionsytor över områden vars rand kan beskrivas enkelt i polära koordinater.
% Vi kan tex välja  D: x^2 + y^2 < 3  (En cirkel med centrum i origo och radie roten 
% ur tre.) I polära koordinater är det enkelt att beskriva området: Med
%      r=sqrt(x^2 + y^2) (avståndet till origo) och
%      v=vinkeln mellan vektorn (x,y) och x-axeln
% så erhålls att
%      0<= r < sqrt(3) och  0<= v < 2*pi  (ett rektanulärt område E i "r,v-koordinater".
% Eftersom  x=r.*cos(v) och y=r.*sin(v), kan vi nu konstruera den sökta funktionsytan 
% enligt följande:
%
% Steg 1: vi gör en rutnätsindelning av det rektangulära området E,

r=0:.05:sqrt(3);v=0:.1:(2.*pi+.05);
[R,V]=meshgrid(r,v);

% Steg2: Med hjälp av denna indelning får vi nu också en cirkulär rutnätsindelning av 
% området D:

X=R.*cos(V);Y=R.*sin(V);

% Steg 3: Till sist beräknar vi funktionsvärden och plottar grafen:

Z = X + cos((X.^2 + Y.^3));

figure(3) 
mesh(X,Y,Z)
pause

figure(4)
contour(X,Y,Z,4);


h = findobj('Type','patch');
set(h,'LineWidth',2)
