将matlab代码转换为python:优化数值函数

时间:2015-03-13 14:22:55

标签: matlab python-2.7 numpy

我有以下一些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

2 个答案:

答案 0 :(得分:1)

如果您只是寻找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

答案 1 :(得分:1)

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

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)