动机。众所周知,加泰罗尼亚数的生成函数满足二次方程。我希望得到函数的前几个系数,由代数方程隐式定义(不一定是二次方程!)。
示例。
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))
问题。我们明确求解方程然后将其扩展为幂级数的方法仅适用于低次方程。如何获得更复杂的代数方程的形式幂级数的第一系数?
由于代数和差异框架可能表现不同,我发布了另一个问题。
Sympy: how to solve differential equation in formal power series?
答案 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)