export const MODEL_VERSION='1.0.0',DEFAULTS=Object.freeze({coils:'double',current_mA:300,radius_cm:10.5,spacingRatio:1,positionRatio:0}); export function validateParameters(p){if(!['single','double'].includes(p.coils))throw new RangeError('线圈');for(const[k,a,b]of[['current_mA',100,800],['radius_cm',8,15],['spacingRatio',.5,1.5],['positionRatio',-2,2]])if(!Number.isFinite(p[k])||p[k]b)throw new RangeError(k);return{...p};} function field(p,x){const R=p.radius_cm*.01,I=p.current_mA*.001,centers=p.coils==='single'?[0]:[-p.spacingRatio*R/2,p.spacingRatio*R/2];return centers.reduce((s,c)=>s+4*Math.PI*1e-7*500*I*R*R/(2*(R*R+(x-c)**2)**1.5),0)*1000;} export function response(p){validateParameters(p);const x=p.positionRatio*p.radius_cm*.01,B=field(p,x),B0=field(p,0);return{position_mm:x*1000,field_mT:B,centerField_mT:B0,normalized:B/B0,relativeDeviationPercent:100*(B/B0-1)};} export function plots(p){const qs=Array.from({length:201},(_,i)=>-2+4*i/200);return[{caption:'轴向磁场与移动探针',xLabel:'轴向位置 x / R',yLabel:'轴向场 Bz / mT',curves:[{points:qs.map(positionRatio=>[positionRatio,response({...p,positionRatio}).field_mT])}],selected:[p.positionRatio,response(p).field_mT]},{caption:'双线圈间距对中心附近均匀性的影响',xLabel:'轴向位置 x / R',yLabel:'归一化 B(x) / B(0)',legend:'实线d/R=0.5;虚线依次1、1.5',curves:[.5,1,1.5].map(spacingRatio=>({points:qs.map(positionRatio=>[positionRatio,response({...p,coils:'double',spacingRatio,positionRatio}).normalized])}))}];} export function analyzeRecords(rows,p){const s=rows.filter(r=>['coils','current_mA','radius_cm','spacingRatio'].every(k=>r.parameters[k]===p[k]));if(!s.length)return'固定线圈与电流,沿轴线采样,比较中心附近的相对偏差。';const spread=Math.max(...s.map(r=>r.readings.field_mT))-Math.min(...s.map(r=>r.readings.field_mT));return'同组 '+s.length+' 个位置,已采样场极差 '+spread.toFixed(8)+' mT,除以中心场为 '+(spread/response(p).centerField_mT*100).toFixed(6)+'%;范围仅指实际采样位置。';}