2011-08-09 13 views
14

Estoy tratando de obtener una comprensión más profunda de cómo las expresiones de Mathematica se representan internamente, y estoy desconcertado por la lógica del comando Level en Mathematica. Si tenemos la siguiente entrada:¿Cómo interpretas los niveles negativos en Mathematica?

In[1]:= a = z*Sin[x + y] + z1*Cos[x1 + y1] 

Out[1]= z1 Cos[x1 + y1] + z Sin[x + y] 

In[2]:= FullForm[a] 

Out[2]= Plus[Times[z1,Cos[Plus[x1,y1]]],Times[z,Sin[Plus[x,y]]]] 

In[3]:= TreeForm[a] 

Obtenemos el siguiente árbol:

tree form of expression a, above

Si nos preguntamos Mathematica para volver Nivel 4 solamente, obtenemos:

In[4]:= Level[a,{4}] 
Out[4]= {x1,y1,x,y} 

I Entiendo que estamos 4 niveles por debajo de la "raíz" (el operador Plus en el nivel 0). De hecho, creo que entiendo que los índices positivos siempre están en relación con la posición del tallo del árbol. (Espero tener razón sobre eso ??)

En contraste, cuando pides un nivel negativo, no hay un punto de referencia común (como el vástago anterior), porque las diferentes ramas del árbol son de diferentes longitudes . Por eso, si le preguntas a Mathematica para proporcionar solamente el nivel -1, obtenemos:

In[6]:= Level[a,{-1}] 
Out[6]= {z1,x1,y1,z,x,y} 

Me sorprendió por esta salida, cuando me había imaginado que debería volver {x1, y1, x, y} (sin z1 & z). Pero está bien, si trato de entender esto, tomo -1 para significar "el final de cada rama". Si esto es cierto, entonces que sería de esperar Level[a,{-2}] para volver:

{z1*Cos[x1+y1],z*Sin[x+y],x1+y1,x+y} 

Pero, esto no es lo que yo vuelva, los rendimientos de Mathematica:

In[8]:= Level[a,{-2}] 
Out[8]= {x1+y1,x+y} 

lo tanto, ahora estoy confundido, y don' Ver una forma consistente de entender el resultado de los niveles negativos.

¿Existe una forma consistente y más fácil de entender este tema? ¿Hay alguna manera "correcta" de que debería leer la estructura del árbol?

Perdón por la "pregunta larga", pero espero que entiendas lo que estoy preguntando.

Respuesta

14

Si nos fijamos en la docs, dicen:

Un -n nivel negativo consiste en todas las partes de expr con profundidad n.

Por lo tanto, los niveles negativos no se cuentan desde un punto de referencia, sino que se definen en función de la profundidad de las subexpresiones. z1*Cos[x1+y1] es de profundidad 4, por lo que no se devuelve cuando solicita Level[..., {-2}].

+7

Conciso y claro - +1. Me gustaría añadir que las especificaciones de nivel sin llaves (como en 'Level [expr, -d] 'describen todas las subexpresiones de profundidad * al menos *' d', que son equivalentes a 'Level [expr, {1 , -d}] 'Esto nos permite combinar niveles positivos y negativos de maneras no triviales. Por ejemplo, esto:' Level [a, {2, -2}] 'devolverá solo sub-expresiones en los niveles a continuación y incluyendo el nivel '2', * y * teniendo profundidad * al menos *' 2'. –

Cuestiones relacionadas