【问题标题】:Translating matlab code to python: optimizing numerical functions将matlab代码翻译成python:优化数值函数
【发布时间】:2018-03-27 02:05:14
【问题描述】:

我有以下一些 matlab 代码:

f=@(h)(exp(-2*mun*(h/sigma+1.166))-1+2*mun*(h/sigma+1.166))/(2*mun^2)-ARL0;

参数并不重要,此时它们都只是常量。重要的是,现在我可以通过调用 f(h) 来评估任何 h 值的函数。特别是,我可以在我指定的任何间隔内找到函数的零点、最小值、最大值等。

我正在将这段代码翻译成 python,主要是作为学习 python 的练习,我想知道是否有任何类似的东西(可能在 numpy 中)我可以使用,而不是设置一个带有任意集合的 numpy 数组h 值来处理。

我可以做类似(伪代码)的事情:

f = numpy.array(that function for h in numpy.arange(hmin, hmax,hstep))

但这让我不得不步长。有什么办法可以避免这种情况并像在 matlab 中那样获得完整的精度?

编辑:一天结束时我真正想要的是找到函数 f 的零、最大值和最小值位置(不是值)。看起来 scipy 可能有一些在这里更有用的功能:http://docs.scipy.org/doc/scipy/reference/optimize.html

【问题讨论】:

    标签: matlab python-2.7 numpy


    【解决方案1】:

    MATLAB@ 表示法)中函数句柄的 Python 等效项在 python 中称为“lambda 函数”。等效语法如下:

    Matlab:

    func = @(h)(h+2):
    

    Python:

    func = lambda h: h+2
    

    对于您的具体情况,您可以像这样实现 matlab 函数的等价物:

    import numpy as np
    f = lambda h: (np.exp(-2*mun*(h/sigma+1.166))-1+2*mun*(h/sigma+1.166))/(2*mun**2)-ARL0
    

    f 然后可以用作函数并直接应用于任何numpy 数组。所以这会起作用,例如:

    rarr = np.random.random((100, 20))
    frarr = f(rarr)
    

    【讨论】:

    • 漂亮,结合 lambda 函数和 fsolve 确实让我的工作变得非常轻松。
    【解决方案2】:

    如果您只是在寻找 x 整数值的 f 值,以下方法将起作用:

    f = [your_function(x) for x in xrange(hmin, hmax)]
    

    如果你想要比整数值更细的粒度,你可以这样做:

    f = [your_function(x) for x in xrange(hmin, hmax, hstep)]
    

    如果您想要精确解决零点、最大值和最小值位置,我同意您的编辑:使用scipy optimize

    关于 scipy 优化功能的两个重要说明:

    1. 您似乎想使用有界版本
    2. 无法保证您会找到这些函数的实际最小值/最大值。它们是非确定性优化函数,可能会成为局部最小值/最大值的牺牲品。如果您想象征性地评估最小值/最大值,我建议您查看sage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2018-09-09
      相关资源
      最近更新 更多