如何求解形式幂级数中的代数方程?

时间:2017-09-26 09:22:18

标签: sympy

动机。众所周知,加泰罗尼亚数的生成函数满足二次方程。我希望得到函数的前几个系数,由代数方程隐式定义(不一定是二次方程!)。

  

示例。

import sympy as sp
sp.init_printing() # math as latex
from IPython.display import display
z = sp.Symbol('z')
F = sp.Function('F')(z)
equation = 1 + z * F**2 - F
display(equation)

z F^{2}{\left (z \right )} - F{\left (z \right )} + 1

solution = sp.solve(equation, F)[0]
display(solution)

\frac{1}{2 z} \left(- \sqrt{- 4 z + 1} + 1\right)

display(sp.series(solution))

enter image description here

  

问题。我们明确求解方程然后将其扩展为幂级数的方法仅适用于低次方程。如何获得更复杂的代数方程的形式幂级数的第一系数?

相关。

由于代数和差异框架可能表现不同,我发布了另一个问题。

Sympy: how to solve differential equation in formal power series?

1 个答案:

答案 0 :(得分:1)

我不知道内置方式,但插入F的多项式并使系数等于有效。虽然不应该试图从大型非线性系统中同时找到所有系数;那些会给SymPy带来麻烦。我采用迭代方法,首先将自由项等于零并求解c0,然后等于第二并求解c1等。

这假设一个常规的代数方程,其中方程中的z**k系数涉及F的第k个泰勒系数,并且不涉及高阶系数。

from sympy import *
z = Symbol('z')
d = 10                                 # how many coefficients to find
c = list(symbols('c:{}'.format(d)))    # undetermined coefficients
for k in range(d):
    F = sum([c[n]*z**n for n in range(k+1)])  # up to z**k inclusive
    equation = 1 + z * F**2 - F
    coeff_eqn = Poly(series(equation, z, n=k+1).removeO(), z).coeff_monomial(z**k)
    c[k] = solve(coeff_eqn, c[k])[0]
sol = sum([c[n]*z**n for n in range(d)])  # solution
print(series(sol + z**d, z, n=d))         # add z**d to get SymPy to print as a series

打印

1 + z + 2*z**2 + 5*z**3 + 14*z**4 + 42*z**5 + 132*z**6 + 429*z**7 + 1430*z**8 + 4862*z**9 + O(z**10)