Warum stimmen Menge und Einheiten nicht mit dem regulären Mathematica-Verhalten überein?

Nov 29 2020

Wenn ich dies in Wolfram Mathematica V12 eingebe:

0 Dogs + 5 Cats

Mathematica gibt dies vernünftigerweise zurück:

5 Cats

ABER, wenn ich die Funktionen Einheiten und Menge in Mathematica V12 verwende und Folgendes eingebe:

0 m + 37 m/s

Oder in langer Form:

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

Ich bekomme:

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

Ich weiß, dass die Einheiten nicht kompatibel sind, aber NULL "Meter" ist nur 0 und sollte logischerweise aus der Gleichung verschwinden, genauso wie "0 Hunde" aus dem ersten Beispiel verschwindet.

Dieser Fehler unterbricht die meisten Differenzierungen und Integrationen von Symbolen.

Ich denke, Wolfram hat es wirklich vermasselt, indem er Units in den 1980er Jahren nicht zu V1 gemacht hat, und es stattdessen als aufgeklebte Tasche in V12 hinzugefügt . Sprechen Sie über "Creeping Featurism" ;-)

Übrigens, das einzige Mittel, das ich gefunden habe, um diese schreckliche Mathematica-Funktionalität zu steuern, sind Seiten mit hässlichen Substitutionsregeln wie diesen:

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
  ]

Natürlich macht dieser hässliche Hack einfache einzeilige Berechnungen, die in V4 so schön und elegant waren, jetzt viele Zeilen bösen, unlesbaren Codes.

Mache ich etwas falsch?

Steht Mathematica V4 noch zum Verkauf?

Vielen Dank,

  • Joe

Beispiel

Hier ist ein detaillierteres Bild der Fehler, die ich in Mathematica V12 erhalte, wenn ich versuche, ein einfaches Integral zu bewerten. Es scheint mir, dass in einer Bewertung wie Times oder Plus oder was auch immer Ausdrücke von Einheiten mit der Größe NULL entfernt werden sollten, wie man es mit einfachem Stift und Papier tun würde.

Antworten

17 Roman Nov 29 2020 at 16:22

Keine Lösung, sondern ein erweiterter Kommentar.

Sie verstehen die physikalischen Grundlagen von Mengen und Einheiten falsch.

Jede physikalische Größe hat eine inhärente Fehlerquote, auch wenn sie sehr klein (vernachlässigbar) und damit stillschweigend unterdrückt ist. Die Menge 1 Meter bedeutet wirklich ungefähr 1 Meter, geben oder nehmen Sie einige Millimeter / Nanometer / Planck-Abstände .

Die Menge 0 Meter bedeutet eine Entfernung, die innerhalb des Messfehlers meiner Messung mit Null übereinstimmt . Diese Fehlergrenze enthält Einheiten, auch wenn der Mittelwert genau Null ist. Wir können die Einheiten also nicht aufheben, und 0 Meter entsprechen nicht 0 Äpfeln oder 0 Sekunden . Demokrit hatte dies bereits vor 2500 Jahren herausgefunden.

Mathematisch beobachten wir, dass der Punkt 0 auf der realen Achse ein Nullmaß hat und der einzige Punkt ist $x$ wo $x$Man könnte sagen, dass Meter gleich nichts sind . Physikalische Größen beziehen sich jedoch auf Intervalle und nicht auf Punkte auf der realen Achse. Daher kann die Einheit niemals auf die von Ihnen vorgeschlagene Weise gelöscht werden.

Das Verhalten von Mathematica in dieser Angelegenheit ist daher völlig erwartet und normal.

10 AntonAntonov Nov 29 2020 at 15:18

Steht Mathematica V4 noch zum Verkauf?

Diese Antwort schlägt weniger drastische Lösungen vor als die Rückkehr zu Version 4.

"Globale" Lösung

Für die Probleme, auf die Sie stoßen und die Sie angehen, nehmen Sie einen - nicht so guten - Vorschlag, neu zu definieren Quantity:

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

Bemerkung 1: Ich habe den obigen Code nicht ausgiebig überprüft oder verwendet - er wurde eher als "Ich teile deine Schmerzen" -Anweisung und irgendwie als Anregung für andere Beiträge, die Lösungen in diesem Stil vorschlagen.

Bemerkung 2: Mit können Quantity[x_,___]:=x;Sie die QuantityFunktionen aus den meisten Berechnungen "entfernen" . Das ist aber auch gefährlich, da einige integrierte Funktionen von Quantityeiner ordnungsgemäßen Funktion abhängen. Zum Beispiel WeatherDataoder FinancialData. Persönlich 95% der Zeit nach der Einnahme datamit diesen Funktionen, die ich benutze data /. Quantity[x_, _] :> x.

Bewertung mit QuantityNeudefinition

Verwenden Sie diese Funktion anstelle des oben genannten "globalen" Ansatzes (und / oder Ihres removeUnitsOfZeroMagnitude):

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