Подтвердить что ты не робот

Как определить функцию через интервалы в Mathematica?

Как определить функцию f (x) в Mathematica, которая дает 1, если x в [-5, -4] или [1, 3] и 0 в противном случае? Это, наверное, что-то простое, но я просто не могу понять это!

4b9b3361

Ответ 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 и т.д. И т.д.