如何在python中定义一个函数,它将mathematica函数作为输入,并将其作为参数并应用于它。

时间:2017-11-09 14:54:11

标签: python math physics numerical-methods

我想定义一个函数,它将参数作为一个数学函数,它的参数和迭代次数(我正在寻找带有fixpoint定理的函数的零)。 我知道如何寻找零,但我不知道如何使我的数学方程从函数本身中获取它的参数。

def f(function,x,iterations)

当我尝试调用这样的函数时,例如:

f(x**2+3,-1,20)

该函数正在为x已经存在的变量(我已经为另一个代码的平衡定义)而不是我在这里寻找的x = -1。 我要找的结果是+4

我该如何解决这个问题?我试图在我的函数中定义另一个函数但我明确要求我的函数有这三个参数。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

在python中,函数本身就是第一类对象,可以作为参数传递。您可以在外面定义基本功能。

def my_f(x):
    return x**2+3

def my_functor(f, x, iterations):
    for i in xrange(iterations):
        x = f(x)
    return x

print my_functor(my_f, -1, 20)

也许你可以通过使用装饰器来找到更有用的定义同一个仿函数的方法。

def iterated(fn):
    """
    A decorator to make a function iterate over its outputs.
    """
    def iterated_func(*args, **kwargs):
        x = args[0]
        iterations = args[1]
        for i in xrange(iterations):
            x = fn(x)
        return x
    return iterated_func

@iterated
def my_g(x):
    return x**2+3

在这种情况下,my_g(3,1)==my_f(3)将评估为True。也就是说,通过在您定义的函数上添加装饰器@iterated,您可以更改其行为以将迭代次数作为参数。

答案 1 :(得分:1)

您可以使用sympy安全地评估数学表达式。

首先,安装sympy

pip install sympy

然后,你可以这样起诉:

import sympy as sy

def mathfunc(formula, **kwargs):
    expr = sy.sympify(formula)
    return expr.evalf(subs=kwargs)


mathfunc(formula="x**2+3", x=-1, iterations=20)

你可以像int一样投射它:

>>> int(myformula(formula="x**2+3", x=-1, iterations=20))
4

或在int()的{​​{1}}声明中添加return

请注意,我没有使用mathfunc,因为你没有提到你想要用它做什么,但你可以在iterations内使用它。

答案 2 :(得分:0)

将你的函数存储到一个字符串中,所以'x ** 2'然后在你的函数内部使用eval方法来使用该函数。 eval()