Нежелательная оценка булевой экспрессии в симпти - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь сформулировать кусочную функцию в sympy, а затем построить ее, но я не могу сформулировать требуемую функцию. Проблема в том, что (x > 0) & (x < 1) оценивает x > 0 как всегда True, прежде чем его можно будет передать конструктору Piecewise. Это можно обойти, не устанавливая positive=True в конструкторе символов, но это делает квадрат root упрощенным до √(x^2), в этом случае я хочу, чтобы он упростился до x. В настоящее время я использую базовую (root) среду в последней версии Anaconda Distribution на windows. Код протестирован в вышеупомянутой среде с ноутбуком JupyterLab.

Текущий код:

from sympy import *
x = symbols('x', real=True, positive=True)
f = sqrt(x**2)

f_piecewise = Piecewise((2, (x > 0) & (x < 1) ),
          ( 3 * f, (x > 1) & (x < 2) ),
          ( -3 * f, (x > 2) & (x < 3)),
          (0, True)
         )

pprint(f_piecewise)
display(f_piecewise)
plot(f_piecewise, (x, -0.01, 3.01))

Результат из текущего кода:

⎧ 2        for x < 1    
⎪                       
⎪3⋅x   for x > 1 ∧ x < 2
⎨                       
⎪-3⋅x  for x > 2 ∧ x < 3
⎪                       
⎩ 0        otherwise    

Отсутствует логический вывод латекса и матплотлиба

Ожидаемый результат:

⎧ 2    for x > 0 ∧ x < 1
⎪                       
⎪3⋅x   for x > 1 ∧ x < 2
⎨                       
⎪-3⋅x  for x > 2 ∧ x < 3
⎪                       
⎩ 0        otherwise

Ожидаемый выход латекса и matplotlib

Я нашел исправление, когда делал это только с одной логической оценкой, например с большим, чем. Неисправный код:

test = Piecewise((f, (x > 0)),
                 (1, True) 
                )
pprint(test)
display(test)
plot(test)

Рабочий код:

test = Piecewise((f, Gt(x, 0, evaluate=False)),
                 (1, True) 
                )
pprint(test)
display(test)
plot(test)

Я пробовал следующее, чтобы заставить его работать с "и", но ни один из них не работал:

from sympy.parsing.sympy_parser import parse_expr
test = Piecewise((f, parse_expr("GreaterThan(x, 0, evaluate=False) & (x < 1)", {'x':x}, evaluate=False)),
                 (1, True) 
                )

test = Piecewise((f, And(GreaterThan(x, 0, evaluate=False), (x < 1), evaluate=False)),
                 (1, True) 
                )

Спасибо всем, кто нашел время, чтобы взглянуть на это: D.

...