我有以下代码:
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()
只会扩展积分的内部表达式。
答案 0 :(得分:2)
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
仅适用于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
⌡ ⌡ ⌡