2

我有以下代码:

a2 = Rational(1, alpha2)*integrate(phi2*wx12, (x,-1,1))

结果是:

  1                     
  ⌠                     
  ⎮  ⎛ 2   1⎞           
5⋅⎮  ⎜x  - ─⎟⋅wx₁₂(x) dx
  ⎮  ⎝     3⎠           
  ⌡                     
  -1                    
────────────────────────
           2            

现在我想分配积分来获得这个:

                       1            
  1                    ⌠            
  ⌠                    ⎮  wx₁₂(x)   
  ⎮   2              5⋅⎮  ─────── dx
5⋅⎮  x ⋅wx₁₂(x) dx     ⎮     3      
  ⌡                    ⌡            
  -1                   -1           
────────────────── - ───────────────
        2                   2       

任何人都知道如何做到这一点?
使用a2.expand()only 扩展积分的内部表达式。

4

1 回答 1

2

SymPy 中没有直接执行此操作的函数(尚未),但您自己执行此操作并不难。

最简单的方法是手动进行。如果您知道积分是什么,则可以使用 subs 替换它。

如果您不知道积分是什么,并且不想输入它,那么这种方式很烦人。一种不是特别普遍的更好方法是

a, b = symbols('a b', cls=Wild)
expr.replace(Integral(a + b, x), Integral(a, x) + Integral(b, x))

这只会将一个积分一分为二,因此如果您想除以更多,您需要使其更通用,或者多次应用它。如果积分是相对于不同的变量,你需要改变它。

对于更通用的版本,我们可以在 SymPy 中使用文档不足的功能,即Transform对象(事实上,文档甚至不在 Sphinx 中,我必须将您指向源代码以获取更多信息):

from sympy.core.rules import Transform
def split(integ):
    return Add(*[integ.func(term, *integ.args[1:]) for term in Add.make_args(integ.args[0])])
expr.xreplace(Transform(split, lambda i: isinstance(i, Integral))

Transform创建一个使用规则将表达式转换为其他表达式的对象。这里的规则是split,它使用 分解积分.args并将其拆分为使用 的加法Add.make_args,然后使用剩余的参数(它们是积分的变量和限制)创建新积分。lambda i: isinstance(i, Integral)告诉Transform仅适用于 Integral 对象。Transform返回一个适合传递给 的对象,该对象进行xreplace替换。

这是一个例子

In [20]: expr
Out[20]:
⌠
⎮ ⎛ 2        ⎞
⎮ ⎝x  + x + 1⎠ dx + 3
⌡

In [21]: expr.xreplace(Transform(split, lambda i: isinstance(i, Integral)))
Out[21]:
                  ⌠
⌠        ⌠        ⎮  2
⎮ 1 dx + ⎮ x dx + ⎮ x  dx + 3
⌡        ⌡        ⌡
于 2013-08-27T02:12:51.533 回答