将函数(lambda)作为输入并在计算本身中包含变量的最佳方法?

Best way to take a function (lambda) as input, and also have the variable within the computation itself?

我有一个函数可以计算积分,将某个函数作为输入。我希望代码计算以下的定积分:<some function, in terms of x. e.g., 3*x or 3*x*(1-x), etc.> * np.sin(np.pi * x))。我为此使用 scipy:

import scipy.integrate as integrate
def calculate(a):
    test = integrate.quad(a*np.sin(np.pi * x), 0, 1)
    return test

a = lambda x: 3*x
calculate(a)

现在由于 ax 之间的差异,此实施将失败。我尝试将 x 定义为 x = lambda x: x,但这行不通,因为我在将 float 乘以函数时遇到错误。

有什么建议吗?

由于您试图在计算定积分之前组合两个符号表达式,我认为这可能是 sympy 符号操作工具的一个很好的应用。

from sympy import symbols, Integral, sin, pi

def calculate(a_exp):
    test = Integral(a_exp * sin(pi * x), (x, 0, 1)).evalf()
    return test

x = symbols('x')
a_exp = 3*x 
print(calculate(a_exp))

# 0.954929658551372

注意:我将 a 的名称更改为 a_exp 以明确这是一个表达式而不是函数。

如果您决定使用 sympy,请注意您也可以用符号计算积分的表达式。

更新:为此导入 Sympy 可能有点矫枉过正

如果计算速度比精度更重要,您可以使用一些简单的离散化方法轻松地近似计算积分。

例如,下面的函数用越来越复杂的方法近似地计算积分。前两个的准确性会随着 n 的增加而提高,并且还取决于 a_func 等的性质

import numpy as np
from scipy.integrate import trapz, quad

def calculate2(a_func, n=100):
    dx = 1/n
    x = np.linspace(0, 1-dx, n)
    y = a_func(x) * np.sin(np.pi*x)
    return np.sum(y) * dx

def calculate3(a_func, n=100):
    x = np.linspace(0, 1, n+1)
    y = a_func(x) * np.sin(np.pi*x)
    return trapz(y, x)

def calculate4(a_func):
    f = lambda x: a_func(x) * np.sin(np.pi*x)
    return quad(f, 0, 1)

a_func = lambda x: 3*x
print(calculate2(a_func))
# 0.9548511174430737

print(calculate3(a_func))
# 0.9548511174430737

print(calculate4(a_func)[0])
# 0.954929658551372

我不是数值积分专家,所以可能有比这些更好的方法。