TypeError: не может определить значение истинности Relational при кусочном использовании sympy - PullRequest
0 голосов
/ 15 апреля 2020

В своих исследованиях я не нашел примеров относительного значения в кусочных функциях. Хотя я получил нижнее и верхнее значения с помощью метода uni_dis , я застрял в процессе передачи этих значений в кусочную функцию. В чем причина?

from sympy import Symbol, Piecewise
import sympy as sym
import sympy.plotting as syp
import math

a = Symbol('a')
b = Symbol('b')
x = Symbol('x')
function = 1 / abs(a-b)

def uni_dis(lower, upper):
    if lower > upper:
        lower, upper = upper, lower
    uniform = Piecewise((0, x < lower), (0, x > upper), (function.subs({a:lower, b:upper}), x >= lower and x <= upper))
    syp.plot(uniform.subs((x,-10,10), title="uni_dis"))

uni_dis(231, 675)

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

TypeError                                 Traceback (most recent call last)
<ipython-input-3-c28135b22fc4> in <module>
----> 1 uni_dis(231, 675)

<ipython-input-2-e4a205990c2a> in uni_dis(lower, upper)
      2     if lower > upper:
      3         lower, upper = upper, lower
----> 4     uniform = Piecewise((0, x < lower), (0, x > upper), (function.subs({a:lower, b:upper}), x >= lower and x <= upper))
      5     syp.plot(uniform.subs((x,-10,10), title="uni_dis"))

C:\ProgramData\Anaconda3\lib\site-packages\sympy\core\relational.py in __nonzero__(self)
    374 
    375     def __nonzero__(self):
--> 376         raise TypeError("cannot determine truth value of Relational")
    377 
    378     __bool__ = __nonzero__

TypeError: cannot determine truth value of Relational

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы должны изменить x >= lower and x <= upper на (x >= lower) & (x <= upper). Проблема в том, что логические вычисления с объектами SymPy могут возвращать другой символ c logi c, который не может быть выведен в True или False. Вы можете увидеть, как (x >= lower).__class__ возвращает еще один экземпляр неравенства симпы.

0 голосов
/ 16 апреля 2020

После исправления логических выражений я получил ошибку " TypeError: 'Symbol' не подлежит подписке ". Проведя некоторые исследования, я узнал, что метод построения графика можно использовать с кусочным методом как здесь . И это все.

Исправленная версия кода:

def uniform_dist(lower, upper):
    if lower > upper:
        lower, upper = upper, lower
    syp.plot(Piecewise((0, x < lower), (0, x > upper), (f.subs({a:lower, b:upper}), (x >= lower) & (x <= upper))), (x,-10,10), title="uniform distribution")
...