2016-01-13 73 views
2

我有一个问题,我想不通。我创建了从数据使用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]) 

女巫运作良好的可调用的函数,但是我现在想找到这个功能的使用 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

我看不到** f **需要2个参数;我没有看到明确的参数。另外,我怀疑你的问题是你传递了Time_function调用的_value_,而不是函数本身。尝试**最小化(Time_function,[1.0,0.4])**? – Prune

+0

返回TypeError:Time_function()不带参数(给出1),奇怪的是 – user5786425

+0

老鼠。那么,如果你愿意提供[最小,完整,可验证的例子](http://stackoverflow.com/help/mcve),我会很乐意为这些机制工作。 – Prune

回答

1

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])) 

在一个侧面说明,我发现interp2dgive weird results有时。您可能要考虑使用scipy.interpolate.griddata,它不会为您构建内插函数,而是计算给定输入点的替换值(但您可以访问插值函数本身,如LinearNDInterpolator)。尽管我期望griddata在内插方面做得更好,但它可能(可能)会比替换为使用interp2d构造的单个内插函数慢(但我会检查是否)。

+0

这样做!然而,正如你所说,interp2d在我看来不太准确,所以我会尝试使用griddata!非常感谢! – user5786425

+0

@ user5786425我很高兴我能帮上忙。我还发现使用'LinearNDInterpolator'可能比多次调用'griddata'更快,你应该检查两者。当然,如果你不使用双线性插值,那么应该使用另一个插值后端。 –