数量と単位が通常のMathematicaの振る舞いと矛盾するのはなぜですか?
Wolfram Mathematica V12でこれを入力すると:
0 Dogs + 5 Cats
Mathematicaは賢明にこれを返します:
5 Cats
しかし、Mathematica V12の単位と数量の機能を使用している場合は、次のように入力します。
0 m + 37 m/s
または長い形式で:
Quantity[0, "Meters"] + Quantity[37, "Meters"/"Seconds"]
私は得る:
Quantity::compat: Meters/Seconds and Meters are incompatible units
単位に互換性がないことは知っていますが、ゼロの「メーター」は0であり、最初の例から「0犬」が消えるのと同じように、論理的に方程式から消えるはずです。
このバグは、ほとんどのシンボルの区別と統合を壊します。
Wolframは、1980年代にUnitsをV1の一部にせず、代わりにV12でバッグに接着して追加したことで本当に失敗したと思います。「忍び寄る特徴」について話す;-)
ところで、この恐ろしいMathematica機能を制御するために私が見つけた唯一の手段は、次のような醜い置換ルールのページを使用することです。
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
]
もちろん、この醜いハックは単純な1行の計算を行います。これは、V4では非常に美しくエレガントでしたが、今では多くの厄介で判読できないコードが含まれています。
私は何か間違ったことをしていますか?
Mathematica V4はまだ販売されていますか?
ありがとう、
- ジョー
例
これは、単純な積分を評価しようとしたときにMathematicaV12で受け取るエラーのより詳細な画像です。TimesやPlusなどの評価では、単純なペンと紙の場合と同様に、大きさがゼロの単位の表現を削除する必要があるように思われます。

回答
解決策ではなく、拡張コメント。
数量と単位の物理的な基盤を誤解しています。
すべての物理量には、たとえそれが非常に小さく(無視できる)、暗黙的に抑制されている場合でも、固有の許容誤差があります。1メートルという量は、実際には約1メートルを意味し、数ミリメートル/ナノメートル/プランク距離を与えるか、または取ります。
量0メートルは、私の測定誤差の範囲内でゼロと一致する距離を意味します。このエラーマージンは、平均値が正確にゼロであっても、単位を持ちます。したがって、単位をキャンセルすることはできません。また、0メートルは0リンゴまたは0秒と等しくありません。デモクリトスは2500年前にすでにこれをかなり理解していました。
数学的には、点0は実軸上でゼロ測定であり、唯一の点であることがわかります。 $x$ どこ $x$メートルは何もないと言うことができます。ただし、物理量は実際の軸上の点ではなく間隔を参照するため、提案した方法で単位をキャンセルすることはできません。
したがって、この問題におけるMathematicaの振る舞いは完全に予想され、正常です。
Mathematica V4はまだ販売されていますか?
この回答は、バージョン4に戻るよりも抜本的な解決策を提案していません。
「グローバル」ソリューション
あなたが遭遇し、アプローチする問題については、1つを取ります-それほど良くはありません-提案は再定義することQuantity
です:
Unprotect[Quantity];
(*Quantity[x_,___]:=x;*)
Quantity[0, ___] := 0;
Protect[Quantity];
備考1:私は上記のコードを広範囲にチェックまたは使用していません-それは「私はあなたの苦痛を共有します」というステートメントとして、そしてある種、そのスタイルで解決策を提案する他の投稿を奨励するためにそれを置きます。
備考2:を使用Quantity[x_,___]:=x;
するとQuantity
、ほとんどの計算から機能を「削除」できます。ただし、一部の組み込み関数はQuantity
適切に機能することに依存しているため、これも危険です。たとえば、WeatherData
またはFinancialData
。個人的には、data
私が使用しているこれらの機能を摂取した後の95%の時間data /. Quantity[x_, _] :> x
。

Quantity
再定義による評価
上記の「グローバル」アプローチ(および/またはあなたのremoveUnitsOfZeroMagnitude
)の代わりにこの関数を使用することを検討してください。
Clear[RemoveQuantity]
SetAttributes[RemoveQuantity, {HoldFirst}];
RemoveQuantity[myExpression_] := Block[{Quantity = #1 &}, myExpression];
