How to solve an algebraic equation in formal power series?

不问归期 提交于 2019-12-11 06:26:14

问题


Motivation. It is well known that generating function for Catalan numbers satisfies quadratic equation. I would like to have first several coefficients of a function, implicitly defined by an algebraic equation (not necessarily a quadratic one!).

Example.

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)

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

display(sp.series(solution))

Question. The approach where we explicitly solve the equation and then expand it as power series, works only for low-degree equations. How to obtain first coefficients of formal power series for more complicated algebraic equations?

Related.

Since algebraic and differential framework may behave differently, I posted another question.

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


回答1:


I don't know a built-in way, but plugging in a polynomial for F and equating the coefficients works well enough. Although one should not try to find all coefficients at once from a large nonlinear system; those will give SymPy trouble. I take iterative approach, first equating the free term to zero and solving for c0, then equating 2nd and solving for c1, etc.

This assumes a regular algebraic equation, in which the coefficient of z**k in the equation involves the k-th Taylor coefficient of F, and does not involve higher-order coefficients.

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

This prints

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)


来源:https://stackoverflow.com/questions/46422538/how-to-solve-an-algebraic-equation-in-formal-power-series

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!