用开源语言数值表示 Mathematica 的根对象

Numerically Representing Mathematica's Root Object in Open-Source Language

问题

我想重现一个 Root[] 对象,最好在 python 函数中

是否有适合此过程的特定库?

尝试次数

如果我正确理解 Root[] 函数,它只是找到多项式的 n 次根,所以我尝试 numpy.roots 就足够了 #1作为 numpy 文档中的参数 x

背景

我有许多 5 阶多项式根,由于从特别讨厌的拉普拉斯逆变换中获得的阶数,它们无法用 ToRadicals 减少。

最小的 Mathematica 示例

r = 1/τ;
ct = Cos[θ];
r2 = r^2;
r3 = r^3;
r4 = r2^2;
ct2 = ct^2;
ct3 = ct^3;
ct4 = ct2^2;
ct5 = ct^5;
ct6 = ct2^3;
p2 = ϕ^2;

fn := Root[2*ρ*p2*r^5 + 2*ρ*p2*r^5*ct - 2*ρ^2*p2*r^5*ct - 2*ρ*p2*r^5*ct2 - 2*ρ*p2*r^5*ct3 + 2*ρ^2*p2*r^5*ct3 + (r4 + 4*p2*r4 + 4*ρ*p2*r4 + r4*ct - 2*ρ*r4*ct + 4*p2*r4*ct - 2*ρ*p2*r4*ct - 2*ρ^2*p2*r4*ct - r4*ct2 - 4*p2*r4*ct2 - r4*ct3 + 2*ρ*r4*ct3 - 4*p2*r4*ct3 + 6*ρ*p2*r4*ct3 -  2*ρ^2*p2*r4*ct3)*#1 + (4*r3 + 8*p2*r3 + 2*ρ*p2*r3 +  3*r3*ct - 6*ρ*r3*ct + 4*p2*r3*ct - 4*ρ*p2*r3*ct - 3*r3*ct2 - 4*p2*r3*ct2 + 2*ρ*p2*r3*ct2 - 2*r3*ct3 + 4*ρ*r3*ct3)*#1^2 + (6*r2 + 4*p2*r2 + 3*r2*ct -  6*ρ*r2*ct - 3*r2*ct2 - r2*ct3 +  2*ρ*r2*ct3)*#1^3 + (4*r + r*ct - 2*ρ*r*ct -  r*ct2)*#1^4 + #1^5 &, 5]

如果对符号计算感兴趣,可以使用SymPy。特别是,SymPy 具有多项式对象和 类 RootOfCRootOf 来表示多项式的根。

例如,

In [103]: from sympy import Symbol, poly

In [104]: x = Symbol('x')

In [105]: p = poly(x**4 - 3*x**2 + x - 1)

In [106]: p
Out[106]: Poly(x**4 - 3*x**2 + x - 1, x, domain='ZZ')

In [107]: p.root(0)
Out[107]: CRootOf(x**4 - 3*x**2 + x - 1, 0)

CRootOf(poly, k) 是多项式第 k 个根的占位符。要找到它的数值,使用.evalf()方法:

In [109]: p.root(0).evalf()
Out[109]: -1.94397243715073

这里是所有根的数值:

In [110]: [p.root(k).evalf() for k in range(p.degree())]
Out[110]: 
[-1.94397243715073,
 1.66143946800762,
 0.141266484571554 - 0.538201812325831*I,
 0.141266484571554 + 0.538201812325831*I]