【问题标题】:Sympy - integral not being evaluatedSympy - 未评估积分
【发布时间】:2020-03-05 03:03:18
【问题描述】:

我无法用 Sympy 解决这个不定积分。我检查了Wolfram Alpha,它显然收敛了。

import sympy as sp
a, b, C = sp.symbols("a, b, C", real=True)
E = sp.symbols("E", real=True, positive=True)
chi = C * sp.exp(-a * E) * sp.sinh(sp.sqrt(b * E))
sp.integrate(chi, E)

我试图用指数函数重写表达式,但没有成功:

sp.integrate(chi.rewrite(sp.exp).expand().powsimp(), E)

我还尝试指定不同的算法,即 meijerg=True,而不是 risch=True...没有用。

是否可以用 Sympy 解决它?什么可能导致这种行为?

【问题讨论】:

  • 没有计算机代数系统可以解决所有个可以表示为封闭表达式的不定积分。有时 CAS 的隐含假设也有所不同。在任何情况下,Sympy 无法求解 Wolfram Alpha 可以求解的某些积分并不意外,反之亦然。

标签: python sympy


【解决方案1】:

如果integrate 返回一个未计算的积分,这意味着没有一个算法知道如何计算积分。将各种选项设置为 True 无济于事,因为无论如何默认情况下都会尝试它们(仅当您想尝试特定算法时它们才会出现)。

如果您将双曲 sin 重写为指数 (rewrite(exp)),您可能会得到 SymPy 可以集成的东西,进行替换 sqrt(E) = x(SymPy 可以使用 Integral.transform(sqrt(E), x) 为您完成此操作),然后完成正方形在指数中。

【讨论】:

    【解决方案2】:

    感谢@asmeurer 建议使用transform() 方法。我试图编辑他的答案以包含解决方案的代码,遗憾的是它被拒绝了。

    到代码:

    # added positive=True, necessary to solve this integral
    a = sp.symbols("a", real=True, positive=True)
    b, C = sp.symbols("b, C", real=True)
    E = sp.symbols("E", real=True, positive=True)
    chi = C * sp.exp(-a * E) * sp.sinh(sp.sqrt(b * E))
    f = chi.rewrite(sp.exp).expand().powsimp()
    x = sp.symbols("x", real=True, positive=True)
    r = f.func(*[sp.Integral(a, E).transform(sp.sqrt(E), x).doit() for a in f.args])
    r = r.subs(x, sp.sqrt(E))
    

    请注意,我可以使用sp.Integral(f, E).transform(sp.sqrt(E), x).doit(),但计算至少需要几分钟。

    通过使用积分的线性属性,我使用命令r = f.func(...) 将积分应用于表达式的不同项。计算时间减少到几秒钟!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多