Condicionales en Mathematica

Imagen (si ves este texto, recarga la página)

Lo que el gráfico muestra es una función
$$f(x)=\left\{\begin{array}{ll}16\,\mathrm{e}^{-x^2/3},&x<0\\[0.1in]\lfloor{x}\rfloor,&0\leq{x}<8\\[0.1in]25-x,&8\leq{x}<14\\[0.1in]5\sin{x},&x\geq14\end{array}\right.$$ lograda no con Piecewise, sino con un vulgar y silvestre If (anidado):
Plot[If[x > 0, If[x < 8, Floor[x], If[x < 14, -x + 22, 5 Sin[x]]],
16 Exp[-1/3 x^2]], {x, -5, 7 Pi}, PlotStyle -> {Red, Thick},
Exclusions -> {x == 0, x == 8, x == 14}, AxesLabel -> {x, f[x]}]
Esto surge por una pregunta que me encontré en Mathematica SE (por la que decidí por fin registrarme). Se pregunta cómo evaluar sumatorios con condiciones, por ejemplo
$$\sum_{\substack{i=-\infty\\i\neq0}}^{\infty}\,\sum_{\substack{j=2\\j|i\\j\neq{i}}}^{n}f(i,j)$$ puede lograrse con una instrucción del tipo
Sum[If[Divisible[i, j] && i != 0 && i != j, f[i, j], 0],
{i, -Infinity, Infinity}, {j, 2, n}]
Lo que hace If[cond, V, F] es regresar V si cond es cierta o F si cond es falsa. Ésta, y en general los condicionales, son funciones bien conocidas por quienes gustan programar, y en Mathematica a veces puede no ser obvio el cómo implementarlas. Acá se muestran los condicionales comunes en Mathematica, y como se dice, algunos resultan más económicos que un If anidado. Curiosamente en SE la mejor respuesta no fue la mía, sino una que proponía utilizar Boole. Y pues en efecto, Boole[A] regresa 1 si A es cierta o 0 si A es falsa. La suma anterior entonces se escribiría como
Sum[f[i, j] Boole[i != 0] Boole[Divisible[i, j]] Boole[i != j],
{i, -Infinity, Infinity}, {j, 2, n}]
La salida, por ejemplo, para ${-10\leq{i}\leq10,\,2\leq{j}\leq10}$ de esta suma, es
f[-10, 2] + f[-10, 5] + f[-10, 10] + f[-9, 3] + f[-9, 9] + f[-8, 2] +
f[-8, 4] + f[-8, 8] + f[-7, 7] + f[-6, 2] + f[-6, 3] + f[-6, 6] +
f[-5, 5] + f[-4, 2] + f[-4, 4] + f[-3, 3] + f[-2, 2] + f[4, 2] +
f[6, 2] + f[6, 3] + f[8, 2] + f[8, 4] + f[9, 3] + f[10, 2] + f[10, 5]
Tal vez es sólo cuestión de gustos, pero en general ésta me parece la forma más sencilla de usar los condicionales en Mathematica, simplemente incorporarlos al argumento de la función en cuestión.

No comments:

Post a Comment