Sympy решение набора результатов поиска в виде числа с плавающей запятой, целого числа и т. Д. - PullRequest
0 голосов
/ 02 марта 2020

Я решаю кумулятивные функции вероятности (или уравнения в целом, если вы хотите думать об этом таким образом) с sympy solveset. Все идет нормально. Однако они возвращают «наборы» как тип вывода результатов. У меня проблемы с преобразованием или сохранением их как стандартных переменных типа python: в моем случае я бы хотел, чтобы это было число с плавающей точкой.

Мой код выглядит следующим образом:

import sympy as sp
from sympy import Symbol 
from sympy import erf
from sympy import log
from sympy import sqrt

x = Symbol('x')   
p = 0.1

sp.solveset((0.5 + 0.5*erf((log(x) - mu)/(sqrt(2)*sigma)))-p)
Out[91]: 
FiniteSet(7335.64225447845*exp(-1.77553477605362*sqrt(2)))

Есть ли возможность преобразовать это в float? просто использование float() не работает, так как я попробовал это, и я также дошел до того, что каким-то образом сохранил его как список, а затем снова извлек число. Однако этот способ кажется очень громоздким и не подходит для моей цели. В конце я скажу, решить это уравнение выше 1000 раз, и я хотел бы получить все результаты в виде аккуратного массива, содержащего числа с плавающей запятой.

Если вы сохраните приведенный выше результат следующим образом:

q = sp.solveset((0.5 + 0.5*erf((log(x) - mu)/(sqrt(2)*sigma)))-p)

, тогда Python говорит, что типом является sets.setsFiniteSet, и если вы попытаетесь получить доступ к переменной q, это выдаст вам ошибку ( работает в Spyder):

"Spyder не смог получить значение этой переменной из консоли - Сообщение об ошибке было:« У объекта кортежа нет атрибута «lift_error» ».

I понятия не имею, что это значит. Большое спасибо.

1 Ответ

1 голос
/ 02 марта 2020

FiniteSet работает как Python set. Вы можете преобразовать его в список и извлечь элемент путем индексации, например:

In [3]: S = FiniteSet(7335.64225447845*exp(-1.77553477605362*sqrt(2)))                                                                         

In [4]: S                                                                                                                                      
Out[4]: 
⎧                  -1.77553477605362⋅√2⎫
⎨7335.64225447845⋅ℯ                    ⎬
⎩                                      ⎭

In [5]: list(S)                                                                                                                                
Out[5]: 
⎡                  -1.77553477605362⋅√2⎤
⎣7335.64225447845⋅ℯ                    ⎦

In [6]: list(S)[0]                                                                                                                             
Out[6]: 
                  -1.77553477605362⋅√2
7335.64225447845⋅ℯ                    

In [7]: list(S)[0].n()                                                                                                                         
Out[7]: 595.567591563886
...