化学发光曲线拟合函数说明(多项式+指数拟合接口)

来源:云盘 /工作相关/全自动化学发光/文思海辉 文件/注册后优化/相关文件 多项式+指数 190812/函数说明.doc(54 KB,antiword 提取) 关联工程:原工程文件 IMITATE2(MFC 工程,同目录 res/计算方法实习报告.doc 为算法出处)

背景

全自动化学发光免疫分析仪(与文思海辉合作项目,2019 注册后优化阶段)的校准曲线拟合需求文档。化学发光定量需要把”RLU 相对光强 → 浓度”的剂量反应曲线拟合成可反求的函数,这份文档说明了交付的 C++ 拟合函数接口和用法约束。

核心内容

主函数接口 Nihe()

void Nihe(double t[], double y[], int m);
  • t[] 横坐标数组、y[] 纵坐标数组、m 多项式最高次数
  • m=2 → y = a + bx + cx²;m=3 → y = a + bx + cx² + dx³
  • 拟合结果参数存类成员数组 double X[10]:m=3 时 a=X[0], b=X[1], c=X[2], d=X[3]
  • 配套 void Gauss(double sz[][20], int n) 高斯列主元消元求解正规方程组
  • 坑:把 Nihe/Gauss 从 IMITATE 工程中单独提取到”自定义函数”里编译不报错但运行时 crash——因为 OnImitate() 等函数耦合了对话框等自定义类。结论:必须从原工程整体提取修改,不能只摘两个函数。

多项式拟合使用建议

  • 直接用 Nihe(),m 只取 2 或 3(二次/三次),文档明确”不用再求更高次”——高次多项式在免疫定量定标中会过拟合振荡。

反求(浓度反算)

  • 二次多项式 y = a + bx + cx² 有闭式求根公式,可直接反求 x。
  • 三次多项式无直接公式,文档提出的方案是二分法逐步逼近(当时未定论,标注为待验证)。

指数函数拟合

  • 目标形式 y = a·e^(bx):两边取对数 → ln y = ln a + bx,化成线性问题。
  • 调用 Nihe(x, log y, 1) 一次多项式拟合,结果 X[0] = log a,X[1] = b。
  • 反求 x 用对数形式闭式解。

算法出处:计算方法实习报告(2005)

同目录 res/计算方法实习报告.doc 是原作者(张晓东,2005 年计算方法课程报告)的原始实现报告,揭示了这套拟合代码的血统:

  • 原始问题是化学反应”浓度-时间”数据拟合,MFC + VC++ 菜单驱动实现。
  • 算法路线:构造 (m+2)×(m+1) 增广矩阵(正规方程),调用 Gauss 列主元消元解系数。
  • 变体处理思路与后来化学发光需求一脉相承:
    • 1/y = 1/y0 - (t0/y0)·t → 浓度取倒数后线性拟合(On1Imitate)
    • y = a·e^(b/t) → 时间取倒数、浓度取对数后线性拟合(On2Imitate)
  • 即:非线性模型统一通过变量变换线性化,复用同一个 Nihe(…, 1) 线性拟合通路。

可行动点 / 工程启示

  • 遗留缺陷:三次多项式反求只有二分法提案,闭式/数值稳定性未验证;单独提取函数会 crash 的耦合问题在 2019 年仍未解决,只是”从原工程整体提取”绕过。
  • 剂量反应曲线的四种模型(多项式 2/3 次、双倒数、指数)覆盖了化学发光定标常见形态,变换线性化策略可直接复用到类似仪器软件。

关联