寻找内插函数的最小值。

时间:2016-01-13 20:28:08

标签: python scipy interpolation

我有一个我无法弄清楚的问题。我使用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)

有人知道解决方案吗?

干杯//

1 个答案:

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

另外,我有时会发现interp2dgive weird results。您可能需要考虑使用scipy.interpolate.griddata,它不会为您构造插值函数,而是为给定的输入点计算替换值(但您可以访问插值函数本身,例如{{3} })。虽然我期望griddata在插值方面做得更好,但它可能(可能)比用interp2d构造的单个插值函数更慢(但我会检查)无论)。