在Python3中,有没有办法将数学函数作为函数的参数?
如何在Python中包含数学函数作为函数的参数 在我的特殊情况下,我正在编写一个黎曼和计算器,理想情况下,它看起来像:在Python3中,有没有办法将数学函数作为函数的参数?,python,Python,如何在Python中包含数学函数作为函数的参数 在我的特殊情况下,我正在编写一个黎曼和计算器,理想情况下,它看起来像: def riemann_sum(func_x, minvalue, maxvalue, partitions) ... return riemannSum 其中func_x是x的函数,因此我可以找到任意函数的黎曼和: func_x = x**2 minvalue = 1 maxvalue = 2 partitions = 100 a = riemann_sum(func_x,
def riemann_sum(func_x, minvalue, maxvalue, partitions)
...
return riemannSum
其中func_x是x的函数,因此我可以找到任意函数的黎曼和:
func_x = x**2
minvalue = 1
maxvalue = 2
partitions = 100
a = riemann_sum(func_x,minvalue,maxvalue,partitions)
print(a)
但是,我无法执行上述过程,因为x未定义
我可以通过手动将x的特定函数的黎曼和输入到我函数的一行中来获得它,如下所示:
someList = [x**2 for x in someOtherList]
在这里,函数是x**2,但我不能在不实际进入并更改函数的情况下更改它
我现在唯一的解决办法是每次我想找到一个新函数的定积分时,就定义一个新的黎曼和函数,这是可行的,但我觉得有更好的方法
(编辑:我的问题不同于标记为可能重复的Riemann和问题。他们的问题是关于专门针对Riemann和的实现。我的问题是关于如何将数学函数合并为函数的参数,我碰巧使用Riemann和作为一个特殊示例)
这应该可以做到。您可以在别处创建函数,然后在riemann_sum中将其初始化为输入。在Python中,函数是第一类对象,因此您可以将函数作为参数传递给其他函数。也就是说,您编写
riemann\u sum
函数声明的方式很好
不起作用的是您对func_x
的定义,因为您需要将func_x
定义为一个函数。为此,您可以:
func_x = lambda x: x**2
或者,对于更通用的多行(或单行)函数
然后你可以这样说:
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
def riemann_和(func_x,minvalue,maxvalue,分区):
#下面是调用func_x的演示,这是一种不好的求和方法
黎曼和=0
step=1.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
参数列表中元组的。我想现在是从1.01到2(我20分钟前吃了泰诺,现在我太累了,无法检查自己。)可能是重复的。有很多选择:只需谷歌“python Riemann sum”。下面是另一个例子:。或者这个:你是在说func_x=lambda x:x**2
?是的。。。我有点忘记了lambda函数。这就是我所缺少的。我不认为这能解决我的问题。。。通过说func_x(3),我已经指定我只在x=3时计算我的函数。。。或3**2=9。我需要在minvalue和maxvalue之间的特定数量(由partitions参数给出)的位置计算我的函数。设置x=3(或任何数字)将x限制为一个值,当我需要对多个值进行采样时..好的,我想这就是我想要的。Python现在对我的x函数没有问题,但出于某种原因,这发现了一些其他代码的问题,这些代码以前工作得很好。我想我可以自己解决这个问题。lambda函数似乎是我丢失的关键,谢谢<代码>lambda
起作用,但请记住,更通用、更通用的方法是只定义一个函数。我只是把它完整地放进去,但我几乎总是使用常规函数,并且只在我写它的同一行上使用lambdas函数,比如一次性调用,比如riemannSum(lambda x:x**2,1,2,100)
。是的,我想这是我想要解决的另一个(不太突出的)问题。我想变得懒惰,直接在Riemann和函数中输入X的函数,而不必每次输入X的新函数时都定义一个新函数。Lambda帮助我稍微懒惰一点,但定义函数才是我真正的问题。对。这似乎是一个合理的用例。我只是想说清楚,这是个例外,而不是常态。好的,谢谢!虽然有人已经回答了我的主要问题,但这解决了我的第二个问题。也就是说,“eval”函数帮助很大,因为它允许我以字符串形式输入函数,然后在需要计算时“解除”它。
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 = "(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)