【问题标题】:Finding minimum of interpolated function.寻找插值函数的最小值。
【发布时间】:2021-08-29 06:58:01
【问题描述】:

我有一个我无法解决的问题。我已经使用 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 或最小化

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) 和两个猜测。但是,当我收到此错误时,我似乎找不到输入初始猜测的正确方法:

TypeError: __call__() takes at least 3 arguments (2 given)

有人知道解决办法吗?

干杯//

【问题讨论】:

  • 我没有看到 f 需要 2 个参数;我没有看到明确的参数。另外,我怀疑您的问题是您传递了 Time_function 调用的 value ,而不是函数本身。试试 minimize(Time_function, [1.0, 0.4]) ?
  • 返回 TypeError: Time_function() 没有参数 (1 given) ,这很奇怪
  • 老鼠。好吧,如果您愿意提供 Minimal, complete, verifiable example,我会很乐意从事机制工作。

标签: python scipy interpolation


【解决方案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 构造的单个插值函数要慢(但无论如何我都会检查)。

【讨论】:

  • 做到了!但是,正如您所说,interp2d 在我看来不是很准确,所以我将使用 griddata 进行尝试!非常感谢!
  • @user5786425 很高兴能帮上忙。我还发现使用LinearNDInterpolator 可能比多次调用griddata 更快,您应该同时检查两者。当然,如果你不使用双线性插值,那么应该使用另一个插值后端。
猜你喜欢
  • 2018-10-26
  • 2021-01-03
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多