export const MODEL_VERSION='1.0.0',EXPERIMENT_ID='course-04/michelson-interferometer',DEFAULTS=Object.freeze({wavelength_nm:632.8,tilt_mrad:.25}); export function validateParameters(p){for(const[k,l,h]of[['wavelength_nm',400,700],['tilt_mrad',0,2]])if(!Number.isFinite(p[k])||p[k]h)throw new RangeError(`${k}须在${l}–${h}`);return{...p};} export function intensity(x_mm,mirror_um,p){validateParameters(p);if(!Number.isFinite(x_mm)||Math.abs(x_mm)>2||!Number.isFinite(mirror_um)||mirror_um<0||mirror_um>40)throw new RangeError('观察x在±2mm,动镜0–40μm');const opd_um=2*mirror_um+2*p.tilt_mrad*x_mm;return Math.cos(Math.PI*opd_um/(p.wavelength_nm*.001))**2;} export function intensityField(mirror_um,p,size=501){validateParameters(p);if(!Number.isInteger(size)||size<3||size>1001)throw new RangeError('图场网格无效');const row=[];for(let i=0;i40||end_um<=start_um)throw new RangeError('需要0–40μm内的正向位移');if(!Number.isInteger(fringe_count)||fringe_count<1||fringe_count>100)throw new RangeError('条纹数须为1–100整数');if(reversed)throw new RangeError('计数期间发生方向反转,请重新设定起点');return{experiment_id:EXPERIMENT_ID,model_version:MODEL_VERSION,parameters:{...p},source,mirror_start_um:start_um,mirror_end_um:end_um,fringe_count,mirror_shift_um:end_um-start_um,wavelength_estimate_nm:2*(end_um-start_um)/fringe_count*1000};} export function autoMeasurement(p,start_um,fringe_count){validateParameters(p);if(!Number.isInteger(fringe_count)||fringe_count<1||fringe_count>100)throw new RangeError('条纹数须为1–100整数');const end_um=start_um+fringe_count*p.wavelength_nm*.001/2;return measurement(p,start_um,end_um,fringe_count,'ideal-model');}