2015-06-11 2 views
4

Я пытаюсь преобразовать выражение, содержащее термины с различными степенями символьной переменной z_s, в полином в python, используя sympy.Poly(), чтобы затем я мог извлечь коэффициенты с помощью .coeffs().Почему Sympy отрезала полиномиальные термины с малыми коэффициентами?

Выражение I имеет многочлен высокого порядка с независимой символической переменной 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') 

Как вы можете видеть, первые несколько терминов были вынуты.

Сначала я подумал, что это отрезало мои термины высокого порядка, потому что для многочленов высокого порядка было встроенное обрезание, но я не мог найти это в любой документации. Затем я обнаружил, что термины, которые обрезаются, по-видимому, обрезаны из-за низкого значения коэффициента (я полагаю, что симплекс или питон полагают, что этот термин ничтожен, поскольку его коэффициент настолько близок к нулю). Вы можете видеть в моей функции, что первый член имеет коэффициент приблизительно -1.3e-61. Я проверил эту теорию, используя простой пример 2-член полинома с 1-й степенью, который имеет «маленький» член отрезан:

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

(EDIT: + 1 должны быть в пределах функции h, я просто неподвижным . это так правильно читает Это не изменяет выход) Это возвращает:.

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

Как вы можете видеть, член, содержащий коэффициент 10e-27 был исключен из полинома, и только постоянная (1.0) остается.

Я не мог найти информацию об этом на нескольких форумах или в документации SymPy (если только не пропустил это). Однако я обнаружил, что люди пытались сделать точную противоположность тому, что я пытался сделать (например, here): они пытались отрезать термины с небольшими коэффициентами, тогда как я пытаюсь избавиться от python от резки от этих условий.

Есть ли способ сказать python/sympy, что я не хочу, чтобы эти маленькие коэффициенты были установлены на ноль?

Или, чтобы обойти эту проблему, есть ли другой способ извлечения коэффициентов из моей исходной функции в порядке, не используя sympy.Poly() и .coeffs()?

+0

Это больше не является проблемой в SymPy 1.1.1, поэтому текущий ответ на этот вопрос - «обновить SymPy». – FTP

ответ

1

Я не знаю, почему симплексы усекают небольшие коэффициенты при построении многочлена над вещественными, но это не делает этого по рациональным. Таким образом, вы можете построить полином с domain='QQ', извлечь коэффициенты, а затем преобразовать обратно в поплавки. не

Пример с помощью многочлена:

import sympy 
z_s = symbols('z_s') 
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.N(c) for c in sympy.poly(f,z_s,domain='QQ').coeffs()] 

возвращает

[-1.29096669270427e-61, 6.24438995041203e-59, -6.41125090009095e-57, -8.30852813320818e-55, 5.84175807723288e-53, 1.88577332997761e-50, 9.46504910106607e-49, -2.28903644846359e-46, -4.63321594171589e-44, -1.78254194888339e-42, 6.43406800910469e-40, 1.20425521347205e-37, 3.41167535222460e-36, -1.92084369416715e-33, -3.04107684362554e-31, 2.89289551256439e-30, 6.38382842182985e-27, 5.46438700248253e-25, -8.50501280745176e-23, -1.63445953023060e-20, 1.07764488797684e-18, 3.47026242660686e-16, -2.93966702403133e-14, -5.25394006214533e-12, 1.21642330162702e-9, -1.16577645027166e-7, 6.82117624588787e-6, -0.000267513120031891, 0.00723589681411793, -0.134846078975788, 1.69035817278476, -13.5277365002646, 62.3459673862853, -76.5029927727737] 
Смежные вопросы