You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Wolfram Mathematica中拟合含kV、km参数的隐函数?

Mathematica隐函数模型的参数拟合优化方案

问题概述

现有描述化学实验的隐函数,自变量为sB,因变量为H,包含kV和km两个待拟合参数。已将实验测得的对数坐标点转换为浓度值,尝试用Wolfram Mathematica拟合文献提供的模型,但常规FindFit方法报错,手动调参效率低、精度差,需寻找更优的最小化实验与计算H的对数差值平方和的方法。

实验数据

原始对数坐标点与转换后的浓度值:

dotsA = {{0.5076923076923077, 7.751879699248121}, {1.0153846153846153, 7.604511278195489},
         {1.7769230769230773, 7.4}, {2.576923076923077, 7.209022556390978},
         {3.2692307692307696, 7.070676691729323}, {4.530769230769231, 7.003007518796992}};

dotsconcA = 10^-dotsA
(* 输出:{{0.310676, 1.7706*10^-8}, {0.0965196, 2.48593*10^-8},
          {0.0167139, 3.98107*10^-8}, {0.00264897, 6.17984*10^-8},
          {0.000537984, 8.49813*10^-8}, {0.0000294599, 9.93099*10^-8}} *)

模型与常量

实验常量及隐函数模型如下,文献通过最小二乘法得到参数kV111=0.41*10^-3、km111=13.1*10^-3,验证该参数能得到与文献一致的拟合曲线,但自行拟合时出错:

kaA = 4.3*10^-7; kaB = 5.6*10^-10; kaW = 6.2*10^-8;
nA = 1; nB = 2; kH = 1; kW = 1; HB = 10^-7;
cBWA = 1*10^-3;
kV111 = 0.41*10^-3;
km111 = 13.1*10^-3;

(* 隐函数方程 *)
eq[sB_, H_, kV_, km_] := 
  kH*(HB - H) + kW*cBWA*(1/(1 + kaW/HB) - 1/(1 + kaW/H)) + 
   (kV*1/2*(sB - kV - km + Sqrt[(sB - kV - km)^2 + 4*km*sB]))/(km + 1/2*(sB - kV - km + Sqrt[(sB - kV - km)^2 + 4*km*sB]))*
   (nA/(1 + H/kaA) - nB/(1 + kaB/H)) == 0;

拟合遇到的问题

  • 直接使用FindFit时,因隐函数的自变量与因变量关系不匹配,报错Number of coordinates (1) is not equal to the number of variables (2)
  • 尝试构造扩展数据拟合时,出现复数解及无效的负参数,结果不符合物理意义
  • 手动用Manipulate调参可行,但耗时久、精度低,需预设参数范围

优化拟合方案

针对隐函数的特性,采用最小化对数残差平方和的思路,结合FindRoot求解每个sB对应的计算H,再用NMinimize或FindMinimum寻找最优参数:

步骤1:提取实验数据列

sBExp = dotsconcA[[All, 1]];
HExp = dotsconcA[[All, 2]];

步骤2:定义对数残差平方和函数

对每个实验sB值,固定kV、km求解对应的H,计算实验与计算值的对数差值平方和,同时限定H的取值范围以保证求解稳定:

logResidual[kV_, km_] := 
  Sum[(Log10[HExp[[i]]] - Log10[
       FindRoot[eq[sBExp[[i]], H, kV, km], {H, HExp[[i]], 10^-9, 10^-6}][[1, 2]]])^2, 
     {i, 1, Length[sBExp]}];

步骤3:最小化残差平方和

以文献提供的参数为初始值,同时约束参数为正数(符合物理意义),使用FindMinimum或NMinimize求解:

(* 用FindMinimum从文献参数开始优化 *)
FindMinimum[logResidual[kV, km], {{kV, kV111}, {km, km111}}, Constraints -> {kV > 0, km > 0}]

(* 或用NMinimize带全局优化方法 *)
NMinimize[{logResidual[kV, km], kV > 0, km > 0}, {kV, km}, Method -> "NelderMead"]

关键注意事项

  1. 初始值选择:必须使用文献给出的kV111和km111作为起点,避免算法收敛到局部最优或无效的负参数
  2. 求解范围约束:给FindRoot限定H的取值区间(如10^-9到10^-6),确保每次求解都得到合理的正浓度值,避免复数解
  3. 优化方法选择:若目标函数非光滑,可尝试"NelderMead"或"SimulatedAnnealing"等全局优化方法,提升收敛稳定性

内容的提问来源于stack exchange,提问作者Karen Simonyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:22:51