gpt4 book ai didi

python - 如何检查 SymPy 表达式是否具有解析积分

转载 作者:行者123 更新时间:2023-11-30 22:16:11 25 4
gpt4 key购买 nike

我想解决我的另一个问题here因此,每当 和 积分没有解析/符号解时,我需要 sympy 返回错误。

例如,如果我尝试:

from sympy import *
init_printing(use_unicode=False, wrap_line=False, no_global=True)
x = Symbol('x')
integrate(1/cos(x**2), x)

它只是[漂亮]打印积分本身

enter image description here

没有解决和/或给出无法解决的错误!

附注我也问过这个问题here on Reddit .

最佳答案

“象征性”解决方案总是存在的:我刚刚发明了一个新函数 intcos(x) ,根据定义,它是 1/cos(x**2) 的反导数。现在这个积分有一个符号解了!

为了严格回答问题,必须限制答案中允许的函数类别。通常人们会考虑 elementary functions 。如SymPy integral reference解释说,它采用的 Risch 算法可以证明某些函数没有初等反导数。使用选项risch=True并检查返回值是否是 sympy.integrals.risch.NonElementaryIntegral 的实例

from sympy.integrals.risch import NonElementaryIntegral
isinstance(integrate(1/exp(x**2), x, risch=True), NonElementaryIntegral) # True

但是,由于Risch算法实现并不完整,很多情况下像1/cos(x**2)它返回一个普通的 Integral 对象。这意味着它既无法找到基本的反导数,也无法证明它不存在。

对于这个例子,它有助于用指数重写三角函数,即 rewrite(cos, exp) :

isinstance(integrate((1/cos(x**2)).rewrite(cos, exp), x, risch=True), NonElementaryIntegral)  

返回 True,因此我们知道积分是非初等积分。

非基本反导数

但通常我们并不真正需要初等函数;我们需要的是基本函数。像 Gamma 或 erf 或 Bessel 函数之类的函数可能没问题;只要它是一些“已知”函数(这当然是一个模糊术语)。问题是:如何判断 SymPy 是否能够集成特定表达式?使用.has(Integral)检查一下:

integrate(2/cos(x**2), x).has(Integral)   # True

(不是 isinstance(Integral),因为返回值可以是 2*Integral(1/cos(x**2), x) 。)除了 SymPy 未能找到反导数之外,这不能证明任何其他事情。反导数很可能是一个已知函数,甚至是一个初等函数。

关于python - 如何检查 SymPy 表达式是否具有解析积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com