如何在Mathematica中按间隔定义函数?

Dun*_*nda 18 wolfram-mathematica

如何在Mathematica中定义函数f(x),如果x在[-5,-4]或[1,3]中,则给出1,否则为0?它可能很简单,但我无法弄清楚!

Sim*_*mon 30

你想要的基本结构Piecewise,特别是你要求的功能可以写成

f[x_] := Piecewise[{{1, -5 <= x <= -3}, {1, 1 <= x <= 3}}, 0]
Run Code Online (Sandbox Code Playgroud)

要么

f[x_] := Piecewise[{{1, -5 <= x <= -3 || 1 <= x <= 3}}, 0]
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个参数0定义了默认值(或"else")值,因为默认默认值为0.

还要注意的是,虽然PiecewiseWhich在形式上很相似,Piecewise是构建功能,同时Which可以进行编程.Piecewise将在集成,简化等方面发挥更好......,它也有适当的左括号数学符号,请参阅文档中的示例.


既然你想要的分段函数是相当简单的,也有可能是从阶梯函数等构成Boole,UnitStep并且UnitBox,如

UnitBox[(x + 4)/2] + UnitBox[(x - 2)/2]
Run Code Online (Sandbox Code Playgroud)

这些只是特殊情况Piecewise,如图所示PiecewiseExpand

In[19]:= f[x] == UnitBox[(x+4)/2] + UnitBox[(x-2)/2]//PiecewiseExpand//Simplify
Out[19]= True
Run Code Online (Sandbox Code Playgroud)

或者,你可以像使用开关功能HeavisideThetaHeavisidePi

HeavisidePi[(x + 4)/2] + HeavisidePi[(x - 2)/2]
Run Code Online (Sandbox Code Playgroud)

这很好,因为如果将函数视为一个分布,那么它的导数将返回Dirac delta函数的正确组合.


有关更多讨论,请参阅教程分段函数.


Dr.*_*ius 13

虽然西蒙的答案是规范和正确的答案,但这里还有两个选择:

f[x_] := 1 /; IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
f[x_?NumericQ] := 0
Run Code Online (Sandbox Code Playgroud)

要么

f[x_] := If[-5 <= x <= -3 || 1 <= x <= 3, 1, 0]
Run Code Online (Sandbox Code Playgroud)

编辑:
请注意,第一个选项取决于输入定义的顺序(感谢Sjoerd指出这一点).一个类似的解决方案没有这个问题,并且在提供Interval输入时也能正常工作

f[x_] := 0 /; !IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
f[x_] := 1 /;  IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
Run Code Online (Sandbox Code Playgroud)

  • 为[IntervalMemberQ] +1(http://reference.wolfram.com/mathematica/ref/IntervalMemberQ.html).我似乎从未在Mathematica中使用[Interval](http://reference.wolfram.com/mathematica/ref/Interval.html)算法...... (2认同)