% CVICENI - 7
% STRUKTURA: Promenna obsahuje dalsi promenne ruznych typu
% i funkce apod...
%

% Struktura v MATLABu a její použití.
% Realizace funkce s argumentem struktura.
% Výpočet plochy metodou Monte Carlo.
% Podrobnější práce s grafikou,
% grafy ve 3D, export obrázku do souboru, příkaz print.
% Popis grafu a znázorněných veličin

clc;
clear all;

% priklad struktury:
osoba = struct('jmeno',"PAVEL",'prijmeni', "NOVAK", 'vek', 20, 'znamka', 2);

% jiny priklad:
lidi = struct('jmeno',{"Abel","Max"},...
              'prijmeni',{"Lempl","Okurka"},...
              'vek',{20,20},...
              'body',{[20,10,50],[0,2,1]});

% lze definovat i takto:
data.x = linspace(0,2*pi); 
data.y = sin(data.x); 
data.f = @(x) sin(2*x);
data.title = 'y = sin(x)';

% pristup k promennym:
osoba.jmeno
osoba.vek

% dalsi priklad:
lidi(1).jmeno % Abel
lidi(2).jmeno % Max

% dva ruzne zpusoby jak zobrazit data: data.y vs data.f (pomoci fce...)
fig = figure(1);
% fig.Color = [0.1 0.9 0.9];
hold on
plot(data.x, data.y)
plot(data.x, data.f(data.x))
hold off

% t = '$sin(x)$ and $\frac{d}{dx}sin(x)$';
% title(t,'interpreter','latex')
title(data.title)

fig = figure(2);

% Funkce, 3D grafy
f = @(x,y) x.^2+y.^2
fcontour(f)

[x,y] = meshgrid(-10:0.5:10, -10:0.5:10);
DxDt = 8*x+y;     %1. rovnice
DyDt = 4*x+4*y;   %2. rovnice
X0=[5;6];         %poč. podmínka

fig = figure(3),
grid on
quiver(x,y,DxDt,DyDt, 'DisplayName','směrové pole')

[xx,yy] = meshgrid(-1:0.4:1,-1:0.4:1);
f = @(x,y) 2 - x.^2 - y.^2;
% Fce dvou promennych
fig = figure(4) 
surf(xx,yy,f(xx,yy)); %plocha
mesh(xx,yy,f(xx,yy)); %mrizka

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% subplots:
x = linspace(0, 2*pi, 1000);

y1 = sin(2*x);
y2 = sin(3*x);
y3 = sin(4*x);
y4 = sin(5*x);

fig = figure(5);

% Subplot 1: sin(2x)
subplot(2, 2, 1);
plot(x, y1, 'r');
title('sin(2x)');
xlabel('x');
ylabel('Amplitude');

% Subplot 2: sin(3x)
subplot(2, 2, 2);
plot(x, y2, 'g');
title('sin(3x)');
xlabel('x');
ylabel('Amplitude');

% Subplot 3: sin(4x)
subplot(2, 2, 3);
plot(x, y3, 'b');
title('sin(4x)');
xlabel('x');
ylabel('Amplitude');

% Subplot 4: sin(5x)
subplot(2, 2, 4);
plot(x, y4, 'm');
title('sin(5x)');
xlabel('x');
ylabel('Amplitude');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ANIMACE
fig = figure(6);
hold on
for t=-4*pi:0.1:4*pi
   x=R*cos(t/4).^3;
   y=R*sin(t/4).^3;
   plot(x,y,'.')
   pause(0.1)
end
hold off

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Vypocet integralu, Monte-Carlo:
% vyhody: integrace vice-dimenzionalnich integralu
%         integrace v komplexnich domenach
%         vysoce oscilujici funkce, komplexni promenne, snadna paralelizace
% nevyhody: pro jednoduche funkce, 1D, apod. je casove narocne

% I = int(log(x)) from 1 to 2
% definice funkce ln(x)
f = @(x) log(x); 
% pocet celkovych iteraci
TOT = 1e4; 
% definice rozmeru obdelniku a jeho obsahu
DX = 1;
DY = log(2);
S = DX * DY;
% inicializace promennych pro vypocet bodu nad/pod krivkou ln(x)
IN = 0;
OUT = 0;
% vytvoreni okna animace
figure;
xlim([1, 2]);
ylim([0, log(2)]);
xlabel('x');
ylabel('y');
title('Monte Carlo integrace: ln(x), x: [1,2]');

%hold on;
for i = 1:TOT
    x = 1 + rand();      % Random x: [1,2]    
    y = rand() * log(2); % Random y: [0,ln(2)]
    
    if y <= f(x)
        % bod pod krivkou
        %plot(x, y, 'ro'); 
        IN = IN + 1;
        b_in(IN,:) = [x;y];
    else
        % bod nad krivkou
        %plot(x, y, 'bo');
        OUT = OUT + 1; 
        b_out(OUT,:) = [x;y];
    end        
    % Update grafu v realnem case
    %drawnow;
end
%hold off;

% Monte Carlo
I = IN / TOT * S;
% presna hodnota
I_exact = log(4) - 1;

% tisk naraz
hold on;
plot(b_in(:,1), b_in(:,2), 'ro')
plot(b_out(:,1), b_out(:,2), 'bo')
hold off;
print("Monte-Carlo","-dpng");

fprintf('Estimated integral value: %.6f\n', I);
fprintf('Exact integral value: %.6f\n', I_exact);




