通过对被积函数进行符号化求解

  • 本文关键字:符号化 函数 python sympy
  • 更新时间 :
  • 英文 :


我想知道为什么sympy不能解决以下问题:

from sympy import *
ss = symbols('s', real = True)
a = symbols('a', real = True)
f = Function('f')
g = Function('g')
eq = Integral(a*g(ss) + f(ss),(ss,0,oo))
solve(eq, a)

返回一个空的解列表。我想告诉sympy足够的东西,以便我得到一个解决方案:

-1*Integral(f(ss),(ss,0,oo))/Integral(g(ss),(ss,0,oo))

也就是说,可以安全地假设积分是收敛的,是实值且非零的。是否有任何其他的假设/函数,我可以使用,以获得所需的输出?由于

您对预期结果的假设仍然不准确。为了使方程有解,Integral(g(ss),(ss,0,oo))必须保证为实数且非零,这在你的方程中没有任何暗示,因此不返回结果。

进一步,如果你想解决涉及Integral的方程,你需要使用doit。看看下面

from sympy import *
x = symbols('x', real = True)
a = symbols('a', real = True)
f = Function('f')
eq = a+Integral(f(x), (x, 0, oo))
print('Eq.1', solve(eq, a))
eq2 = Integral(a+f(x), (x, 0, oo))
print('Eq.2', solve(eq2.doit(), a))
eq3 = Integral(a+f(x), (x, 0, 1))
print('Eq.3', solve(eq3.doit(), a))
eq4 = Integral(a+2, (x, 0, 3))
print('Eq.4', solve(eq4, a))
print('Eq.4', solve(eq4.doit(), a))

输出:

Eq.1 [-Integral(f(x), (x, 0, oo))]
Eq.2 []
Eq.3 []
Eq.4 []
Eq.4 [-2]

注意eq.1可解的,从某种意义上说,你可以把a移到方程的一边,因为它不在极限内(无限边界的积分是积分极限的简写,其各自的边界接近无穷大)。但是,eq.2和eq.3是而不是可解,因为一个和的极限只有在收敛于实数时才等于这些极限的和(在你的例子中,不能保证它们收敛于实数)。

最后,等式4是可解的,但你必须使用doit。在等式1中,你可以没有它。


也就是说,你可以"克服"。形式主义,使用expand。请看下面。

from sympy import *
x = symbols('x', real = True)
a = symbols('a', real = True)
f = Function('f')
g = Function('g')
eq5 = a+Integral(a+f(x), (x, 0, 1))
print('Eq.5', solve(eq5.expand().doit(), a))
eq6 = Integral(a+f(x), (x, 0, 1))
print('Eq.6', solve(eq6.expand().doit(), a))
eq7 = Integral(a*g(x)+f(x), (x, 0, oo))
print('Eq.7', solve(eq7.expand().doit(), a))

输出:

Eq.5 [-Integral(f(x), (x, 0, 1))/2]
Eq.6 [-Integral(f(x), (x, 0, 1))]
Eq.7 [-Integral(f(x), (x, 0, oo))/Integral(g(x), (x, 0, oo))]

这是有效的,因为它允许某些操作,通过玩弄快速和松散的细节。,它仍然不起作用,当结果是完全错误的(尝试使用oo作为上界在eq.6或eq.7)。

这是你的方程:

In [9]: eq
Out[9]: 
∞                   
⌠                   
⎮ (a⋅g(s) + f(s)) ds
⌡                   
0 

你想求解a使这个表达式等于零。我们可以重新排列这个表达式来提取a,以便solve理解如何分离a:

In [10]: eq.expand()
Out[10]: 
∞                   
⌠                   
⎮ (a⋅g(s) + f(s)) ds
⌡                   
0                   
In [11]: eq.expand(force=True)
Out[11]: 
∞             ∞        
⌠             ⌠        
⎮ a⋅g(s) ds + ⎮ f(s) ds
⌡             ⌡        
0             0        
In [12]: factor_terms(eq.expand(force=True))
Out[12]: 
∞           ∞        
⌠           ⌠        
a⋅⎮ g(s) ds + ⎮ f(s) ds
⌡           ⌡        
0           0        
In [13]: solve(factor_terms(eq.expand(force=True)), a)
Out[13]: 
⎡ ∞         ⎤
⎢ ⌠         ⎥
⎢-⎮ f(s) ds ⎥
⎢ ⌡         ⎥
⎢ 0         ⎥
⎢───────────⎥
⎢ ∞         ⎥
⎢ ⌠         ⎥
⎢ ⎮ g(s) ds ⎥
⎢ ⌡         ⎥
⎣ 0         ⎦

我们必须使用force=True,因为expand不会假设知道上限为oo的积分是收敛的,并且将积分分解为两个积分可能会将收敛积分变成非收敛积分的和。

最新更新