首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用lmfit进行拟合

无法使用lmfit进行拟合
EN

Stack Overflow用户
提问于 2019-12-08 14:48:58
回答 1查看 386关注 0票数 0

我想用lmfit做一个fit,但我遇到了一些问题。下面是我的代码:

代码语言:javascript
复制
from lmfit import Model
import numpy as np

def fit_func(x,a,b,c):
    return a*(b-x)**(5/8)+c

x = np.array([ 131.871     ,  218.825     ,  305.046     ,  390.533     ,
        475.128     ,  558.959     ,  642.001     ,  724.307     ,
        805.794     ,  886.422     ,  966.20900001, 1045.19300001,
       1123.39300001, 1200.75800001, 1277.23700001, 1352.83300001,
       1427.57800001, 1501.49800001, 1574.55300001, 1646.69500001,
       1717.90800001, 1788.22100001, 1857.65100001, 1926.18300001,
       1993.76400001, 2060.37000001, 2126.00900001, 2190.70600001,
       2254.44800001, 2317.20000001, 2378.92000001, 2439.60300001,
       2499.25800001, 2557.89000001, 2615.46600001, 2671.95000001,
       2727.30900001, 2781.54300001, 2834.64700001, 2886.60600001,
       2937.38000001, 2986.92900001])

y = np.array([  0.        ,   3.14159265,   6.28318531,   9.42477796,
        12.56637061,  15.70796327,  18.84955592,  21.99114858,
        25.13274123,  28.27433388,  31.41592654,  34.55751919,
        37.69911184,  40.8407045 ,  43.98229715,  47.1238898 ,
        50.26548246,  53.40707511,  56.54866776,  59.69026042,
        62.83185307,  65.97344573,  69.11503838,  72.25663103,
        75.39822369,  78.53981634,  81.68140899,  84.82300165,
        87.9645943 ,  91.10618695,  94.24777961,  97.38937226,
       100.53096491, 103.67255757, 106.81415022, 109.95574288,
       113.09733553, 116.23892818, 119.38052084, 122.52211349,
       125.66370614, 128.8052988 ])


fit_model = Model(fit_func)
params = fit_model.make_params()
params['b'].set(5000, min=3500)

result = fit_model.fit(y, x=x)

但是我得到了这个错误:

代码语言:javascript
复制
ValueError: The model function generated NaN values and the fit aborted! Please check your model function and/or set boundaries on parameters where applicable. In cases like this, using "nan_policy='omit'" will probably not work.

我做错了什么?我试着手动调整a,b,c参数,a=-1.2,b=3600,c=196给出了一个很好的拟合,所以程序应该能够找到类似的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-08 23:30:34

缺少两件事:

a)您需要像下面这样将params传递给fit_model.fit()

代码语言:javascript
复制
result = fit_model.fit(y, params, x=x)

b)您需要给出所有参数的初始值。未初始化的参数将有一个值-np.inf,这是故意选择的,因为它会抛出这样的错误。

您说您知道abc的合理值。使用这些知识!就像这样

代码语言:javascript
复制
fit_model = Model(fit_func)
params = fit_model.make_params(a=-1, b=4000, c=200)
params['b'].min = x.max() * (1.000001) # prevent (negative number)**fraction

result = fit_model.fit(y, params, x=x)
print(result.fit_report())

应该行得通。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59233096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档