Skypia_Counterweight_Psync.mlx
%% 1. Parameters (Edit these values)
m_cargo = 2000; % Cargo mass in kg (Max 3000)
r_initial = 180; % Starting position of elevator (m)
r_final = 20; % Ending position of elevator (m)
V_e = 0.75; % elevator speed (m/s)
t_total = abs(r_initial-r_final)/V_e; % Total transit time in seconds (4 minutes)
% System Constants
m_elevator_empty = 2000; % Base elevator mass (kg)
R_rim = 200; % Radius of the rim tanks (m)
m_buffer = 500; % Safety buffer mass (kg)
N_tanks = 2; % Number of rim tanks
n_elevators = 2; % Number of synced elevator/CW pairs
%% 2. Calculations
m_e = m_elevator_empty + m_cargo; % Total mass per elevator unit
v = (r_final - r_initial) / t_total; % Velocity (m/s)
% Time vector
t = linspace(0, t_total, 500);
% Positions over time
r_e = r_initial + v * t; % Elevator position
r_cw = 200 - r_e; % Counterweight position (r_cw = 200 - r_e)
% Balancing Equation:
% Target Inertia is based on r_e = 200, r_cw = 0 (The "heaviest" state)
% I_target = n_elevators * m_e * (200^2 + 0^2)
% Current I = n_elevators * m_e * (r_e^2 + r_cw^2)
% Mass needed per tank = (I_target - I_moving) / (N_tanks * R_rim^2) + buffer
numerator = (200^2 + 0^2) - (r_e.^2 + r_cw.^2);
m_rim = (m_e / R_rim^2) * numerator + m_buffer;
%% 3. Plotting
figure('Color', 'w', 'Name', 'Monarch Ballast Control');
plot(t/60, m_rim, 'LineWidth', 2.5, 'Color', [0 0.4470 0.7410]);
hold on;
% Find and mark the 100m midpoint
[m_peak, idx] = max(m_rim);
t_peak = t(idx);
plot(t_peak/60, m_peak, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r');
% Formatting
grid on;
ax = gca;
ax.GridLineStyle = '--';
ax.FontSize = 11;
title(['Rim Tank Mass: ', num2str(r_initial), 'm to ', num2str(r_final), 'm'], 'FontSize', 14);
subtitle(['Cargo: ', num2str(m_cargo), ' kg | Velocity: ', num2str(v), ' m/s']);
xlabel('Time (Minutes)');
ylabel('Water Mass per Tank (kg)');
legend('Rim Tank Mass', 'Midpoint Peak (100m)', 'Location', 'best');
% Text annotation for peak
text(t_peak/60, m_peak + 100, sprintf(' Peak: %.1f kg', m_peak), 'FontWeight', 'bold');
fprintf('--- Monarch Balancing Report ---\n');
fprintf('Start Mass: %.2f kg\n', m_rim(1));
fprintf('Peak Mass (at 100m): %.2f kg\n', m_peak);
fprintf('End Mass: %.2f kg\n', m_rim(end));