我有以下代码:

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()仅扩展积分的内部表达式。

最佳答案

SymPy中没有直接执行此操作的功能(yet),但您自己进行操作并不难。

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

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

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


这只会将整数一分为二,因此,如果要除以更大的整数,则需要使其更通用,或者多次应用。而且,如果积分是针对其他变量的,则需要进行更改。

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

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仅适用于积分对象。 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
⌡        ⌡        ⌡

关于python - 在sympy的总和上分配积分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18434892/

10-15 10:22