Mengapa Kuantitas dan Satuan tidak konsisten dengan perilaku Mathematica biasa?
Ketika saya memasukkan ini di Wolfram Mathematica V12:
0 Dogs + 5 Cats
Mathematica dengan bijaksana mengembalikan ini:
5 Cats
TAPI, jika saya menggunakan fitur Satuan dan Kuantitas di Mathematica V12, dan masukkan ini:
0 m + 37 m/s
Atau dalam bentuk panjang:
Quantity[0, "Meters"] + Quantity[37, "Meters"/"Seconds"]
Saya mendapat:
Quantity::compat: Meters/Seconds and Meters are incompatible units
Saya tahu satuannya tidak kompatibel, tetapi NOL "Meter" hanya 0 dan secara logis harus hilang dari persamaan seperti "0 Anjing" menghilang dari contoh pertama.
Bug ini merusak sebagian besar diferensiasi dan integrasi simbol.
Saya kira Wolfram benar-benar kacau dengan tidak membuat Unit menjadi bagian dari V1 di tahun 1980-an, dan malah menambahkannya sebagai terpaku pada tas , di V12. Bicara tentang "fitur yang merayap" ;-)
BTW, satu-satunya cara yang saya temukan untuk mengendalikan fungsi Mathematica yang mengerikan ini adalah dengan halaman aturan substitusi yang jelek seperti ini:
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
]
Tentu saja, peretasan jelek ini membuat perhitungan satu baris sederhana, yang sangat indah dan elegan di V4, sekarang banyak baris kode yang buruk dan tidak dapat dibaca.
Apakah saya melakukan sesuatu yang salah?
Apakah Mathematica V4 masih dijual?
Terima kasih,
- Joe
Contoh
Berikut adalah gambar yang lebih rinci dari kesalahan yang saya terima di Mathematica V12 ketika mencoba mengevaluasi integral sederhana. Menurut saya dalam evaluasi seperti Times atau Plus, atau apa pun, ekspresi Unit dengan besaran NOL harus dihilangkan, seperti yang akan dilakukan dengan pena dan kertas sederhana.

Jawaban
Bukan solusi tapi komentar panjang.
Anda salah memahami dasar fisik dari kuantitas dan satuan.
Setiap kuantitas fisik memiliki margin kesalahan yang melekat, meskipun sangat kecil (dapat diabaikan) dan dengan demikian ditekan secara diam-diam. Besaran 1 meter benar-benar berarti kira-kira 1 meter, berikan atau ambil beberapa milimeter / nanometer / jarak Planck .
Kuantitas 0 meter berarti jarak yang konsisten dengan nol dalam margin kesalahan pengukuran saya . Margin kesalahan ini membawa satuan, bahkan jika nilai rata-rata tepat nol. Jadi kita tidak bisa menghilangkan satuannya, dan 0 meter tidak sama dengan 0 apel atau 0 detik . Democritus sudah cukup banyak memikirkan hal ini 2500 tahun yang lalu.
Secara matematis, kita mengamati bahwa titik 0 berukuran nol pada sumbu nyata, dan merupakan satu-satunya titik $x$ dimana $x$meter bisa dikatakan sama dengan tidak ada . Tetapi besaran fisik mengacu pada interval , bukan titik , pada sumbu nyata, dan oleh karena itu satuan tidak pernah dapat dibatalkan seperti yang Anda sarankan.
Perilaku Mathematica dalam hal ini dengan demikian sepenuhnya diharapkan dan normal.
Apakah Mathematica V4 masih dijual?
Jawaban ini mengusulkan solusi yang tidak terlalu drastis daripada kembali ke Versi 4.
Solusi "global"
Untuk masalah yang Anda hadapi dan pendekatan, Anda mengambil satu - tidak terlalu bagus - proposal untuk mendefinisikan ulang Quantity
:
Unprotect[Quantity];
(*Quantity[x_,___]:=x;*)
Quantity[0, ___] := 0;
Protect[Quantity];
Catatan 1: Saya belum memeriksa atau menggunakan kode di atas secara ekstensif - ini lebih merupakan pernyataan "Saya berbagi rasa sakit Anda", dan, semacam, untuk mendorong posting lain yang mengusulkan solusi dengan gaya itu.
Catatan 2: Dengan Quantity[x_,___]:=x;
Anda dapat "menghapus" Quantity
fungsionalitas dari sebagian besar komputasi. Tetapi itu juga berbahaya, karena beberapa fungsi bawaan memang mengandalkan Quantity
bekerja dengan baik. Misalnya, WeatherData
atau FinancialData
. Secara pribadi, 95% dari waktu setelah menelan data
dengan fungsi yang saya gunakan data /. Quantity[x_, _] :> x
.

Evaluasi dengan Quantity
definisi ulang
Pertimbangkan untuk menggunakan fungsi ini daripada pendekatan "global" di atas (dan / atau Anda removeUnitsOfZeroMagnitude
):
Clear[RemoveQuantity]
SetAttributes[RemoveQuantity, {HoldFirst}];
RemoveQuantity[myExpression_] := Block[{Quantity = #1 &}, myExpression];
