Pourquoi la quantité et les unités sont-elles incompatibles avec le comportement normal de Mathematica?
Quand j'entre ceci dans Wolfram Mathematica V12:
0 Dogs + 5 Cats
Mathematica renvoie raisonnablement ceci:
5 Cats
MAIS, si j'utilise les fonctionnalités Unités et Quantité dans Mathematica V12, et entrez ceci:
0 m + 37 m/s
Ou sous forme longue:
Quantity[0, "Meters"] + Quantity[37, "Meters"/"Seconds"]
Je reçois:
Quantity::compat: Meters/Seconds and Meters are incompatible units
Je sais que les unités ne sont pas compatibles, mais ZERO "Meters" est juste 0 et devrait logiquement disparaître de l'équation tout comme "0 Dogs" disparaît du premier exemple.
Ce bogue rompt la plupart de la différenciation et de l'intégration des symboles.
Je suppose que Wolfram a vraiment merdé en ne faisant pas partie des Unités de V1 dans les années 1980, et l'a plutôt ajouté comme un sac collé , en V12. Parlez de "featurism rampant" ;-)
BTW, le seul moyen que j'ai trouvé pour contrôler cette horrible fonctionnalité Mathematica est avec des pages de règles de substitution laides comme celle-ci:
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
]
Bien sûr, ce truc laid fait de simples calculs d'une ligne, qui étaient si beaux et élégants dans V4, maintenant de nombreuses lignes de code méchant et illisible.
Est-ce que je fais quelque chose de mal?
Mathematica V4 est-il toujours à vendre?
Merci,
- Joe
Exemple
Voici une image plus détaillée des erreurs que je reçois dans Mathematica V12 lorsque j'essaie d'évaluer une intégrale simple. Il me semble que dans une évaluation comme Times ou Plus, ou autre, les expressions d'Unités de magnitude ZERO devraient être supprimées, comme on le ferait avec un simple stylo et papier.

Réponses
Pas une solution mais un commentaire prolongé.
Vous ne comprenez pas les fondements physiques des quantités et des unités.
Chaque grandeur physique a une marge d'erreur inhérente, même si elle est très petite (négligeable) et donc tacitement supprimée. La quantité 1 mètre signifie vraiment environ 1 mètre, soit quelques millimètres / nanomètres / distances de Planck .
La quantité 0 mètre signifie une distance cohérente avec zéro dans la marge d'erreur de ma mesure . Cette marge d'erreur comporte des unités, même si la valeur moyenne est précisément zéro. Nous ne pouvons donc pas annuler les unités, et 0 mètre n'est pas égal à 0 pomme ou 0 seconde . Démocrite avait déjà pratiquement compris cela il y a 2500 ans.
Mathématiquement, on observe que le point 0 est de mesure nulle sur l'axe réel, et est le seul point $x$ où $x$on pourrait dire que les mètres ne valent rien . Mais les quantités physiques font référence à des intervalles , et non à des points , sur l'axe réel, et par conséquent, l'unité ne peut jamais être annulée de la manière que vous suggérez.
Le comportement de Mathematica à cet égard est donc tout à fait attendu et normal.
Mathematica V4 est-il toujours à vendre?
Cette réponse propose des solutions moins drastiques que de revenir en arrière pour la version 4.
Solution «globale»
Pour les problèmes que vous rencontrez et abordez, une proposition - pas très bonne - consiste à redéfinir Quantity
:
Unprotect[Quantity];
(*Quantity[x_,___]:=x;*)
Quantity[0, ___] := 0;
Protect[Quantity];
Remarque 1: Je n'ai pas vérifié ou utilisé le code ci-dessus de manière extensive - il l'a mis plus comme une déclaration «Je partage vos douleurs», et, en quelque sorte, pour encourager d'autres articles proposant des solutions dans ce style.
Remarque 2: Avec Quantity[x_,___]:=x;
vous pouvez "supprimer" les Quantity
fonctionnalités de la plupart des calculs. Mais c'est également dangereux, car certaines fonctions intégrées dépendent du bon Quantity
fonctionnement. Par exemple, WeatherData
ou FinancialData
. Personnellement, 95% du temps après avoir ingéré data
avec ces fonctions que j'utilise data /. Quantity[x_, _] :> x
.

Évaluation avec Quantity
redéfinition
Pensez à utiliser cette fonction au lieu de l'approche «globale» ci-dessus (et / ou votre removeUnitsOfZeroMagnitude
):
Clear[RemoveQuantity]
SetAttributes[RemoveQuantity, {HoldFirst}];
RemoveQuantity[myExpression_] := Block[{Quantity = #1 &}, myExpression];
