将函数(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)
现在由于 a
和 x
之间的差异,此实施将失败。我尝试将 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
我不是数值积分专家,所以可能有比这些更好的方法。
我有一个函数可以计算积分,将某个函数作为输入。我希望代码计算以下的定积分:<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)
现在由于 a
和 x
之间的差异,此实施将失败。我尝试将 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
我不是数值积分专家,所以可能有比这些更好的方法。