首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中只拟合多个参数的函数的2个参数

在python中只拟合多个参数的函数的2个参数
EN

Stack Overflow用户
提问于 2016-09-21 19:34:22
回答 1查看 984关注 0票数 1

我知道有个问题

Fitting only one parameter of a function with many parameters in python

但我的情况有点不同。lambda函数参数问题。

我在试着适应洛伦茨·芬克

代码语言:javascript
运行
复制
def lorentz(ph, A, xc, w, f0):
    return f0 + A * w**2 / (w**2 + (ph - xc)**2)

如果我只拟合一个参数(xc),它的工作效果很好。

代码语言:javascript
运行
复制
p1, p2, p3, p4 = params
popt, pcov = curve_fit(lambda x, xc: lorentz(x, p1, xc, p3, p4), abjd, adata, bounds=param_bounds)

但是,如果我尝试只安装两个参数(a,xc),它就会失败。

代码语言:javascript
运行
复制
p1, p2, p3, p4 = params    
popt, pcov = curve_fit(lambda x, a, xc: lorentz(x, a, xc, p3, p4), abjd, adata, bounds=param_bounds)

错误信息是

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "template.py", line 294, in <module>
    popt, pcov = curve_fit(lambda x, a, xc: lorentz(x, a, xc, p3, p4), abjd, adata, bounds=param_bounds)
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 683, in curve_fit
    **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/_lsq/least_squares.py", line 769, in least_squares
    f0 = fun_wrapped(x0)
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/_lsq/least_squares.py", line 764, in fun_wrapped
    return np.atleast_1d(fun(x, *args, **kwargs))
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 455, in func_wrapped
    return func(xdata, *params) - ydata
TypeError: <lambda>() takes exactly 3 arguments (2 given)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 20:10:52

这是洛伦兹函数所有四个参数的解。

代码语言:javascript
运行
复制
import numpy as np
from scipy.optimize import curve_fit

def lorentz(ph, A, xc, w, f0):
    return f0 + A * w**2 / (w**2 + (ph - xc)**2)

A, xc, w, f0 = 2,2,2,2  # true values
ph = np.linspace(-5, 10, 100)
y = lorentz(ph, A, xc, w, f0)    
ydata = y + 0.15 * np.random.normal(size=len(ph)) # sample data
popt, pcov = curve_fit(lambda x, _A, _xc: lorentz(x, _A, _xc, w, f0), ph, ydata,bounds=([1,1], [3, 3]))
A, xc = popt # fitted values (only two)

通过将参数放在lorentz()函数下或使用lambda,您可以轻松地添加或删除参数

结果是这样的

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

https://stackoverflow.com/questions/39625122

复制
相关文章

相似问题

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