Как определить функцию f (x) в Mathematica, которая дает 1, если x в [-5, -4] или [1, 3] и 0 в противном случае? Это, наверное, что-то простое, но я просто не могу понять это!
Как определить функцию через интервалы в Mathematica?
Ответ 1
Основная конструкция, которую вы хотите, - Piecewise
, в частности запрошенная функция может быть написана как
f[x_] := Piecewise[{{1, -5 <= x <= -3}, {1, 1 <= x <= 3}}, 0]
или
f[x_] := Piecewise[{{1, -5 <= x <= -3 || 1 <= x <= 3}}, 0]
Обратите внимание, что последний аргумент 0
определяет значение по умолчанию (или "else" ) не требуется, поскольку по умолчанию используется значение по умолчанию 0.
Также обратите внимание, что хотя Piecewise
и Which
очень похожи по форме, Piecewise
для построения функций, а Which
- для программирования. Piecewise
будет играть лучше с интеграцией, упрощением и т.д., он также имеет правильную математическую нотацию слева, см. примеры в документации.
Поскольку кусочная функция, которую вы хотите, довольно проста, она также может быть построена из ступенчатых функций, таких как Boole
, UnitStep
и UnitBox
, например
UnitBox[(x + 4)/2] + UnitBox[(x - 2)/2]
Это только особые случаи Piecewise
, как показано PiecewiseExpand
In[19]:= f[x] == UnitBox[(x+4)/2] + UnitBox[(x-2)/2]//PiecewiseExpand//Simplify
Out[19]= True
В качестве альтернативы вы можете использовать функции переключения, такие как HeavisideTheta
или HeavisidePi
, например
HeavisidePi[(x + 4)/2] + HeavisidePi[(x - 2)/2]
которые хороши, потому что, рассматривая функцию как распределение, тогда ее производная вернет правильную комбинацию функций Dirac delta.
Подробнее см. в учебнике Кусочные функции.
Ответ 2
Хотя ответ Саймона является каноническим и правильным, вот еще два варианта:
f[x_] := 1 /; IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
f[x_?NumericQ] := 0
или
f[x_] := If[-5 <= x <= -3 || 1 <= x <= 3, 1, 0]
Edit:
Обратите внимание, что первый параметр зависит от порядка ввода определений (спасибо Sjoerd за указание этого). Аналогичное решение, которое не имеет этой проблемы, также будет корректно работать при вводе Interval
в качестве входного сигнала
f[x_] := 0 /; !IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
f[x_] := 1 /; IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
Ответ 3
Все хорошо и хорошо, но в качестве общего правила большого пальца нужно всегда стараться простейший подход и избегать как можно большего от сложного программирования на высоком уровне. В этой конкретной ситуации я имею в виду следующее:
f [x_/; -5 <= x <= -3] = 0 и т.д. И т.д.