wolfram mathematica - varias - Detección y diseño de múltiples funciones en el argumento de Mathematica
funciones en mathematica (2)
Esta pregunta me hizo pensar en cómo Mathematica detecta múltiples funciones que se trazan. Encuentro que realmente no entiendo el proceso.
Considerar:
Plot[{1, Sequence[2, 3], 4}, {x, 0, 1}, PlotRange -> {0, 5}]
Puedo entender que Plot
encuentre inicialmente tres elementos en la lista, pero ¿cómo "saber" al estilo 2
y 3
la misma manera? Es como si hubiera un recuerdo de la parte de la lista de partida de la que provienen estos dos elementos. ¿Como funciona esto?
Bueno, sabe que hay tres argumentos:
In[13]:= Function[x, Length[Unevaluated[x]], HoldAll][{1,
Sequence[2, 3], 4}]
Out[13]= 3
Si x tiene permitido evaluar, entonces
In[14]:= Function[x, Length[x], HoldAll][{1, Sequence[2, 3], 4}]
Out[14]= 4
EDITAR: uno lo ve mejor con:
In[15]:= Hold[{1, Sequence[2, 3], 4}]
Out[15]= Hold[{1, Sequence[2, 3], 4}]
en otras palabras, el aplanamiento de Sequence requiere un evaluador.
EDIT 2: claramente me perdí la verdadera pregunta planteada y trataré de responderla ahora.
Una vez que Plot determina el número de argumentos que construye {{style1, Line ..}, {style2, Line ..}, ...}. En el caso de {1, Secuencia [2,3], 4} obtenemos la siguiente estructura:
In[23]:= Cases[
Plot[{1, Sequence[2, 3], 4}, {x, 0, 1},
PlotRange -> {0, 5}], {_Hue, __Line},
Infinity] /. {x_Line :> Line, _Hue -> Hue}
Out[23]= {{Hue, Line}, {Hue, Line, Line}, {Hue, Line}}
Al trazar {1, {2,3}, 4} obtenemos una estructura diferente:
In[24]:= Cases[
Plot[{1, List[2, 3], 4}, {x, 0, 1},
PlotRange -> {0, 5}], {_Hue, __Line},
Infinity] /. {x_Line :> Line, _Hue -> Hue}
Out[24]= {{Hue, Line}, {Hue, Line}, {Hue, Line}, {Hue, Line}}
porque las listas se aplanarían, simplemente no se usaría el evaluador. Entonces, como ve, el etiquetado en el mismo color ocurre porque Secuencia [2,3] se trata como una función de caja negra que devuelve una lista de dos elementos:
In[25]:= g[x_?NumberQ] := {2, 3}
In[26]:= Cases[
Plot[{1, g[x], 4}, {x, 0, 1}, PlotRange -> {0, 5}], {_Hue, __Line},
Infinity] /. {x_Line :> Line, _Hue -> Hue}
Out[26]= {{Hue, Line}, {Hue, Line, Line}, {Hue, Line}}
Intentaba construir una implementación de alto nivel que construyera tal estructura, pero uno tiene que luchar contra el evaluador. Por ejemplo:
In[28]:= Thread /@ Function[x,
Thread[{Hold @@ {Range[Length[Unevaluated[x]]]}, Hold[x]}, Hold]
, HoldAll][{1, Sequence[2, 3], 4}]
Out[28]= Hold[Thread[{{1, 2, 3}, {1, Sequence[2, 3], 4}}]]
Ahora tenemos que evaluar el hilo sin evaluar sus argumentos, lo que daría {{1, 1}, {2, secuencia [2,3]}, {3, 4}}, donde el primer elemento de la lista es una etiqueta , y las siguientes son funciones para ser muestreadas.
Espero que esto ayude.
No es tan difícil imaginar un proceso que dé como resultado esta salida. No tengo pruebas adicionales de que esto sea realmente lo que sucede, pero es razonable suponer que Plot
recorre la lista de funciones que se le pasaron y asocia un estilo con cada una. Luego procede a evaluar cada uno de ellos después de establecer un valor para la variable de trazado. Normalmente cada "función" (elemento en la lista que pasó a Plot
) devolvería un número real. Sin embargo, desde la versión 6, Mathematica puede manejar aquellos que también devuelven listas de números, con la falla de que usa el mismo estilo para la lista completa. La versión 5 arrojaría un error para las funciones que devolvieron listas.