化学发光曲线拟合模块(IMITATE)— 计算方法与移植说明

来源:全自动化学发光项目 / 文思海辉交接资料。两份文档合并消化:一份是拟合算法的原始实习报告的工程化版本,一份是移植时的函数接口说明。该模块是化学发光仪器浓度换算的核心算法库。

核心算法:最小二乘多项式拟合

  • 主函数接口:void Nihe(double t[], double y[], int m)
    • t[] 横坐标数组(如时间/浓度),y[] 纵坐标数组,m 多项式最高次数
    • m=2 → y=a+bx+cx²;m=3 → y=a+bx+cx²+dx³(工程上只用 2、3 次,不再求更高次)
  • 结果存放:类成员数组 double X[10],m=3 时 a=X[0], b=X[1], c=X[2], d=X[3]
  • 底层求解:构造 (m+2)×(m+1) 正规方程矩阵,用高斯列主元消元法(Gauss())解方程组系数

非线性模型的线性化技巧

化学发光标准曲线常用非线性模型,全部通过变量替换化为一次拟合后复用 Nihe():

模型变换调用方式参数还原
1/y = 1/y0 − (t0/y0)·t(倒数型)浓度取倒数Nihe(t, 1/y, 1)直接读系数
y = a·e^(b/t)(指数型)时间取倒数 + 浓度取对数Nihe(1/t, ln y, 1)X[0]=ln a,X[1]=b
一般指数 y=a·e^(bx)两边取对数Nihe(x, log y, 1)X[0]=log a,X[1]=b

反求(由信号值反推浓度)

  • 二次多项式 y=a+bx+cx²:有直接求根公式
  • 三次多项式:无直接公式,原开发者建议二分法逐渐逼近(笔记原文即为此结论,无落地代码,待确认最终方案)

移植注意事项(交接文档明示)

  • 原工程 IMITATE2(VC++ MFC,基类 CView,菜单驱动)中 OnImitate()/On2Imitate() 耦合了对话框等自定义类,不通用;移植时应只提取 Nihe() 和 Gauss() 两个纯函数
  • 单独提取后编译不报错但运行时 crash——原因是编译器版本不匹配(4.8.2 编译、4.8.6 使用),换回 4.8.6 解决。跨编译器移植 C++ 数值库时务必对齐工具链版本
  • 工程还包含数据文件读写(fstream 顺序存取:先存组数再逐组存入)和判空保护 IsEmpy()(原文拼写如此)

可行动点

  • 若后续再接触该拟合库移植,直接以 Nihe()+Gauss() 双函数为最小移植单元,跳过 MFC 外壳
  • 三次多项式反求建议用二分法或 Newton-Raphson 重实现,注意数值稳定性

关联

  • 原始出处是 2005 年的计算方法课程实习报告(曲线拟合 + 高斯列主元,VC++ MFC 实现,作者署名出现在报告封面),后被化学发光项目复用为标准曲线拟合组件
  • 流式细胞仪软件测试用例模板 —— 同期医疗器械软件测试资料