Pourquoi la quantité et les unités sont-elles incompatibles avec le comportement normal de Mathematica?

Nov 29 2020

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

17 Roman Nov 29 2020 at 16:22

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

10 AntonAntonov Nov 29 2020 at 15:18

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 Quantityfonctionnalités de la plupart des calculs. Mais c'est également dangereux, car certaines fonctions intégrées dépendent du bon Quantityfonctionnement. Par exemple, WeatherDataou FinancialData. Personnellement, 95% du temps après avoir ingéré dataavec ces fonctions que j'utilise data /. Quantity[x_, _] :> x.

Évaluation avec Quantityredé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];