Transpor :: erro nmtx ao usar o símbolo grego formal em NDSolveValue
Bug introduzido em 12.0 ou anterior, persistindo até 12.2.
Considere a seguinte chamada para NDSolveValue
para um sistema de EDOs com 2 variáveis dependentes, onde podemos escolher a primeira variável dependente,, symbol
para ser qualquer símbolo, exceto y
ou t
:
solver[symbol : Except[y | t, _Symbol]] :=
NDSolveValue[
{symbol'[t] == 1, y'[t] == 1, symbol[0] == 0, y[0] == 0}
, {symbol, y}
, {t, 0, 1}
];
$Version
(* 12.0.0 for Linux x86 (64-bit) (April 7, 2019) *)
Se escolhermos símbolos latinos comuns, símbolos gregos comuns ou símbolos latinos formais, isso funciona bem:
solver[a]
solver[α]
solver[\[FormalA]]
(* OK *)
Mas se escolhermos qualquer símbolo grego formal, obteremos erros:
solver[\[FormalAlpha]]
Transpose::nmtx
: Os primeiros dois níveis de{\[FormalAlpha], NDSolve`xs$2814}
não podem ser transpostos.
Part::partw
: A parte 2 deTranspose[{\[FormalAlpha], NDSolve`xs$2814}]
não existe.
etc.
O que há nos símbolos formais gregos que faz com que as coisas se quebrem?
Curiosamente, símbolos de vários caracteres contendo grego formal são aceitáveis:
solver[a\[FormalAlpha]]
solver[\[FormalAlpha]\[FormalAlpha]]
(* OK *)
Observe também que o erro não ocorre se houver apenas 1 variável dependente em NDSolveValue
.
Respostas
v12.2 emite um ndode
aviso. Este parece ser um bug relacionado à função não documentada Internal`ProcessEquations`FindDependentVariables
(eu conheço deste post BTW):
Table[
Internal`ProcessEquations`FindDependentVariables[{symbol'[t] == 1, y'[t] == 1,
symbol[0] == 0, y[0] == 0}, t], {symbol, {\[FormalAlpha], a\[FormalAlpha]}}]
(* {{y}, {a\[FormalAlpha], y}} *)
Como podemos ver, ele não consegue encontrar o single \[FormalAlpha]
. Mas essa função não aparece em Trace[NDSolveValue[………], TraceInternal->True]
, e não tenho ideia de por que NDSolve
consegue lidar com o caso de 1 variável dependente.
Felizmente, o problema é fácil de contornar. Basta definir a DependentVariables
opção:
With[{symbol = \[FormalAlpha]},
NDSolveValue[{symbol'[t] == 1, y'[t] == 1, symbol[0] == 0, y[0] == 0}, {symbol, y},
{t, 0, 1}, DependentVariables -> {symbol, y}]]