В Sympy я хочу определить кусочную функцию внутри [1, 3] и хочу явно запретить значения за пределами этого диапазона.
Мой текущий код выглядит следующим образом. Я использую nan для обозначения значений, выходящих за пределы диапазона.
from sympy import *
from sympy.plotting import Plot
x = symbols('x')
f = Piecewise(
(x * 2 - 3, (x = 1)),
(5 - x * 2, (x = 2)),
(nan, True),
)
Однако я столкнулся с двумя проблемами. Во-первых, я не могу использовать f в условии другой кусочной функции, потому что Sympy не может сравнить nan с 0.
>>> g = Piecewise((2, f < 0), (3, True))
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3/dist-packages/sympy/functions/elementary/piecewise.py", line 136, in __new__
pair = ExprCondPair(*getattr(ec, 'args', ec))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/functions/elementary/piecewise.py", line 28, in __new__
cond = piecewise_fold(cond)
^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/functions/elementary/piecewise.py", line 1156, in piecewise_fold
new_args.append((expr.func(*e), And(*c)))
^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/core/relational.py", line 836, in __new__
raise TypeError("Invalid NaN comparison")
TypeError: Invalid NaN comparison
>>>
>>> plot(f)
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1873, in plot
plots.show()
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 251, in show
self._backend.show()
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1549, in show
self.process_series()
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1546, in process_series
self._process_series(series, ax, parent)
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1367, in _process_series
x, y = s.get_data()
^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 605, in get_data
points = self.get_points()
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 779, in get_points
f_start = f(self.start)
^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/plotting/experimental_lambdify.py", line 176, in __call__
result = complex(self.lambda_func(args))
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/sympy/plotting/experimental_lambdify.py", line 272, in __call__
return self.lambda_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "", line 1, in
NameError: name 'nan' is not defined. Did you mean: 'NaN'?
>>>
Есть ли собственный способ указать домен f? Или мне придется отслеживать домен вручную?
В Sympy я хочу определить кусочную функцию внутри [1, 3] и хочу явно запретить значения за пределами этого диапазона. Мой текущий код выглядит следующим образом. Я использую nan для обозначения значений, выходящих за пределы диапазона. [code]from sympy import * from sympy.plotting import Plot
x = symbols('x')
f = Piecewise( (x * 2 - 3, (x = 1)), (5 - x * 2, (x = 2)), (nan, True), ) [/code] Однако я столкнулся с двумя проблемами. Во-первых, я не могу использовать f в условии другой кусочной функции, потому что Sympy не может сравнить nan с 0. [code]>>> g = Piecewise((2, f < 0), (3, True)) Traceback (most recent call last): File "", line 1, in File "/usr/lib/python3/dist-packages/sympy/functions/elementary/piecewise.py", line 136, in __new__ pair = ExprCondPair(*getattr(ec, 'args', ec)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/functions/elementary/piecewise.py", line 28, in __new__ cond = piecewise_fold(cond) ^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/functions/elementary/piecewise.py", line 1156, in piecewise_fold new_args.append((expr.func(*e), And(*c))) ^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/core/relational.py", line 836, in __new__ raise TypeError("Invalid NaN comparison") TypeError: Invalid NaN comparison >>> [/code] Во-вторых, я не могу построить f: [code]>>> plot(f) Traceback (most recent call last): File "", line 1, in File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1873, in plot plots.show() File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 251, in show self._backend.show() File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1549, in show self.process_series() File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1546, in process_series self._process_series(series, ax, parent) File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 1367, in _process_series x, y = s.get_data() ^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 605, in get_data points = self.get_points() ^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/plotting/plot.py", line 779, in get_points f_start = f(self.start) ^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/plotting/experimental_lambdify.py", line 176, in __call__ result = complex(self.lambda_func(args)) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/sympy/plotting/experimental_lambdify.py", line 272, in __call__ return self.lambda_func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1, in NameError: name 'nan' is not defined. Did you mean: 'NaN'? >>> [/code] Есть ли собственный способ указать домен f? Или мне придется отслеживать домен вручную?