theory stuff for dissertation

This commit is contained in:
Silas Oettinghaus
2026-03-24 15:09:15 +01:00
parent 9dccca8ff9
commit 9446dfb888
3 changed files with 27 additions and 156 deletions

View File

@@ -18,7 +18,7 @@ Dacc_surface = zeros(numel(L_values), numel(f_targets));
for iL = 1:numel(L_values)
L = L_values(iL);
[lambda_vec, Dacc_vec] = lambda_for_first_null_full(f_targets, L, lambda0, S0);
% Store the 1x absolute offset |lambda - lambda0|
lambda_surface(iL, :) = abs(lambda0 - lambda_vec);
Dacc_surface(iL, :) = Dacc_vec;
@@ -38,7 +38,7 @@ hold on;
lambda_levels = unique([50:-10:30, 30:-5:5]);
% Contour plot
[C,h] = contour(f_GHz, L_km, lambda_surface_nm, lambda_levels, ...
[C,h] = contourf(f_GHz, L_km, lambda_surface_nm, lambda_levels, ...
'LineWidth', 1.2, ...
'ShowText', 'off');
@@ -53,19 +53,19 @@ ylabel(cb, '$\Delta \lambda$ [nm]', 'Interpreter', 'latex');
% Find placement along the first-null curve for each level
for i = 1:length(lambda_levels)
lvl = lambda_levels(i);
% Re-calculate the specific (f, L) curve for this delta-lambda
lambda_target = lambda0 - (lvl * 1e-9);
LHS = -( (S0*1e3) / 4 ) * (lambda_target - (lambda0^4)/(lambda_target^3)) * lambda_target^2;
const_val = (c*0.5) / LHS;
f_curve_GHz = linspace(min(f_GHz), max(f_GHz), 500);
L_curve_km = const_val ./ (f_curve_GHz * 1e9).^2 / 1000;
% Filter for points within the plot axes
in_bounds = find(L_curve_km >= min(L_km)*1.1 & L_curve_km <= max(L_km)*0.9 & ...
f_curve_GHz >= min(f_GHz)*1.1 & f_curve_GHz <= max(f_GHz)*0.9);
if ~isempty(in_bounds)
% Specific alternating pattern for weight to minimize overlapping
if i < 9
@@ -74,7 +74,7 @@ for i = 1:length(lambda_levels)
weight = 0.05 + 0.1 * mod(i, 2);
end
idx = in_bounds(max(1, min(length(in_bounds), round(length(in_bounds) * weight))));
text(f_curve_GHz(idx), L_curve_km(idx), sprintf('%g nm', lvl), ...
'Color', 'k', 'BackgroundColor', 'w', 'Margin', 1.5, ...
'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle', ...
@@ -98,7 +98,7 @@ if 0
max_D = max(Dacc_surface(:), [], 'omitnan');
% Calculate 3 integer levels well within the data range
D_levels = unique(round(linspace(min_D*0.8, max_D*0.8, 3)));
[CS, h] = contour(f_GHz, L_km, Dacc_surface, D_levels, 'k--', 'LineWidth', 0.8);
clabel(CS, h, 'Color','k', 'FontSize',8);
end
@@ -106,7 +106,7 @@ end
%% 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_power_fading_contour2.tikz");
% mat2tikz_improved("C:/Users/Silas/Documents/6971e0b65b380ca6d71c837f/02_IMDD_System/tikz/dispersion/dispersion_power_fading_contour2.tikz");
function [lambda_vec, Dacc_vec] = lambda_for_first_null_full(f_target, L, lambda0, S0)
% lambda_for_first_null_full (stable, single-branch + validity checks)
@@ -148,10 +148,10 @@ Dacc_vec = NaN(N,1);
for k = 1:N
RHS = c * 0.5 / (f_target(k)^2 * L);
% Normal-dispersion branch (λ < λ0)
fun = @(lambda) -(S0_si/4).*(lambda - (lambda0^4)./(lambda.^3)).*lambda.^2 - RHS;
% Limit the search to [λ_min, λ0)
try
lambda_sol = fzero(fun, [lambda_min, lambda0 * 0.999]);
@@ -159,18 +159,18 @@ for k = 1:N
% If the zero is not within bounds, skip this point
lambda_sol = NaN;
end
% Validate solution
if isnan(lambda_sol) || lambda_sol < lambda_min || lambda_sol > lambda_max
lambda_vec(k) = NaN;
Dacc_vec(k) = NaN;
continue
end
% Compute D(lambda) and accumulated dispersion
D_lambda = (S0_si/4) * (lambda_sol - (lambda0^4)/(lambda_sol^3)) / 1e-6; % ps/(nm·km)
Dacc_val = D_lambda * (L/1000); % ps/nm
% Sanity bound on dispersion (avoid unphysical > ±100 ps/nm)
if abs(Dacc_val) > 100
lambda_vec(k) = NaN;