错误:通过使用lmfit / scipy进行曲线拟合生成Nan值

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

我具有功能和数据:

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个回答
0
投票

您可能会在https://stackoverflow.com/help/mcve读到的内容,包括完整的可运行示例,总是很有帮助的。由于您的代码和数据片段实际上是不可运行的,因此我没有尝试运行您的示例。但是这里有几件事要检查:

首先:您确定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))
© www.soinside.com 2019 - 2024. All rights reserved.