Transpor :: erro nmtx ao usar o símbolo grego formal em NDSolveValue

Dec 18 2020

Bug introduzido em 12.0 ou anterior, persistindo até 12.2.


Considere a seguinte chamada para NDSolveValuepara um sistema de EDOs com 2 variáveis ​​dependentes, onde podemos escolher a primeira variável dependente,, symbolpara ser qualquer símbolo, exceto you 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 de Transpose[{\[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

3 xzczd Dec 18 2020 at 19:39

v12.2 emite um ndodeaviso. 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 NDSolveconsegue lidar com o caso de 1 variável dependente.

Felizmente, o problema é fácil de contornar. Basta definir a DependentVariablesopçã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}]]