Ошибка интегрирования Sympy: невозможно преобразовать символы в int - PullRequest
0 голосов
/ 06 марта 2020

Попытка интегрировать функцию Piecewise в Sympy выдает ошибку TypeError: can't convert symbols to int. Я не нашел полезной информации об этой ошибке в Интернете.

Интеграл не должен содержать целых чисел. Я не уверен, почему что-то должно быть преобразовано в int. Функция в приведенном ниже примере упрощена - мне нужно интегрировать более сложные кусочные функции в зависимости от параметров.

Код:

import sympy as sy

h1, h2 = sy.symbols("h_1 h_2", positive=True)
vy = sy.symbols("v_Y", real=True)

h1 = 1.5
h2 = 0.5

pdfy = sy.Piecewise((h1, (0<=vy)&(vy<=(1-h2)/h1)), (h2, ((1-h2)/h1<vy)&(vy<=1)), (0,True))
print(pdfy.evalf(0.1))
print(sy.integrate(vy*(pdfy.evalf(vy)),(vy,0.9,1)))

Выход:

Piecewise((0.e+0, (v_Y >= 0) & (v_Y <= 0.333333333333333)), (0.e+0, (v_Y <= 1) & (v_Y >     0.333333333333333)), (0, True))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-83-69fbacdbf6ac> in <module>
     10 pdfy = sy.Piecewise((h1, (0<=vy)&(vy<=(1-h2)/h1)), (h2, ((1-h2)/h1<vy)&(vy<=1)),         (0,True))
     11 print(pdfy.evalf(0.1))
---> 12 print(sy.integrate(vy*(pdfy.evalf(vy)),(vy,0.9,1)))

~/anaconda3/lib/python3.6/site-packages/sympy/core/evalf.py in evalf(self, n, subs, maxn, chop,     strict, quad, verbose)
   1435         if not evalf_table:
   1436             _create_evalf_table()
-> 1437         prec = dps_to_prec(n)
   1438         options = {'maxprec': max(prec, int(maxn*LG10)), 'chop': chop,
   1439                'strict': strict, 'verbose': verbose}

~/anaconda3/lib/python3.6/site-packages/mpmath/libmp/libmpf.py in dps_to_prec(n)
     65     """Return the number of bits required to represent n decimals
     66     accurately."""
---> 67     return max(1, int(round((int(n)+1)*3.3219280948873626)))
     68 
     69 def repr_dps(n):

~/anaconda3/lib/python3.6/site-packages/sympy/core/expr.py in __int__(self)
    291         from sympy import Dummy
    292         if not self.is_number:
--> 293             raise TypeError("can't convert symbols to int")
    294         r = self.round(2)
    295         if not r.is_Number:

TypeError: can't convert symbols to int

1 Ответ

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

Глядя на ошибку, когда вы вызываете pdfy.evalf(vy), evalf вызывает dps_to_pre c (vy), для которого в качестве параметра требуется число. Однако vy - это символ, который вы получили от sy.symbols("v_Y", real=True). Следовательно, python дает ошибку TypeError: can't convert symbols to int

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...