考虑 SymPy 符号e
和的两个函数i
:
from sympy import Symbol, expand, Order
i = Symbol('i')
e = Symbol('e')
f = (i**3 + i**2 + i + 1)
g = (e**3 + e**2 + e + 1)
z = expand(f*g)
这将产生
z = e**3*i**3 + e**3*i**2 + e**3*i + e**3 + e**2*i**3 + e**2*i**2 + e**2*i + e**2 + e*i**3 + e*i**2 + e*i + e + i**3 + i**2 + i + 1
但是,假设e
和i
都很小,我们可以忽略三阶或更高阶的两项。使用 Sympy 的系列工具或简单地添加一个 O-notationOrder
类可以处理这个问题:
In : z = expand(f*g + Order(i**3) + Order(e**3))
Out: 1 + i + i**2 + e + e*i + e*i**2 + e**2 + e**2*i + e**2*i**2 + O(i**3) + O(e**3)
看起来很棒。但是,我仍然有好坏参半e**2 * i**2
。这些术语中的单个变量小于所需的截止值,因此 SymPy 保留它们。然而,数学上小²·小² = 小⁴。同样,e·i² = small·small² = small³。
至少出于我的目的,我希望删除这些混合术语。添加混合Order
不会产生预期的结果(它似乎忽略了前两个订单)。
In : expand(f*g + Order(i**3) + Order(e**3) + Order((i**2)*(e**2)))
Out: 1 + i + i**2 + i**3 + e + e*i + e*i**2 + e*i**3 + e**2 + e**2*i + e**3 + e**3*i + O(e**2*i**2, e, i)
问题: SymPy 是否有一个简单的系统可以快速删除 n 阶项,以及 (e^a)·(i^b) 其中 a+b > n 的项?
凌乱的解决方案:我找到了解决这个问题的方法,但它很凌乱并且可能不通用。
z = expand(f*g + Order((e**2)*i) + Order(e*(i**2)))
zz = expand(z.removeO() + Order(e**3) + Order(i**3))
生产
zz = 1 + i + i**2 + e + e*i + e**2 + O(i**3) + O(e**3)
这正是我想要的。所以要具体说明我的问题:有没有一种方法可以在一个步骤中做到这一点,并且可以推广到任何 n?此外,我的解决方案丢失了表示混合项丢失的大 O 符号。这不是必需的,但会很好。