有没有办法在Python 3中使用数学函数作为函数的参数?

时间:2016-07-03 03:47:16

标签: python

如何在Python中包含数学函数作为函数的参数?

在我的特定情况下,我正在编写理想情况下的黎曼和计算器:

def riemann_sum(func_x, minvalue, maxvalue, partitions)
...
return riemannSum

其中func_x是x的某个函数,因此我可以找到任意函数的riemann和:

func_x = x**2
minvalue = 1
maxvalue = 2
partitions = 100
a = riemann_sum(func_x,minvalue,maxvalue,partitions)
print(a)

但是,我无法执行上述步骤,因为x未定义。

我可以通过手动将其输入到我的函数行中来获取x的特定函数的Riemann和,如下所示:

someList = [x**2 for x in someOtherList]

这里,函数是x ** 2,但我不能在没有实际进入和更改函数的情况下对其进行更改。

我现在唯一的解决方案是每次想要找到一个新函数的定积分时定义一个新的黎曼和函数,这个函数有效,但我觉得这是一个更好的方法。

(编辑:我的问题不同于标记为可能重复的黎曼和问题。他们的问题是关于Riemann和的一个实现。我的问题是关于如何将数学函数作为函数的参数,而我碰巧使用黎曼和作为一个特例。

3 个答案:

答案 0 :(得分:1)

在Python中,函数是第一类对象,因此您可以将函数作为参数传递给其他函数。也就是说,你编写riemann_sum函数声明的方式很好。

func_x的定义不起作用,因为您需要将func_x定义为函数。为此你可以这样做:

func_x = lambda x: x**2

或者,对于更一般的多线(或单线)功能

def func_x(x):
    temp = x**2  # just to stretch this out to another line for demonstration
    return temp

然后你可以这样说:

def riemann_sum(func_x, minvalue, maxvalue, partitions):
    # below just demos calling func_x, and is a bad way to do the sum
    riemannSum = 0
    step = 1.0*(maxvalue-minvalue)/partitions
    value = minvalue
    while value<maxvalue:
        riemannSum == step*func_x(value)  # here's where func_x is called
        value += step
    return riemannSum

也就是说,这里的主要内容是演示如何在func_x函数中调用riemann_sum。这允许您根据需要评估func_x不同的x值,以评估总和。

答案 1 :(得分:0)

# Replace with whatever your function is  
def func_x(x):
    return x**2


def riemann_sum(func_x(3), minvalue, maxvalue, partitions)
...
return riemannSum

这应该这样做。您可以在其他地方创建该函数,然后在riemann_sum中将其初始化为输入。

答案 2 :(得分:0)

几年前,当我为微分方程类编码时,我遇到了类似的问题。这是一个对我有用的例子:

func_x = "(x**2)+x+1"
paramList = [(1+(1/k),(1/k)-(1/(k+1))) for k in range(1,101)]
# paramList holds the tuple (x,changeInX) for the riemann sum
def riemann_sum(str_func_x,paramList):
    theSum=0
    for tup in paramList:
        x=tup[0]
        diff=tup[1]
        theSum+=eval(str_func_x)*diff
    return theSum
riemannSumValue = riemann_sum(func_x,paramList)

确保参数列表真的来自1,1 + 1/100 ,. 。 。,第2个索引 paramList中的元组。 。 。我认为它现在是从1.01到2(我在20分钟前服用了一些tylenol,现在我太累了,无法检查自己。)