Я пытаюсь преобразовать выражение, содержащее термины с различными степенями символьной переменной z_s
, в полином в Python с использованием 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, у которого обрезан «маленький» член:
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()
и .coeffs()
?