¿Por qué la cantidad y las unidades son inconsistentes con el comportamiento regular de Mathematica?

Nov 29 2020

Cuando entro esto en Wolfram Mathematica V12:

0 Dogs + 5 Cats

Mathematica devuelve sensatamente esto:

5 Cats

PERO, si utilizo las funciones Unidades y Cantidad en Mathematica V12, e ingreso esto:

0 m + 37 m/s

O en forma larga:

Quantity[0, "Meters"] + Quantity[37, "Meters"/"Seconds"]

Yo obtengo:

 Quantity::compat: Meters/Seconds and Meters are incompatible units

Sé que las unidades no son compatibles, pero CERO "Metros" es solo 0 y lógicamente debería desaparecer de la ecuación al igual que "0 Perros" desaparece del primer ejemplo.

Este error rompe la mayoría de la diferenciación e integración de símbolos.

Supongo que Wolfram realmente se equivocó al no hacer que las unidades fueran parte de V1 en la década de 1980, y en su lugar lo agregó como una bolsa pegada , en V12. Hablar de "características rastreras" ;-)

Por cierto, el único medio que he encontrado para controlar esta horrible funcionalidad de Mathematica es con páginas de feas reglas de sustitución como esta:

removeUnitsOfZeroMagnitude[myExpression_] := Module[{},
  myExpression /. Quantity[0, "Meters"] -> 0 /. 
     Quantity[0, "Meters"/"Seconds"] -> 0 /. 
    Quantity[0, "Meters"/"Seconds"^2] -> 0 /. 
   Quantity[0, "Meters"/"Seconds"^3] -> 0
  ]

Por supuesto, este truco feo hace cálculos simples de una línea, que eran tan hermosos y elegantes en V4, ahora muchas líneas de código desagradable e ilegible.

¿Estoy haciendo algo mal?

¿Mathematica V4 todavía está a la venta?

Gracias,

  • Joe

Ejemplo

Aquí hay una imagen más detallada de los errores que recibo en Mathematica V12 cuando intento evaluar una integral simple. Me parece que en una evaluación como Times o Plus, o lo que sea, las expresiones de Unidades con magnitud CERO deberían eliminarse, como se haría con un simple lápiz y papel.

Respuestas

17 Roman Nov 29 2020 at 16:22

No es una solución, sino un comentario extenso.

No comprende los fundamentos físicos de cantidades y unidades.

Cada magnitud física tiene un margen de error inherente, incluso si es muy pequeño (insignificante) y, por lo tanto, se suprime tácitamente. La cantidad de 1 metro realmente significa aproximadamente 1 metro, más o menos unos pocos milímetros / nanómetros / distancias de Planck .

La cantidad 0 metros significa una distancia que es consistente con cero dentro del margen del error de mi medición . Este margen de error tiene unidades, incluso si el valor medio es exactamente cero. Entonces no podemos cancelar las unidades, y 0 metros no es igual a 0 manzanas o 0 segundos . Demócrito ya se había dado cuenta de esto hace 2500 años.

Matemáticamente, observamos que el punto 0 es de medida cero en el eje real, y es el único punto $x$ dónde $x$Se podría decir que los metros no equivalen a nada . Pero las cantidades físicas se refieren a intervalos , no a puntos , en el eje real y, por lo tanto, la unidad nunca se puede cancelar de la forma que usted sugiere.

El comportamiento de Mathematica en este asunto es, por tanto, completamente esperado y normal.

10 AntonAntonov Nov 29 2020 at 15:18

¿Mathematica V4 todavía está a la venta?

Esta respuesta propone soluciones menos drásticas que retroceder para la Versión 4.

Solución "global"

Para los problemas que encuentra y el enfoque, toma una, no tan buena, la propuesta es redefinir Quantity:

Unprotect[Quantity];
(*Quantity[x_,___]:=x;*)
Quantity[0, ___] := 0;
Protect[Quantity];

Observación 1: No he revisado ni utilizado el código anterior de manera extensa; lo expresó más como una declaración de "Comparto sus dolores" y, en cierto modo, para alentar a otras publicaciones que propongan soluciones en ese estilo.

Observación 2: Con Quantity[x_,___]:=x;puede "eliminar" las Quantityfuncionalidades de la mayoría de los cálculos. Pero eso también es peligroso, porque algunas funciones integradas dependen de que Quantityfuncionen correctamente. Por ejemplo, WeatherDatao FinancialData. Personalmente, el 95% del tiempo después de ingerir datacon esas funciones que uso data /. Quantity[x_, _] :> x.

Evaluación con Quantityredefinición

Considere usar esta función en lugar del enfoque "global" anterior (y / o su removeUnitsOfZeroMagnitude):

Clear[RemoveQuantity]
SetAttributes[RemoveQuantity, {HoldFirst}];
RemoveQuantity[myExpression_] := Block[{Quantity = #1 &}, myExpression];