export const MODEL_VERSION='1.0.0',DEFAULTS=Object.freeze({mode:'internal',U:1,R:1000,RA:1,RV:1000000}); export function validateParameters(p){if(!['internal','external'].includes(p.mode))throw new RangeError('接法');for(const[k,a,b]of[['U',.05,2],['R',10,1e6],['RA',.1,100],['RV',1e4,1e8]])if(!Number.isFinite(p[k])||p[k]b)throw new RangeError(k);return{...p};} export function response(p){validateParameters(p);const apparentResistance=p.mode==='internal'?p.R+p.RA:p.R*p.RV/(p.R+p.RV),current=p.U/apparentResistance;return{mode:p.mode,voltage:p.U,current_mA:1000*current,apparentResistance,errorPercent:100*(apparentResistance-p.R)/p.R};} export function plots(p){const us=Array.from({length:201},(_,i)=>.05+1.95*i/200),rs=Array.from({length:201},(_,i)=>10**(1+5*i/200));return[{caption:'内接与外接的伏安曲线',xLabel:'电流表示值 I / mA',yLabel:'电压表示值 U / V',legend:'实线:内接 虚线:外接',curves:['internal','external'].map(mode=>({points:us.map(U=>{const r=response({...p,mode,U});return[r.current_mA,U];})})),selected:[response(p).current_mA,p.U]},{caption:'不同待测电阻下的加载相对偏差',xLabel:'log₁₀(Rx / Ω)',yLabel:'加载偏差 / %',legend:'实线:内接 虚线:外接',curves:['internal','external'].map(mode=>({points:rs.map(R=>[Math.log10(R),response({...p,mode,R}).errorPercent])}))}];} export function analyzeRecords(rows,p){const s=rows.filter(r=>['mode','R','RA','RV'].every(k=>r.parameters[k]===p[k]));if(s.length<2)return'保持待测电阻与仪表内阻不变,改变电压并记录至少两点,可由原点拟合求表观电阻。';const a=s.reduce((v,r)=>v+r.readings.current_mA*.001*r.readings.voltage,0),b=s.reduce((v,r)=>v+(r.readings.current_mA*.001)**2,0);return'同组过原点拟合 U–I 斜率 '+(a/b).toFixed(7)+' Ω;请与待测电阻 '+p.R+' Ω 比较加载方向。';}