Por que Quantidade e Unidades são inconsistentes com o comportamento normal do Mathematica?

Nov 29 2020

Quando eu inserir isso no Wolfram Mathematica V12:

0 Dogs + 5 Cats

O Mathematica sensatamente retorna isso:

5 Cats

MAS, se eu estiver usando os recursos de unidades e quantidade no Mathematica V12, e digite:

0 m + 37 m/s

Ou em formato longo:

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

Eu recebo:

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

Eu sei que as unidades não são compatíveis, mas ZERO "Metros" é apenas 0 e deve desaparecer logicamente da equação, assim como "0 Cães" desaparece do primeiro exemplo.

Este bug quebra a maior parte da diferenciação e integração de símbolos.

Eu acho que o Wolfram realmente estragou tudo ao não tornar as unidades parte do V1 na década de 1980, e em vez disso as adicionou como uma bolsa colada , no V12. Fale sobre "feições rastejantes" ;-)

Aliás, o único meio que encontrei de controlar essa horrível funcionalidade do Mathematica é com páginas de regras de substituição feias como esta:

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
  ]

Claro, esse hack feio faz cálculos simples de uma linha, que eram tão bonitos e elegantes na V4, agora muitas linhas de código desagradável e ilegível.

Estou fazendo algo errado?

O Mathematica V4 ainda está à venda?

Obrigado,

  • Joe

Exemplo

Aqui está uma imagem mais detalhada dos erros que estou recebendo no Mathematica V12 ao tentar avaliar uma integral simples. Parece-me que em uma avaliação como Times ou Plus, ou seja o que for, as expressões de Unidades com magnitude ZERO devem ser removidas, como se faria com papel e caneta simples.

Respostas

17 Roman Nov 29 2020 at 16:22

Não é uma solução, mas um comentário extenso.

Você entende mal os fundamentos físicos de quantidades e unidades.

Cada quantidade física tem uma margem de erro inerente, mesmo que seja muito pequena (insignificante) e, portanto, tacitamente suprimida. A quantidade de 1 metro realmente significa aproximadamente 1 metro, mais ou menos alguns milímetros / nanômetros / distâncias de Planck .

A quantidade 0 metros significa uma distância consistente com zero dentro da margem de erro da minha medição . Essa margem de erro carrega unidades, mesmo se o valor médio for exatamente zero. Portanto, não podemos cancelar as unidades e 0 metros não é igual a 0 maçãs ou 0 segundos . Demócrito já havia percebido isso há 2500 anos.

Matematicamente, observamos que o ponto 0 é de medida zero no eixo real, e é o único ponto $x$ Onde $x$metros pode ser considerado igual a nada . Mas as quantidades físicas referem-se a intervalos , não pontos , no eixo real e, portanto, a unidade nunca pode ser cancelada da maneira que você sugeriu.

O comportamento do Mathematica neste assunto é, portanto, completamente esperado e normal.

10 AntonAntonov Nov 29 2020 at 15:18

O Mathematica V4 ainda está à venda?

Essa resposta propõe soluções menos drásticas do que voltar para a versão 4.

Solução "global"

Para os problemas que você encontrar e abordar, você segue uma - não tão boa - proposta é redefinir Quantity:

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

Observação 1: Eu não verifiquei ou usei o código acima extensivamente - ele o colocou mais como uma declaração "Eu compartilho suas dores" e, mais ou menos, para encorajar outros posts propondo soluções nesse estilo.

Observação 2: Com Quantity[x_,___]:=x;você pode "remover" as Quantityfuncionalidades da maioria dos cálculos. Mas isso também é perigoso, porque algumas funções integradas dependem do Quantityfuncionamento adequado. Por exemplo, WeatherDataou FinancialData. Pessoalmente, 95% das vezes após ingerir datacom as funções que utilizo data /. Quantity[x_, _] :> x.

Avaliação com Quantityredefinição

Considere usar esta função em vez da abordagem "global" acima (e / ou sua removeUnitsOfZeroMagnitude):

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