【问题标题】:Error: generating of Nan Values by curve fitting with lmfit/scipy错误:通过使用 lmfit/scipy 进行曲线拟合生成 Nan 值
【发布时间】:2020-06-07 06:37:53
【问题描述】:

我有函数和数据:

from lmfit import Model
from matplotlib import pyplot as plt
import numpy as np

def second_order(x, k_a, k_d):

   r = 1e-5
   s = 1e-5
   q = 10
   t = 51.1

   a = k_a * (r + s) + k_d
   b = np.sqrt(a**2 - 4*k_a**2*r*s)
   y = (2*k_a*r*s) / (a + b*((np.exp(b*x)+1)/(np.exp(b*x)-1)))
   return q + t * (y / r)

x = [0.005, 0.05, 0.1, 0.15, 0.2, 0.23274, 0.3, 0.35851, 0.4, 0.45, 0.47881, 0.55, 0.57861, 0.64559, 0.7, 0.75, 0.811, 0.85, 0.87116, 0.95, 1.01743, 1.05, 1.07758, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3.0, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65, 3.7, 3.75, 3.8, 3.85, 3.9, 3.95, 4.0, 4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35, 4.4, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.75, 4.8, 4.85, 4.9, 4.95, 5.0]
y = [10.5, 14.7, 18.9, 22.6, 25.9, 29.4, 31.6, 33.4, 36.1, 38.1, 39.8, 41.5, 42.9, 44.7, 45.6, 46.8, 47.2, 48.7, 49.7, 50.4, 50.6, 51.8, 52.5, 53.0, 53.3, 54.5, 53.8, 55.8, 55.3, 54.7, 55.7, 56.5, 56.1, 57.2, 56.6, 57.7, 56.8, 58.1, 57.8, 57.5, 59.0, 57.6, 58.8, 58.3, 58.8, 58.5, 59.2, 58.4, 59.0, 59.9, 59.1, 58.7, 59.2, 59.1, 59.6, 59.6, 59.2, 60.6, 59.1, 60.2, 59.4, 60.1, 59.4, 60.1, 59.9, 59.3, 60.6, 59.3, 60.4, 59.1, 60.7, 60.3, 59.4, 60.5, 59.4, 60.3, 59.2, 60.6, 58.8, 61.0, 59.2, 60.6, 59.5, 60.4, 59.5, 61.0, 58.6, 60.2, 59.9, 60.4, 59.5, 60.8, 60.0, 59.3, 60.4, 59.3, 61.1, 59.5, 60.2, 59.3, 60.9]


gmodel = Model(second_order)
print('parameter names: {}'.format(gmodel.param_names))
print('independent variables: {}'.format(gmodel.independent_vars))

result = gmodel.fit(y,x=x,k_a = 10, k_d = 10)

print(result.fit_report())

x 的数据范围在 0.005 到 5 之间,y 的范围在 10 到 60 之间。我总是得到错误:

模型函数生成 NaN 值并且拟合中止!请检查您的模型功能和/或在适用的情况下设置参数边界。在这种情况下,使用“nan_policy='omit'”可能不起作用。

我不确定这是否与 exp() 函数的溢出有关?我还排除了 0 处的第一个点,以防止通过 0 进行除法。

感谢您的帮助。

【问题讨论】:

    标签: python scipy nan curve-fitting lmfit


    【解决方案1】:

    正如您可能在https://stackoverflow.com/help/mcve 中看到的那样,包含一个完整的、可运行的示例总是很有帮助的。由于您的代码 + 数据的 sn-ps 实际上不可运行,因此我没有尝试运行您的示例。但这里有几件事需要检查:

    首先:你确定np.sqrt() 的论点永远不会是否定的吗?我认为您没有采取任何措施来积极阻止这种情况的发生。

    第二:你确定np.exp() 的参数不能大于~710?这将生成np.inf,它也会停止拟合,但通常比np.nan 更容易处理,因为含义更清楚。你可以在b 上设置一个上限,这样b*x.max() < 705 就可以了,也许只是

    b = min(705/x.max(), np.sqrt(a**2 - 4*k_a**2*r*s))
    

    【讨论】:

    • 你说得对,把它改成可运行的代码。是的,我正在寻找类似于上限解决方案的东西。它似乎起作用了。谢谢你的帮助。 :)
    猜你喜欢
    • 2021-11-01
    • 2015-07-04
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2015-09-14
    • 2020-03-19
    相关资源
    最近更新 更多