Files
imdd_silas/Theory/Dissertation/dispersion_contour_bivariate.m
2026-03-25 10:57:48 +01:00

142 lines
5.4 KiB
Matlab

% Festen Betriebsparameter
lambda = 1290; % nm
L = 1; % km
mu_zwd = 1317; % nm
sigma_zwd = 2; % nm
mu_s0 = 0.0872; % ps / nm2 km
sigma_s0 = 0.0012; % ps / nm2 km
rho = -0.5; % Korrelation
% Gitter für lambda0 und S0
lambda0_vec = linspace(mu_zwd-10, mu_zwd+10, 100);
S0_vec = linspace(mu_s0-0.01, mu_s0+0.01, 100);
% Korrigierte meshgrid Reihenfolge
[S0, Lambda0] = meshgrid(S0_vec, lambda0_vec);
% Dispersion berechnen
D = (S0./4) .* ( lambda - (Lambda0.^4)./(lambda^3) ) * L;
% 2D Verteilung (Bivariate Gauss) berechnen
Z_x = (S0 - mu_s0) / sigma_s0;
Z_y = (Lambda0 - mu_zwd) / sigma_zwd;
PDF_2D = exp(-1 / (2 * (1 - rho^2)) * (Z_x.^2 - 2 * rho .* Z_x .* Z_y + Z_y.^2));
%% Plot zusammenbauen
figure('Color','w');
hold on % EINZIGES hold on für den gesamten Plot!
% --- 1. ZUERST: 2D Verteilung (Bivariate Gauss) "ganz unten" ---
numLevels_2D = 6;
colors_2D = cbrewer2('Greys', numLevels_2D+0);
colors_2D = colors_2D(1:numLevels_2D,:);
% Nur die Anzahl der Level übergeben!
[C2, h2] = contourf(S0, Lambda0, PDF_2D, numLevels_2D);
h2.HandleVisibility='off';
% Colormap für die rote Fläche setzen
colormap(gcf, colors_2D(1:end,:));
try
clim([min(PDF_2D(:)), max(PDF_2D(:))]);
catch
caxis([min(PDF_2D(:)), max(PDF_2D(:))]);
end
h2.EdgeColor = 'none'; % Keine schwarzen Ränder
% --- 2. DARÜBER: Dispersions-Konturlinien ---
numLevels_D = 9;
% Erzeuge glatte, auf 1 Nachkommastelle gerundete Werte
levels_D = round(linspace(min(D(:)), max(D(:)), numLevels_D), 1);
levels_D = unique(levels_D);
cmap_bg = flip(cbrewer2('Blues', length(levels_D)+3));
for i = 1:length(levels_D)
% Konturlinien zeichnen (explizit Schwarz)
[C,h] = contour(S0, Lambda0, D, [levels_D(i), levels_D(i)], ...
'Color', cmap_bg(i,:),...
'LineWidth', 1, ...
'ShowText', 'off','handlevisibility','off');
if i == 1
h.HandleVisibility='on';
h.DisplayName='$D(\lambda=1290)$';
end
end
% --- 3. MANUELLE TEXTBOXEN AUF DEN LINIEN ---
% Wähle eine feste S0-Position für alle Beschriftungen (z.B. bei 0.082)
S0_label = 0.095;
for i = 1:length(levels_D)
% Berechne exakte ZDW (Y-Koordinate) durch Umstellen der D-Formel:
% Lambda0 = (lambda^3 * (lambda - 4*D / (S0 * L)))^(1/4)
zdw_label = (lambda^3 * (lambda - 4*levels_D(i) / (S0_label * L)))^0.25;
% Nur zeichnen, wenn der Punkt auch im sichtbaren Plot-Bereich liegt
if zdw_label >= min(lambda0_vec) && zdw_label <= max(lambda0_vec)
text(S0_label, zdw_label, sprintf('%0.1f', levels_D(i)), ...
'Color', 'k', ...
'BackgroundColor', 'w', ... % Weiße Box überdeckt die schwarze Linie!
'Margin', 2, ... % Abstand der Box zum Text
'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'middle', ...
'FontSize', 10);
end
end
% --- 3. GANZ OBEN: Randverteilungen (1D Gauss) an den Achsen ---
% S0 Verteilung (unten)
s0_vals = linspace(min(S0_vec), max(S0_vec), 500);
gauss_s0 = exp(-0.5*((s0_vals - mu_s0)/sigma_s0).^2);
scale_s0 = 4;
y_s0_base = min(lambda0_vec);
plot(s0_vals, y_s0_base + gauss_s0 * scale_s0, 'LineWidth', 1,'LineStyle','--','DisplayName','$S_0$','Color',[0,0,0],'HandleVisibility','off');
% ANNOTATION S0: Automatisch platziert leicht über dem Peak
str_s0 = sprintf('\\mu_{S0} = %.4f\n\\sigma_{S0} = %.4f', mu_s0, sigma_s0);
text(0.0915,1308, str_s0, ...
'Interpreter', 'tex', ...
'HorizontalAlignment', 'left', ... % Entspricht 'right' in TikZ
'VerticalAlignment', 'middle', ...
'BackgroundColor', 'w', ... % Entspricht 'fill=white'
'EdgeColor', 'k', ... % Entspricht 'draw=black'
'Margin', 1, ... % Entspricht 'inner sep=1pt'
'FontSize', 10);
% ZDW Verteilung (links)
% ZDW Verteilung (links)
zwd_vals = linspace(min(lambda0_vec), max(lambda0_vec), 500);
gauss_zwd = exp(-0.5*((zwd_vals - mu_zwd)/sigma_zwd).^2);
scale_zwd = 0.005;
x_zwd_base = min(S0_vec);
plot(x_zwd_base + gauss_zwd * scale_zwd, zwd_vals, 'LineWidth', 1,'LineStyle','--','DisplayName','ZDW','Color',[0,0,0],'HandleVisibility','off');
% ANNOTATION ZDW: Automatisch platziert leicht rechts neben dem Peak
str_zwd = sprintf('\\mu_{ZDW} = %.1f\n\\sigma_{ZDW} = %.1f', mu_zwd, sigma_zwd);
text(0.079,1312, str_zwd, ...
'Interpreter', 'tex', ...
'HorizontalAlignment', 'left', ... % Entspricht 'right' in TikZ
'VerticalAlignment', 'middle', ...
'BackgroundColor', 'w', ... % Entspricht 'fill=white'
'EdgeColor', 'k', ... % Entspricht 'draw=black'
'Margin', 1, ... % Entspricht 'inner sep=1pt'
'FontSize', 10);
% Hilfslinien für die Mittelwerte
% xline(mu_s0,'LineWidth',0.5,'HandleVisibility','off','LineStyle',':');
% yline(mu_zwd,'LineWidth',0.5,'HandleVisibility','off','LineStyle',':');
% --- Achsenbeschriftung, Titel & Formatierung ---
xlabel('$S_0$ [$\nicefrac{\text{ps}}{(\text{nm}^2\text{ km})}$]', 'FontSize', 12);
ylabel('ZDW [nm]', 'FontSize', 12);
% title(sprintf('Dispersion: %d km; %d nm', L, lambda), 'FontSize', 14);
grid on
% Exakte Begrenzung, damit die Randverteilungen bündig anliegen
axis([min(S0_vec) max(S0_vec) min(lambda0_vec) max(lambda0_vec)]);
% legend;
hold off % EINZIGES hold off ganz am Ende!
%% Export
% Hier erzwingen wir die rote Colormap für pgfplots, damit mat2tikz es nicht blau exportiert!
mat2tikz_improved("C:/Users/Silas/Documents/6971e0b65b380ca6d71c837f/02_IMDD_System/tikz/dispersion/dispersion_contour_bi2.tikz");