我有以下代码:
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/