수량 및 단위가 일반적인 Mathematica 동작과 일치하지 않는 이유는 무엇입니까?

Nov 29 2020

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

나는 단위가 호환되지 않는다는 것을 알고 있지만, ZERO "Meters"는 단지 0이고 첫 번째 예에서 "0 Dogs"가 사라지는 것처럼 방정식에서 논리적으로 사라져야합니다.

버그 는 대부분의 기호 구별 및 통합을 중단합니다.

나는 Wolfram이 1980 년대에 V1에 Units를 포함시키지 않아서 정말 망쳐 버렸다고 생각합니다. 대신 V12에서 그것을 가방에 붙입니다 . "들어가는 기능"에 대해 이야기 ;-)

BTW,이 끔찍한 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
  ]

물론,이 추악한 해킹은 V4에서 매우 아름답고 우아했던 간단한 한 줄 계산을 만듭니다. 이제는 여러 줄의 불쾌하고 읽을 수없는 코드입니다.

내가 뭘 잘못하고 있니?

Mathematica V4는 아직 판매 중입니까?

감사,

다음은 단순 적분을 평가하려고 할 때 Mathematica V12에서받는 오류에 대한 자세한 이미지입니다. Times 또는 Plus와 같은 평가에서 나에게 보이는 것은 단순한 펜과 종이로 할 때처럼 크기가 ZERO 인 Units의 표현을 제거해야합니다.

답변

17 Roman Nov 29 2020 at 16:22

해결책이 아니라 확장 된 주석입니다.

당신은 수량과 단위의 물리적 토대를 오해합니다.

모든 물리량은 매우 적어서 (무시할 수 있음) 암묵적으로 억제 되더라도 고유 한 오차 한계가 있습니다. 1 미터 의 양은 실제로 약 1 미터를 의미 하며 몇 밀리미터 / 나노 미터 / 플랑크 거리를 제공하거나 취합니다 .

수량 0 미터 는 내 측정 오차 범위 내에서 0과 일치하는 거리를 의미 합니다 . 이 오차 한계는 평균값이 정확히 0이더라도 단위를 전달합니다. 따라서 단위를 취소 할 수 없으며 0 미터사과 0 개 또는 0 초 와 같지 않습니다 . Democritus 는 이미 2500 년 전에 이것을 알아 냈습니다.

수학적으로 우리는 점 0이 실제 축에서 0 측정이고 유일한 점이라는 것을 관찰합니다. $x$ 어디 $x$미터아무것도 같지 않다고 말할 수 있습니다 . 그러나 물리량 은 실제 축에서 점이 아니라 간격을 참조 하므로 단위는 사용자가 제안한 방식으로 취소 할 수 없습니다.

따라서이 문제에 대한 Mathematica의 행동은 완전히 예상되고 정상입니다.

10 AntonAntonov Nov 29 2020 at 15:18

Mathematica V4는 아직 판매 중입니까?

이 답변은 버전 4로 돌아가는 것보다 덜 과감한 솔루션을 제안합니다.

"글로벌"솔루션

당신이 직면하고 접근하는 문제에 대해 하나를 선택하십시오-좋지는 않습니다-제안은 재정의하는 것입니다 Quantity.

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

비고 1 : 위의 코드를 광범위하게 확인하거나 사용하지 않았습니다. "나는 당신의 고통을 공유합니다"라는 문장으로 더 많이 넣었고, 그 스타일로 해결책을 제안하는 다른 게시물을 장려하기위한 것입니다.

2두기 : 함께 Quantity[x_,___]:=x;당신이 "제거"할 수 있습니다 Quantity대부분의 계산에서 기능을. 그러나 일부 내장 함수는 Quantity제대로 작동 하는 데 의존하기 때문에 위험 합니다. 예를 들어, WeatherData또는 FinancialData. 개인적으로 95 %의 시간이 data내가 사용하는 기능 을 섭취 한 후 data /. Quantity[x_, _] :> x.

Quantity재정의를 통한 평가

위의 "전역"접근 방식 (및 / 또는 removeUnitsOfZeroMagnitude) 대신이 함수를 사용하는 것이 좋습니다 .

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