export const MODEL_VERSION='1.0.0',DEFAULTS=Object.freeze({unknown_mOhm:2,standard_mOhm:2,ratio:1,contact_mOhm:10,mismatch:0,sourceVoltage:.01}); export function validateParameters(p){for(const[k,a,b]of[['unknown_mOhm',1,10],['standard_mOhm',.1,200],['ratio',.1,10],['contact_mOhm',0,100],['mismatch',-.1,.1],['sourceVoltage',.001,.1]])if(!Number.isFinite(p[k])||p[k]b)throw new RangeError(k);return{...p};} export function response(a){validateParameters(a);const rx=a.unknown_mOhm*.001,rs=a.standard_mOhm*.001,r=a.contact_mOhm*.001,M=a.ratio,q=100,p=M*q*(1+a.mismatch),reff=r*(p+q)/(r+p+q),main=a.sourceVoltage/(rx+rs+reff),v1=a.sourceVoltage/(1+M),v2=main*(rs+r*q/(r+p+q)),correction=r===0?0:r*(M*q-p)/(r+p+q);return{standard_mOhm:a.standard_mOhm,bridge_uV:(v1-v2)*1e6,uncorrected_mOhm:M*a.standard_mOhm,contactCorrection_mOhm:correction*1000,corrected_mOhm:(M*rs+correction)*1000,mainCurrent:main};} export function plots(p){return[{caption:'接触电阻与副比率失配的修正项',xLabel:'连接电阻 r / mΩ',yLabel:'接触修正 / mΩ',legend:'实线:当前失配 虚线:匹配副比率',curves:[{points:Array.from({length:201},(_,i)=>{const r=i/2;return[r,response({...p,contact_mOhm:r}).contactCorrection_mOhm];})},{points:[[0,0],[100,0]]}]},{caption:'副比率失配时的开路检流电压',xLabel:'副比率相对失配 ε',yLabel:'桥压 UG / μV',curves:[{points:Array.from({length:201},(_,i)=>{const mismatch=-.1+.2*i/200;return[mismatch,response({...p,mismatch}).bridge_uV];})}]}];} export function analyzeRecords(rows,p){const s=rows.filter(r=>['unknown_mOhm','ratio','contact_mOhm','mismatch','sourceVoltage'].every(k=>r.parameters[k]===p[k]));if(!s.length)return'匹配主副比率,调节标准臂使桥压归零后记录;失配时同时保留接触修正。';const r=s.reduce((a,b)=>Math.abs(a.readings.bridge_uV)