Comment définir une fonction par intervalles dans Mathematica?

Comment puis-je définir une fonction f(x) dans Mathematica qui donne 1 si x est dans [-5, -4] ou [1, 3] et 0 sinon? C'est probablement quelque chose de simple mais je n'arrive pas à le comprendre!

18
demandé sur Dunda 2011-10-03 08:54:38

3 réponses

La construction de base que vous voulez est Piecewise, en particulier la fonction que vous demandiez peut être écrite comme

f[x_] := Piecewise[{{1, -5 <= x <= -3}, {1, 1 <= x <= 3}}, 0]

ou

f[x_] := Piecewise[{{1, -5 <= x <= -3 || 1 <= x <= 3}}, 0]

notez que le dernier argument, 0 définit la valeur par défaut (ou "else") n'est pas nécessaire car la valeur par défaut est 0.

notez aussi que bien que Piecewise et Which sont très semblables dans leur forme, Piecewise sert à construire des fonctions, tandis que Which pour la programmation. Piecewise jouera mieux avec l'intégration, la simplification, etc..., il a aussi la notation mathématique de l'Accolade à gauche, voir les exemples dans le documentation.


puisque la fonction par morceaux que vous voulez est assez simple, elle pourrait aussi être construite à partir de fonctions step comme Boole,UnitStep et UnitBox, e.g.

UnitBox[(x + 4)/2] + UnitBox[(x - 2)/2]

ce sont juste cas spéciaux de Piecewise, comme le montre PiecewiseExpand

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

alternativement, vous pouvez utiliser des fonctions de commutation comme HeavisideTheta ou HeavisidePi, e.g.

HeavisidePi[(x + 4)/2] + HeavisidePi[(x - 2)/2]

ce qui est bien, parce que si on traite la fonction comme une distribution, alors sa dérivée retournera la bonne combinaison de delta de Dirac fonctions.


Pour plus de détails, voir le tutoriel Par Morceaux Fonctions.

29
répondu Simon 2011-10-03 05:15:26

bien que la réponse de Simon soit canonique et correcte, voici deux autres options:

f[x_] := 1 /; IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
f[x_?NumericQ] := 0

ou

f[x_] := If[-5 <= x <= -3 || 1 <= x <= 3, 1, 0]

Edit:

Notez que la première option dépend de l'ordre dans lequel les définitions ont été entrées (merci à Sjoerd de le souligner). Une solution similaire qui n'ont pas ce problème et fonctionnera correctement lorsqu'il est fourni un Interval entrée

f[x_] := 0 /; !IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
f[x_] := 1 /;  IntervalMemberQ[Interval[{-5, -3}, {1, 3}], x]
13
répondu Dr. belisarius 2011-10-05 22:15:36

tout est bon et bien, mais comme une règle générale du pouce on devrait essayer toujours l'approche la plus simple et garder loin que possible de la programmation sophistiquée de haut niveau. Dans cette situation particulière, je veux dire ce qui suit:

f[x_/; -5 <= x < = -3] = 0 etc... etc

0
répondu alinux 2013-01-10 09:01:38