¿Por qué la cantidad y las unidades son inconsistentes con el comportamiento regular de Mathematica?
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
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.
¿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 Quantity
funcionalidades de la mayoría de los cálculos. Pero eso también es peligroso, porque algunas funciones integradas dependen de que Quantity
funcionen correctamente. Por ejemplo, WeatherData
o FinancialData
. Personalmente, el 95% del tiempo después de ingerir data
con esas funciones que uso data /. Quantity[x_, _] :> x
.

Evaluación con Quantity
redefinició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];
