function dispersion_vector = getDispersionVector(N, D, ref_zdw, randomize_ZDW, randomkey) % s.MATLAB version of the Python generator shown above. % Returns an N×1 vector (ps/(nm·km)). % % D is the nominal dispersion magnitude. For D>0 the link is segmented with % alternating sign (+D, -D, +D, …). For D==0 it is flat (0) except for % ZDW randomization. The ZDW detuning is ~N(0, 2 nm) around 1310 nm and is % converted to dispersion via 0.09 ps/(nm·km) per nm. % constants (matching the Python code) meanLambda_nm = 1310; % center wavelength sigma_nm = 2; % ZDW sigma Dslope = 0.07; % ps/(nm·km) per nm detuning % random ZDW-induced dispersion offset if randomize_ZDW rng(randomkey, 'twister'); rand_zdws_nm = meanLambda_nm + sigma_nm .* randn(N,1); rand_D = (rand_zdws_nm - ref_zdw) .* Dslope; % ps/(nm·km) else rand_D = zeros(N,1); end % nominal segmented pattern (match Python intent; keep length N) if D > 0 base = (-1) .^ ((0:N-1).'); % +1,-1,+1,-1,... else % D == 0 (or anything else) base = ones(N,1); end dispersion_vector = base .* D + rand_D; % ps/(nm·km) end