我正在使用Mathematica的FindFit函数来为我的数据拟合参数解决方案,我收到错误“FindFit :: fmgz:遇到一个实际为零的渐变”。我给出的参数的初始猜测非常接近我用来煮数据的值,我无法弄清楚我哪里出错了。
首先,我使用ParametricNDSolveValue函数参数化求解函数'a [t]'和'b [t]'的两个耦合一阶微分方程,参数为ka,kd和beta:
sol = ParametricNDSolveValue[{D[a[t], t] == -kd*a[t] +
ka*(1 - a[t] - b[t]), a[0] == ka/(ka + kd),
D[b[t], t] == -kd*b[t] + ka*(1 - Exp[-beta*t]) (1 - a[t] - b[t]),
b[0] == 0 }, {a, b}, {t, 0, 20}, {ka, kd, beta}]
我可以使用以下方法提取a [t]的解为ka = 0.7,kd = 0.1,beta = 0.1
y1 = sol[0.7, 0.1, 0.1][[1]]
将y1绘制为t的函数给出预期曲线:
Plot[y1[t], {t, 0, 20}, PlotRange -> All]
然后我创建一个数据表,从图中注视值:
dataA = {{0, 0.9}, {5, 0.84}, {10, 0.75}, {15, 0.68}, {20, 0.62}}
最后,我将FindFit与sol [ka,kd,beta] [t] [[1]]一起使用来拟合数据:
fit = FindFit[dataA, sol[ka, kd, beta][t][[1]], {{ka, 0.7}, {kd, 0.1}, {beta, 0.1}}, t]
此时我得到“梯度有效为零”错误。再次注意,数据是通过观察ka = 0.7,kd = 0.1,beta = 0.1的图来生成的,所以我不知道为什么FindFit不喜欢这些初步的猜测。
有人能告诉我我做错了什么吗?谢谢你的时间!