export const MODEL_VERSION='1.0.0',DEFAULTS=Object.freeze({mode:'current',currentRange_mA:5,voltageRange:1.5,inputFraction:.5,trim:1,direction:'up',R3:1100}); export function validateParameters(p){if(!['current','voltage'].includes(p.mode)||!['up','down'].includes(p.direction)||![1000,1100].includes(p.R3))throw new RangeError('功能/方向');for(const[k,a,b]of[['currentRange_mA',2,10],['voltageRange',.1,5],['inputFraction',0,1.2],['trim',.8,1.2]])if(!Number.isFinite(p[k])||p[k]b)throw new RangeError(k);return{...p};} export function response(p){validateParameters(p);const ig=.001,rg=30,full=p.mode==='current'?p.currentRange_mA*.001:p.voltageRange,reference=full*p.inputFraction,designResistance=p.mode==='current'?rg/(full/ig-1):full/ig-rg,actualResistance=designResistance*p.trim,head=p.mode==='current'?reference*actualResistance/(rg+actualResistance):reference/(rg+actualResistance),scale=p.mode==='current'?1000:1,indicated=head/ig*full*scale;return{mode:p.mode,reference:reference*scale,indicated,error:indicated-reference*scale,designResistance,actualResistance,direction:p.direction,headCurrent:head,overrange:head>ig};} export function plots(p){const qs=Array.from({length:201},(_,i)=>1.2*i/200);return[{caption:'改装示值误差与标准输入',xLabel:p.mode==='current'?'标准电流 / mA':'标准电压 / V',yLabel:p.mode==='current'?'示值差 / mA':'示值差 / V',curves:[{points:qs.map(inputFraction=>{const r=response({...p,inputFraction});return[r.reference,r.error];})}]},{caption:'欧姆表电池变化下所需调零电阻',xLabel:'电池 E / V',yLabel:'所需 Rw / Ω',legend:'实线:所需调零 虚线:470 Ω上限',curves:[{points:Array.from({length:101},(_,i)=>{const E=1.3+.3*i/100;return[E,E/.001-30-p.R3];})},{points:[[1.3,470],[1.6,470]]}]}];} export function analyzeRecords(rows,p){const s=rows.filter(r=>['mode','currentRange_mA','voltageRange','trim'].every(k=>r.parameters[k]===p[k]));if(!s.length)return'标准输入按上行/下行逐点扫描,比较示值差及相对满量程误差。';const max=Math.max(...s.map(r=>Math.abs(r.readings.error))),full=p.mode==='current'?p.currentRange_mA:p.voltageRange;return'同组最大示值差绝对值 '+max.toFixed(7)+(p.mode==='current'?' mA':' V')+',相对满量程 '+(max/full*100).toFixed(6)+'%;理想回路无迟滞。';}