2011-04-09 9 views
12

This pregunta me comenzó a pensar en cómo Mathematica detecta múltiples funciones que se trazan. Encuentro que realmente no entiendo el proceso.Detección y diseño de múltiples funciones en el gráfico de Mathematica

considerar:

Plot[{1, Sequence[2, 3], 4}, {x, 0, 1}, PlotRange -> {0, 5}] 

enter image description here

puedo entender que Plot encuentran tres elementos en la lista inicialmente, pero ¿cómo "sabe" a 2 estilo y 3 la misma? Es como si hubiera un recuerdo de la parte de la lista de partida de la que provienen estos dos elementos. ¿Como funciona esto?

+0

Interesante pregunta, ya que 'Plot' tiene el atributo' HoldAll' que aún se supone que expande los objetos 'Sequence', lo que implica que 'Plot' debería ver 4 elementos en la lista. – rcollyer

+4

@rcollyer Los objetos de secuencia solo se expandirán en el primer nivel de una función con el atributo 'HoldAll'. Compare 'Mantenga [{1, Sequence [2, 3], 4}]' con 'Hold [1, Sequence [2, 3], 4]'. Lo mismo se aplica a 'Evaluar', por ej. 'Mantenga presionada [{Evaluate [1 + 1]}]' vs 'Hold [Evaluate [1 + 1]]'. – Szabolcs

+0

@Szabolcs, no lo sabía. Entonces, la respuesta es simplemente que 'Sequence' se expande después de que se ha configurado el estilo. Agregaría eso a su respuesta, ya que sugiere bastante claramente lo que está sucediendo. – rcollyer

Respuesta

9

Bueno, sabe que hay tres argumentos sólo para:

In[13]:= Function[x, Length[Unevaluated[x]], HoldAll][{1, 
    Sequence[2, 3], 4}] 

Out[13]= 3 

Si se permite que x para evaluar, a continuación,

In[14]:= Function[x, Length[x], HoldAll][{1, Sequence[2, 3], 4}] 

Out[14]= 4 

EDIT: 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: Eché de menos la verdadera pregunta planteada y trataré de responderla ahora.

Once Plot determina el número de argumentos que construye {{style1, Line ..}, {style2, Line ..}, ...}. En el caso de {1, Secuencia [2,3], 4} se obtiene 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. Así que como ves el etiquetado en el mismo color se debe a la Secuencia [2,3] se trata como una función de recuadro negro 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}} 

yo estaba tratando de construir un alto nivel implementación que construiría 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 la rosca 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.

+0

Sasha, los votos en esta respuesta indican claramente que es útil para otros, pero el comportamiento ilustrado fue evidente para mí antes de publicarlo. Lo que me hace adivinar es la parte que Szabolcs plantea. Si puede explicar en mayor detalle o con más autoridad cómo funciona eso, lo agradecería. –

+0

Gracias por la edición, ¡eso es mucho más útil! +1 –

+0

@Sasha ¿Cómo es posible en * Mathematica * aplanar listas sin usar el evaluador? –

8

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

Cuestiones relacionadas