% MODELARE ȘI SIMULARE - 2026/2027
% Laboratorul nr. 1 - MATLAB (1)
% Codul problemelor din laborator. Fiecare secțiune (%%) se poate rula separat cu Run Section.

%% Problema 1.1 - Energie cinetică pentru un vehicul electric
clear; clc; close all

m = 800:200:1600;        % mase [kg]
v_kmh = 20:20:100;       % viteze [km/h]
v_ms = v_kmh/3.6;        % conversie în [m/s]

Ek = 0.5*(m')*(v_ms.^2); % energie [J]
Ek_kJ = Ek/1000;         % energie [kJ]

T_Ek = array2table(Ek_kJ, ...
    'VariableNames', compose('v_%d_kmh', v_kmh), ...
    'RowNames', compose('m_%d_kg', m));

disp(T_Ek)

figure
plot(v_kmh, Ek_kJ', 'LineWidth', 1.5)
grid on
xlabel('Viteza [km/h]')
ylabel('Energia cinetică [kJ]')
title('Energia cinetică pentru mase diferite')
legend(compose('m = %d kg', m), 'Location', 'northwest')

%% Problema 1.2 - Fereastra sigură de urcare pentru o dronă
clear; clc; close all

h0 = 2;          % altitudine inițială [m]
vc = 3;          % viteză verticală medie [m/s]
A = 2;           % amplitudinea perturbației [m/s]
omega = 0.8;     % pulsație [rad/s]

t = linspace(0,10,501);
h = h0 + vc*t;                         % model nominal al altitudinii
vz = vc + A*sin(omega*t);              % viteză verticală măsurată

% Condițiile ferestrei sigure de urcare
conditie = (h >= 12) & (h <= 25) & (vz <= 3.5);
idx = find(conditie);

t1 = t(idx(1));
t2 = t(idx(end));
fprintf('Metoda 1: interval aproximativ [%.2f, %.2f] s\n', t1, t2)

% Metoda 2: indexare logică
t_selectat = t(conditie);
fprintf('Metoda 2: interval aproximativ [%.2f, %.2f] s\n', ...
    t_selectat(1), t_selectat(end))

figure
plot(t,h,'LineWidth',1.5); hold on
plot(t(conditie),h(conditie),'LineWidth',3)
yline(12,'--'); yline(25,'--')
grid on
xlabel('t [s]'); ylabel('h [m]')
title('Fereastra sigură - condiția de altitudine')

figure
plot(t,vz,'LineWidth',1.5); hold on
plot(t(conditie),vz(conditie),'LineWidth',3)
yline(3.5,'--')
grid on
xlabel('t [s]'); ylabel('v_z [m/s]')
title('Fereastra sigură - condiția de viteză')

%% PRO 1.3 - Alarmă pentru baterie și temperatură
clear; clc; close all
t = linspace(0,20,401);       % timp [min]
B = 100 - 4.5*t;              % baterie [%]
Ta = 25;                      % temperatura ambiantă [°C]
DeltaT = 60;                  % creșterea de temperatură la regim stationar [°C]
tau = 6;                      % constanta de timp termică [min]
Temp = Ta + DeltaT*(1-exp(-t/tau));

% Măști logice separate
alarma_B = B < 30;
alarma_T = Temp > 70;

% Alarma generală: este suficientă oricare dintre cele două cauze (SAU)
alarma = alarma_B | alarma_T;

idx = find(alarma);
fprintf('Prima alarmă generală apare la t = %.2f min\n', t(idx(1)))

idxB = find(alarma_B,1,'first');
idxT = find(alarma_T,1,'first');
fprintf('Alarmă temperatură: t = %.2f min\n', t(idxT))
fprintf('Alarmă baterie: t = %.2f min\n', t(idxB))

figure
tiledlayout(3,1)

nexttile
plot(t,B,'LineWidth',1.5); hold on
plot(t(alarma_B),B(alarma_B),'LineWidth',3)
yline(30,'--')
grid on
ylabel('Baterie [%]')
title('Alarmă baterie: B < 30%')

nexttile
plot(t,Temp,'LineWidth',1.5); hold on
plot(t(alarma_T),Temp(alarma_T),'LineWidth',3)
yline(70,'--')
grid on
ylabel('Temperatură [°C]')
title('Alarmă temperatură: T > 70 °C')

nexttile
stairs(t,alarma,'LineWidth',2)
ylim([-0.1 1.1])
yticks([0 1])
yticklabels({'OFF','ON'})
grid on
xlabel('t [min]')
title('Starea alarmei generale: alarma_B | alarma_T')

%% Problema 1.4 - Curățarea unui semnal experimental
clear; clc; close all

x = [0.82, -0.03, 1.15, 0.04, -2.40, 0.00, 0.51, -0.02, 1.90];
prag = 0.05;

% Varianta 1: cu for
utile = [];
eliminate = [];

for k = 1:length(x)
    if abs(x(k)) >= prag
        utile = [utile, x(k)];
    else
        eliminate = [eliminate, x(k)];
    end
end

x_for = [utile, zeros(size(eliminate))]

% Varianta 2: cu indexare logică
masca_utile = abs(x) >= prag;
x_logic = [x(masca_utile), zeros(1,sum(~masca_utile))]

% Verificare
isequal(x_for, x_logic)

%% Problema 1.5 - Traiectoria 3D a unei drone în prezența vântului
clear; clc; close all

R = 12;            % raza manevrei [m]
z0 = 5;            % altitudine inițială [m]
vz = 1.5;          % viteză verticală [m/s]
omega = 0.5;       % pulsație [rad/s]
t = linspace(0,25,500);

vant_x = [0, -2, 2];   % fără vânt, Vest, Est [m/s]
nume = {'fără vânt','vânt spre Vest','vânt spre Est'};

figure
tiledlayout(1,2)

% Vedere 3D
nexttile
hold on
for i = 1:length(vant_x)
    x = R*cos(omega*t) + vant_x(i)*t;
    y = R*sin(omega*t);
    z = z0 + vz*t;
    plot3(x,y,z,'LineWidth',1.5)  % grafic 3D cu functia plot3
end
grid on
xlabel('x - est [m]')
ylabel('y - nord [m]')
zlabel('z - altitudine [m]')
title('Vedere 3D')
view(35,25)
axis tight

% Vedere de sus: proiecția în planul x-y
nexttile
hold on
for i = 1:length(vant_x)
    x = R*cos(omega*t) + vant_x(i)*t;
    y = R*sin(omega*t);
    plot(x,y,'LineWidth',1.5)  % se cere vedere de sus, deci doar in planul xy, functia plot
end
grid on
axis equal
xlabel('x - est [m]')
ylabel('y - nord [m]')
title('Vedere de sus')
legend(nume,'Location','best')

%% PRO 1.6 - Hartă termică (heat map) a unui modul electronic
clear; clc; close all

rng(7)
T = randi([25,85],10,10);

figure
imagesc(T)
colorbar
axis equal tight
xlabel('Coloana senzorului')
ylabel('Linia senzorului')
title('Hartă termică a modulului electronic')

prag = 70;
zone_fierbinti = T > prag;
numar_puncte = sum(zone_fierbinti,'all');
[linie, coloana] = find(zone_fierbinti);

fprintf('Număr puncte peste prag: %d\n', numar_puncte)
TabelZone = table(linie, coloana, T(zone_fierbinti), ...
    'VariableNames', {'Linie','Coloana','Temperatura'});
disp(TabelZone)

%% PRO 1.7 - Matrice de senzori pentru o platformă robotică
clear; clc; close all

rng(4)
S = rand(8,8);

valoare_maxima = max(S,[],'all');
valoare_minima = min(S,[],'all');

[linie_max, coloana_max] = find(S == valoare_maxima);

fprintf('Valoare maximă: %.4f\n', valoare_maxima)
fprintf('Valoare minimă: %.4f\n', valoare_minima)

table(linie_max, coloana_max, ...
    'VariableNames', {'Linie','Coloana'})
