我有一个我无法弄清楚的问题。我使用scipy.interpolate.interp2d从数据创建了一个插值函数,这给了我两个变量的可调用函数
def Time_function():
'''creates a interpolated function of Time depending on
Cl and Cd using the in and outputs of matlab sim run.
'''
return interp2d(import_data()[0], import_data()[1], import_data()[2])
Witch运作良好,但我现在想要找到这个函数的最小值 scipy.optimize.fmin或mimimize
def find_min_time():
'''finds the min time based on the interpolated function
'''
f = Time_function()
return minimize(f, np.array([1.0, 0.4]))
f显然需要2个参数,因此最小化将需要一个函数(f)和两个猜测。但是,当我收到此错误时,我似乎无法找到输入initail猜测的正确方法:
TypeError: __call__() takes at least 3 arguments (2 given)
有人知道解决方案吗?
干杯//
答案 0 :(得分:2)
在scipy.interpolate.interp2d
的帮助下:
| __call__(self, x, y, dx=0, dy=0, assume_sorted=False)
| Interpolate the function.
|
| Parameters
| ----------
| x : 1D array
| x-coordinates of the mesh on which to interpolate.
| y : 1D array
| y-coordinates of the mesh on which to interpolate.
在scipy.optimize.minimize
的帮助下:
minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
Minimization of scalar function of one or more variables.
....
Parameters
----------
fun : callable
Objective function.
x0 : ndarray
Initial guess.
所以interp2d
似乎构造了一个带有2个独立输入参数的函数,但是minimize
尝试将两个变量都填充为同一输入ndarray
的两个组件。您可以使用lambda
在两种语法之间进行调解:
f = Time_function()
return minimize(lambda v: f(v[0],v[1]), np.array([1.0, 0.4]))
另外,我有时会发现interp2d
到give weird results。您可能需要考虑使用scipy.interpolate.griddata
,它不会为您构造插值函数,而是为给定的输入点计算替换值(但您可以访问插值函数本身,例如{{3} })。虽然我期望griddata
在插值方面做得更好,但它可能(可能)比用interp2d
构造的单个插值函数更慢(但我会检查)无论)。