使用 SymPy / Python 进行部分分数分解

pet*_*rov 8 python numpy sympy python-3.x pandas

我如何找到常数 A,B,C,D,K,S 使得

1/(x**6+1) = (A*x+B)/(x**2+1) + (C*x+D)/(x**2-sqrt(3)*x+1) + (K*x+S)/(x**2+sqrt(3)*x+1)

对每一个实数 x 都为真。

我可能需要一些 sympy 代码,不确定。或者任何其他可以在这里提供帮助的 Python 库。

我手动尝试过,但一点也不简单:经过 1 小时的计算,我发现我可能犯了一些错误。

我在 SymPy 中尝试了部分分数分解,但并没有那么远。

我也尝试过 Wolfram Alpha,但它似乎也没有分解到那个细节级别。

WA尝试

请参阅下面 WA 给出的替代形式。

编辑

我完全手工进行了第二次尝试,得到了这些:

A = 0
B = 1/3
C = -1/(2*sqrt(3))
D = 1/3
K = 1/(2*sqrt(3))
S = 1/3

我如何验证这些是否正确?

编辑 2

我的问题的要点是:如何使用一些不错的/可重用的 Python 代码来做到这一点?

Osc*_*min 4

您可以使用apartsympy 来执行此操作,但apart默认情况下会寻找有理因式分解,因此您必须告诉它在 中工作Q(sqrt(3))

\n
In [37]: apart(1/(x**6+1))                                                                                                                     \nOut[37]: \n        2                     \n       x  - 2           1     \n- \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n    \xe2\x8e\x9b 4    2    \xe2\x8e\x9e     \xe2\x8e\x9b 2    \xe2\x8e\x9e\n  3\xe2\x8b\x85\xe2\x8e\x9dx  - x  + 1\xe2\x8e\xa0   3\xe2\x8b\x85\xe2\x8e\x9dx  + 1\xe2\x8e\xa0\n\nIn [36]: apart(1/(x**6+1), extension=sqrt(3))                                                                                                  \nOut[36]: \n       \xe2\x88\x9a3\xe2\x8b\x85x - 2            \xe2\x88\x9a3\xe2\x8b\x85x + 2           1     \n- \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n    \xe2\x8e\x9b 2           \xe2\x8e\x9e     \xe2\x8e\x9b 2           \xe2\x8e\x9e     \xe2\x8e\x9b 2    \xe2\x8e\x9e\n  6\xe2\x8b\x85\xe2\x8e\x9dx  - \xe2\x88\x9a3\xe2\x8b\x85x + 1\xe2\x8e\xa0   6\xe2\x8b\x85\xe2\x8e\x9dx  + \xe2\x88\x9a3\xe2\x8b\x85x + 1\xe2\x8e\xa0   3\xe2\x8b\x85\xe2\x8e\x9dx  + 1\xe2\x8e\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:评论要求一种在更一般的情况下找到它的方法,而不需要知道sqrt(3)生成扩展。

\n

我们可以用.apart(full=True)线性因子来计算完整的 PFE:

\n
In [29]: e = apart(1/(x**6+1), full=True).doit()\n\nIn [30]: e\nOut[30]: \n       \xe2\x88\x9a3   \xe2\x85\x88           \xe2\x88\x9a3   \xe2\x85\x88          \xe2\x88\x9a3   \xe2\x85\x88           \xe2\x88\x9a3   \xe2\x85\x88                            \n     - \xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80         - \xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80          \xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80           \xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80                            \n       2    2           2    2          2    2           2    2           \xe2\x85\x88           \xe2\x85\x88    \n- \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n    \xe2\x8e\x9b    \xe2\x88\x9a3   \xe2\x85\x88\xe2\x8e\x9e     \xe2\x8e\x9b    \xe2\x88\x9a3   \xe2\x85\x88\xe2\x8e\x9e     \xe2\x8e\x9b    \xe2\x88\x9a3   \xe2\x85\x88\xe2\x8e\x9e     \xe2\x8e\x9b    \xe2\x88\x9a3   \xe2\x85\x88\xe2\x8e\x9e   6\xe2\x8b\x85(x + \xe2\x85\x88)   6\xe2\x8b\x85(x - \xe2\x85\x88)\n  6\xe2\x8b\x85\xe2\x8e\x9cx + \xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x8e\x9f   6\xe2\x8b\x85\xe2\x8e\x9cx + \xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x8e\x9f   6\xe2\x8b\x85\xe2\x8e\x9cx - \xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x8e\x9f   6\xe2\x8b\x85\xe2\x8e\x9cx - \xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x8e\x9f                        \n    \xe2\x8e\x9d    2    2\xe2\x8e\xa0     \xe2\x8e\x9d    2    2\xe2\x8e\xa0     \xe2\x8e\x9d    2    2\xe2\x8e\xa0     \xe2\x8e\x9d    2    2\xe2\x8e\xa0 \n
Run Code Online (Sandbox Code Playgroud)\n

这不是我们想要的,因为您想要真正的二次分母而不是引入复数。这里的术语以复共轭对的形式出现,因此我们可以将这些对组合起来:

\n
In [46]: terms1 = []\n\nIn [47]: for a in terms:\n    ...:     if conjugate(a) not in terms1:\n    ...:         terms1.append(a)\n    ...: \n\nIn [49]: terms_real = [(t+t.conjugate()) for t in terms1]\n\nIn [51]: Add(*(factor(cancel(t)) for t in terms_real))\nOut[51]: \n      \xe2\x88\x9a3\xe2\x8b\x85x - 2            \xe2\x88\x9a3\xe2\x8b\x85x + 2            1     \n- \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n    \xe2\x8e\x9b 2           \xe2\x8e\x9e     \xe2\x8e\x9b 2           \xe2\x8e\x9e     \xe2\x8e\x9b 2    \xe2\x8e\x9e\n  6\xe2\x8b\x85\xe2\x8e\x9dx  - \xe2\x88\x9a3\xe2\x8b\x85x + 1\xe2\x8e\xa0   6\xe2\x8b\x85\xe2\x8e\x9dx  + \xe2\x88\x9a3\xe2\x8b\x85x + 1\xe2\x8e\xa0   3\xe2\x8b\x85\xe2\x8e\x9dx  + 1\xe2\x8e\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,通常可能不存在任何简单的根表达式 (Abel-Ruffini),因此这种部分分数展开式对于所有可能的分母多项式都不会成功。这就是为什么.apart默认情况下计算不可约分母的展开式(总是可以成功的)。

\n