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!
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.
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]
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