用开源语言数值表示 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 具有多项式对象和 类 RootOf
和 CRootOf
来表示多项式的根。
例如,
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]
问题
我想重现一个 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 具有多项式对象和 类 RootOf
和 CRootOf
来表示多项式的根。
例如,
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]