Я пытаюсь сформулировать кусочную функцию в 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.