【发布时间】:2021-05-19 09:57:37
【问题描述】:
我尝试将两个函数 expFun1 和 expFun2 相对于 u 从 t 集成到 s。
import sympy as sym
# It returns a symbolic function where u is the only symbol in the function
def expFun1(X1,X2,a1,a2,T,u):
fx= X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
return fx
# Squared version of expFun1
def expFun2(X1,X2,a1,a2,T,u):
fx= (X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))) **2
return fx
我将以下参数传递给函数,其中u 是唯一的符号化变量。
u = sym.symbols('u')
t=0
s=1
T=1.2
X1, X2, a1, a2= [0.5, 0.3, 2, 0.1]
Fx1=sym.integrate(expFun1(X1,X2,a1,a2,T,u), (u,t,s))
Fx2=sym.integrate(expFun2(X1,X2,a1,a2,T,u), (u,t,s))
Fx1 的计算时间约为 0.09 秒。但是,Fx2 大约需要 30 秒。
在实际应用中,我需要循环遍历非符号参数的不同值,而 expFun2 的集成需要很长时间。
考虑到expFun2 的函数形式,加快计算时间的最佳方法是什么?
【问题讨论】:
-
如果你使用
expand,那么它会更快。听起来好像您并没有真正以最佳方式使用符号,但如果您在循环中执行此操作。只需根据符号计算积分的一般形式,然后将值代入其中。 -
感谢 Oscar 提供的帮助。我试图实现你刚才所说的,你介意看看我下面答案中的代码吗?
-
是的,我就是这个意思。集成是一个特别慢的操作,所以最好不要在循环中进行。您可以使用lambdify 使其更快。这就是 sympy 的正常工作流程:推导出通用公式,然后使用 lambdify 有效地评估它。
-
@OscarBenjamin 感谢您对我的 cmets 的善意! lambda 函数是我从现在开始需要学习的东西,我的待办事项列表中的下一件事:)
-
请注意,我说的是lambdify,它与lambda函数不同
标签: integration sympy