【问题标题】:Speeding up integration by Sympy integrate通过 Sympy 加速集成
【发布时间】:2021-05-19 09:57:37
【问题描述】:

我尝试将两个函数 expFun1expFun2 相对于 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


【解决方案1】:

拥有@Oscar Benjamin 的 cmets,我已将解决方案更新如下。

import sympy as sym

X1, X2, a1, a2= sym.symbols('X1, X2, a1, a2')
t,s,T,u=sym.symbols('t,s,T,u')
fx= (X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))) **2
fx=sym.expand(fx)    
Fx=sym.integrate(fx,(u,t,s))

ans=float(Fx.subs({X1:0.5, X2: 0.3, a1:2, a2:0.1, T:1.2, t:0, s:1}))
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多