拟合具有 2 个参数的隐式函数的数据

问题描述 投票:0回答:1

我有一个自变量 sB 和因变量 H 的隐函数,带有两个参数 kVkm,描述了一个化学实验。我尝试使用 Wolfram Mathematica 将实验获得的对数点拟合到文章提供的模型中。
我将这些点的坐标转化为 sB(左)和 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}}

常数和模型

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;

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

其中 kV111 和 km111 是使用文章中的最小二乘法获得的参数,但文章没有对此进行足够详细的解释,所以我尝试自己找到它们。
我找到了函数的根并使用参数 kv111 和 km111 制作了图表

f1[H_, sB_] := kH*(HB - H) + kW*cBWA*(1/(1 + kaW/HB) - 1/(1 + kaW/H)) + 
(kv111*1/2*(sB - kv111 - km111 + Sqrt[(sB - kv111 - km111)^2 + 4*km111*sB]))/(km111 + 1/2*(sB - kv111 - km111 + Sqrt[(sB - kv111 - km111)^2 + 4*km111*sB]))*
(nA/(1 + H/kaA) - nB/(1 + kaB/H));

lst1 = Table[{-Log[10, sB], -Log[10, H /. FindRoot[f1[H, sB] == 0, {H, 10^-9}]]}, {sB, 10^-5, 1, 0.0001}]

并将其与实验获得的点进行比较。

https://i.stack.imgur.com/3EHvg.png这是我在 Mathematica 堆栈交换问题上的情节的链接

这个情节看起来和文章中的一模一样。
我尝试使用 FindFit 将数据拟合到模型,但它给出的错误和值甚至不接近找到的值。所有参数和变量都不能为负。

FindFit[dotsconcA, f[sB, H, kV, km], {kV, km}, {sB, H}]
FindFit:Number of coordinates (1) is not equal to the number of variables (2).

fdot1 = f1[dotsconcA[[All, 1]], dotsconcA[[All, 2]], kV111, km111];
dataA1 = Transpose[Append[Transpose[dotsconcA], fdot1]];
FindFit[dataA1, f1[sB, H, kV, km], {kV, km}, {sB, H}]
FindFit:The function value {0.0000237276+0.I, -0.0000526427+0.I, -0.00132824+0.00202876I, 0.0122705+0.I, 0.0152136+0.I, 0.0161337+0.I} is not a list of real numbers with dimensions {6} at {kV,km} = {0.000352367,-0.0140961}.
{kV -> 0.000352367, km -> -0.0140961}

如何自己在 Wolfram Math 中找到 kV 和 km 参数?

UPD:所以我尝试了文章第二部分中给出的LSM。该方法意味着 H 实验值与 H 分析计算值之间的差异平方和应最小,即尽可能接近 0。

f2[sB_,H_]=kH*(HB - H) + kW*cBWA*(1/(1 + kaW/HB) - 1/(1 + kaW/H)) + 
(kv111*1/2*(sB - kv111 - km111 + Sqrt[(sB - kv111 - km111)^2 +4*km111*sB]))
/(km111 + 1/2*(sB - kv111 - km111 + Sqrt[(sB - kv111 - km111)^2 +4*km111*sB]))*
(nA/(1 + H/kaA) - nB/(1 + kaB/H))

Sum[Log[10,
(H/.FindRoot[f2[dotsconcA[[i,1]],H]==0, {H,10^14}])/dotsconcA[[i,2]]]^2, {i,1,6}]
Clear[i]
0.0117239

这里我将 PH 值转换为浓度,并将它们置于一个对数之下。具有相同的 sB 值,我们有两个不同的 H
我们必须通过操纵kVkm值来找到这个最小值。 我尝试使用 Manipulate 手动查找 kVkm 并且成功了

Manipulate[Sum[Log[10, (H/.FindRoot[f3[dotsconcA[[i,1]],H,kV1, km1]==0, {H,10^-14}])/dotsconcA[[i,2]]]^2, {i,1,6}], {kV1, 0.41*10^-4, 0.41*10^-2.5, 0.41*10^-4}, {km1, 13.1*10^-4, 13.1*10^-2.5, 13.1*10^-4}]
但是这个

    需要很多时间,
  1. 给出的结果不准确,
  2. 需要操纵参数的近似范围,我们 一开始不知道。
有没有更好的方法来找到这个总和的最小值?我尝试了几个“最小化”功能,但它们不起作用

wolfram-mathematica implicit-conversion data-fitting minimize model-fitting
1个回答
0
投票
所以我们找到了合适的人选,现在我将描述如果有人遇到同样的问题该怎么办。首先,我们将模型简化为四次多项式。

f1[sB_,H_,kV_,km_]:=(H+kaA) (H+kaB) (H+kaW) (HB+kaW) ((-H+HB) kH+(cBWA (-H+HB) kaW kW)/((H+kaW) (HB+kaW))+(kV (-kaA (H+kaB) nA+H (H+kaA) nB) (km+kV-sB-Sqrt[(km+kV-sB)^2+4 km sB]))/((H+kaA) (H+kaB) (km-kV+sB+Sqrt[(km+kV-sB)^2+4 km sB])))
其次,我们使用 Solve 来找到 

H 的解,并定义了 sB 的函数和 2 个参数 kmkV

poly4[sB_,kV_,km_]:=H/.Solve[f1[sB,H,kV,km]==0&&0<=sB<=1,H,PositiveReals,InverseFunctions->True][[1]]
最后是装修

FindFit[dotsconcA,poly4[sB,kV,km], {{km,0.00001}, {kV,0.00001}}, sB] km->0.006484, kV->0.0003568
不幸的是,这些参数与文章中的参数不符,但是当比较图时,它看起来很棒。另外,试衣过程大约需要一个小时,但这是下一个问题的问题。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.