export const MODEL_VERSION='1.0.0',DEFAULTS=Object.freeze({mode:'voltage',E:5,R0:1000,K:1,X:.5}); export function validateParameters(p){if(!['current','voltage'].includes(p.mode))throw new RangeError('接法');for(const[k,a,b]of[['E',.1,12],['R0',50,5000],['K',.1,10],['X',0,1]])if(!Number.isFinite(p[k])||p[k]b)throw new RangeError(k);return {...p};} export function response(p){validateParameters(p);const load=p.K*p.R0,current=p.mode==='current'?p.E/(load+p.X*p.R0):p.E*p.K*p.X/(p.K+p.X*(1-p.X))/load;return {mode:p.mode,X:p.X,voltage:current*load,current_mA:current*1000,current,load,normalized:p.mode==='current'?current/(p.E/load):current*load/p.E};} export function plots(p){const values=Array.from({length:201},(_,i)=>i/200);return ['current','voltage'].map(mode=>({caption:mode==='current'?'制流电流随滑片位置变化':'分压负载电压随滑片位置变化',xLabel:'滑片位置 X',yLabel:mode==='current'?'归一化电流 I / Imax':'负载电压 U / E',yd:[0,1.05],curves:[{points:values.map(X=>[X,response({...p,mode,X}).normalized])}],selected:[p.X,response({...p,mode}).normalized]}));} export function analyzeRecords(rows,p){const s=rows.filter(r=>r.parameters.E===p.E&&r.parameters.R0===p.R0&&r.parameters.K===p.K&&r.parameters.mode===p.mode);if(!s.length)return'同一电源、变阻器和负载下改变滑片位置后记录,比较调节范围。';const v=s.map(r=>r.readings.voltage);return '同组 '+s.length+' 条,已记录负载电压范围 '+Math.min(...v).toFixed(6)+'–'+Math.max(...v).toFixed(6)+' V。由 U/I 反推负载 '+s.at(-1).readings.load.toFixed(6)+' Ω。';}