5

を使用して係数を抽出できるように、シンボリック変数のさまざまな程度の項を含む式をz_sPythonの多項式に変換しようとしています。sympy.Poly().coeffs()

私が持っている式は、独立したシンボリック変数 z_s を持つ高次多項式です。どういうわけか、sympy.Poly() を使用して式を多項式に変換すると、係数の小さい項が切り捨てられているように見えます。以下は私の関数で、シンボリック多項式として再定義した行を含めました。

f = -1.29096669270427e-61*z_s**33 + 6.24438995041203e-59*z_s**32 - 6.41125090009095e-57*z_s**31 - 8.30852813320818e-55*z_s**30 + 5.84175807723288e-53*z_s**29 + 1.88577332997761e-50*z_s**28 + 9.46504910106607e-49*z_s**27 - 2.28903644846359e-46*z_s**26 - 4.63321594171589e-44*z_s**25 - 1.78254194888339e-42*z_s**24 + 6.43406800910469e-40*z_s**23 + 1.20425521347205e-37*z_s**22 + 3.4116753522246e-36*z_s**21 - 1.92084369416715e-33*z_s**20 - 3.04107684362554e-31*z_s**19 + 2.89289551256439e-30*z_s**18 + 6.38382842182985e-27*z_s**17 + 5.46438700248253e-25*z_s**16 - 8.50501280745176e-23*z_s**15 - 1.6344595302306e-20*z_s**14 + 1.07764488797684e-18*z_s**13 + 3.47026242660686e-16*z_s**12 - 2.93966702403133e-14*z_s**11 - 5.25394006214533e-12*z_s**10 + 1.21642330162702e-9*z_s**9 - 1.16577645027166e-7*z_s**8 + 6.82117624588787e-6*z_s**7 - 0.000267513120031891*z_s**6 + 0.00723589681411793*z_s**5 - 0.134846078975788*z_s**4 + 1.69035817278476*z_s**3 - 13.5277365002646*z_s**2 + 62.3459673862853*z_s - 76.5029927727737
sympy.Poly(f,z_s)

これは以下を返します:

Poly(-2.93966702403133e-14*z_s**11 - 5.25394006214533e-12*z_s**10 + 1.21642330162702e-9*z_s**9 - 1.16577645027166e-7*z_s**8 + 6.82117624588787e-6*z_s**7 - 0.000267513120031891*z_s**6 + 0.00723589681411793*z_s**5 - 0.134846078975788*z_s**4 + 1.69035817278476*z_s**3 - 13.5277365002646*z_s**2 + 62.3459673862853*z_s - 76.5029927727737, z_s, domain='RR')

ご覧のとおり、最初のいくつかの用語が削除されました。

最初は、高次多項式のカットオフが組み込まれているため、高次項がカットオフされていると思いましたが、どのドキュメントでもそうであることがわかりませんでした。次に、係数値が低いために、切り捨てられている項が切り捨てられているように見えることを発見しました (sympy または python は、係数がゼロに非常に近いため、項は無視できると考えています)。私の関数では、最初の項の係数が約 であることがわかります-1.3e-61。「小さな」項カットオフを持つ次数 1 の 2 項多項式の簡単な例を使用して、この理論をテストしました。

h = 10e-27*z_s + 1
sympy.Poly(h,z_s)

(編集:関数+ 1内にあるはずhです。正しく読み取れるように修正しました。これは出力を変更しません。)これは次を返します:

Poly(1.0, z_s, domain='RR')

ご覧のとおり、係数を含む項10e-27は多項式から削除され、定数 ( 1.0) だけが残ります。

複数のフォーラムや SymPy のドキュメントでこれに関する情報を見つけることができませんでした (見逃していない限り)。しかし、人々が私がやろうとしていたこととは正反対のことをしようとしていることがわかりました (たとえば、ここを参照): 彼らは小さな係数で項を切り捨てようとしていましたが、私は python の切り取りを防止しようとしています。それらの条件から。

これらの小さな係数をゼロに設定したくないことを python/sympy に伝える方法はありますか?

sympy.Poly()または、この問題を回避するために、 andを使用せずに元の関数から係数を順番に抽出する別の方法はあり.coeffs()ますか?

4

1 に答える 1