我需要在一个相当长的,令人讨厌的扩张中找到一个术语的系数。我有一个多项式,比如f(x) = (x+x^2)/2
,然后是一个递归定义的函数:g_k(x,y) = y*f(g_{k-1}(x,y))
g_0(x,y)=yx
。
我想知道g_10(x,y)中x ^ 2y ^ 4的系数
我已将此编码为
import sympy
x, y = sympy.symbols('x y')
def f(x):
return (x+x**2)/2
def g(x,y,k):
if k==0:
return y*x
else:
return y*f(g(x,y,k-1))
fxn = g(x,y,2)
fxn.expand().coeff(x**2).coeff(y**4)
> 1/4
到目前为止一切顺利。
但现在我想找到k = 10的系数。现在fxn = g(x,y,10)
然后fxn.expand()
非常慢。显然有很多步骤正在进行,所以这并不奇怪。但我对同情的了解还不成熟 - 我只是开始专门使用它,因为我需要能够找到这些系数。我可以想象,可能有一种方法可以让人们认识到一切都是多项式,因此它可以更快地找到一个特定的系数,但我还没有找到这样做的例子。
是否有另一种方法可以通过同意来获得这个系数,或者我可以做些什么来加快它?
答案 0 :(得分:0)
我假设您只对给定的系数感兴趣,而不是整个多项式g(x,y,10)
。因此,您可以重新定义函数g
以在递归的每个步骤中删除更高的订单。这将大大加快您的计算速度。
def g(x,y,k):
if k==0:
return y*x
else:
temp = y*f(g(x,y,k-1)) + sympy.O(y**5) + sympy.O(x**3)
return temp.expand().removeO()
如下工作:首先将订单O(y**5), O(x**3)
(和更高)的所有内容分组,然后丢弃。请记住,您丢失了大量信息!