将参数传递给函数进行拟合

ely*_*ase 3 python numpy curve-fitting scipy

我试图拟合一个函数,它将输入2个独立变量x,y和3个参数作为输入a,b,c.这是我的测试代码:

import numpy as np
from scipy.optimize import curve_fit

def func(x,y, a, b, c):
    return a*np.exp(-b*(x+y)) + c    

y= x = np.linspace(0,4,50)
z = func(x,y, 2.5, 1.3, 0.5) #works ok
#generate data to be fitted
zn = z + 0.2*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!!
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:"func()正好接受5个参数(给定51个)".怎么能正确地传递我的论证x,y?

Sve*_*ach 7

只需查看文档即可scipy.optimize.curve_fit().原型是

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw)
Run Code Online (Sandbox Code Playgroud)

curve_fit()调用文档状态时,目标函数作为第一个参数,独立变量作为第二个参数,因变量作为第三个参数,参数的起始值作为第四个参数.您试图以完全不同的方式调用该函数,因此它不起作用也就不足为奇了.具体来说,您zn作为p0参数传递- 这就是使用如此多的参数调用函数的原因.

该文档还描述了如何调用目标函数:

f:callable
模型函数,f(x, ...).它必须将自变量作为第一个参数,并将参数作为单独的剩余参数.

xdata: 具有k个预测变量的函数的N长度序列或(k,N)形状数组
.测量数据的自变量.

您尝试使用来分隔因变量的参数,而它应该是一个参数数组.这是修复的代码:

def func(x, a, b, c):
    return a * np.exp(-b * (x[0] + x[1])) + c    

N = 50
x = np.linspace(0,4,50)
x = numpy.array([x, x])          # Combine your `x` and `y` to a single
                                 # (2, N)-array
z = func(x, 2.5, 1.3, 0.5)
zn = z + 0.2 * np.random.normal(size=x.shape[1])
popt, pcov = curve_fit(func, x, zn)
Run Code Online (Sandbox Code Playgroud)