Por que Quantidade e Unidades são inconsistentes com o comportamento normal do Mathematica?
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
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.
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 Quantity
funcionalidades da maioria dos cálculos. Mas isso também é perigoso, porque algumas funções integradas dependem do Quantity
funcionamento adequado. Por exemplo, WeatherData
ou FinancialData
. Pessoalmente, 95% das vezes após ingerir data
com as funções que utilizo data /. Quantity[x_, _] :> x
.

Avaliação com Quantity
redefiniçã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];
