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

s6fujrry  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(115)

我有函数和数据:

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进行除法。

dphi5xsq

dphi5xsq1#

已锁定1天。此时有disputes about this answer’s content正在解决。它当前不接受新的交互。

以下是一些需要检查的事项:
第一:你确定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))

字符串

相关问题