Erreur Transpose :: nmtx lors de l'utilisation du symbole grec formel dans NDSolveValue

Dec 18 2020

Bug introduit dans la version 12.0 ou antérieure, persistant jusqu'à la version 12.2.


Considérez l'appel suivant à NDSolveValuepour un système d'ODE avec 2 variables dépendantes, où nous pouvons choisir la première variable dépendante,, symbolcomme étant n'importe quel symbole sauf 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) *)

Si nous choisissons des symboles latins ordinaires, des symboles grecs ordinaires ou des symboles latins formels, cela fonctionne bien:

solver[a]
solver[α]
solver[\[FormalA]]
(* OK *)

Mais si nous choisissons un symbole grec formel, nous obtenons des erreurs:

solver[\[FormalAlpha]]

Transpose::nmtx: Les deux premiers niveaux de {\[FormalAlpha], NDSolve`xs$2814}ne peuvent pas être transposés.
Part::partw: La partie 2 de Transpose[{\[FormalAlpha], NDSolve`xs$2814}]n'existe pas.
etc.

Qu'y a-t-il à propos des symboles formels grecs qui font casser les choses?

Fait intéressant, les symboles à plusieurs caractères contenant du grec formel sont OK:

solver[a\[FormalAlpha]]
solver[\[FormalAlpha]\[FormalAlpha]]
(* OK *)

Notez également que l'erreur ne se produit pas s'il n'y a qu'une seule variable dépendante dans NDSolveValue.

Réponses

3 xzczd Dec 18 2020 at 19:39

La v12.2 crache un ndodeavertissement. Cela semble être un bug lié à la fonction non documentée Internal`ProcessEquations`FindDependentVariables(je le connais de ce 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}} *)

Comme on peut le voir, il ne parvient pas à trouver le single \[FormalAlpha]. Mais cette fonction n'apparaît pas dans Trace[NDSolveValue[………], TraceInternal->True], et je ne sais pas pourquoi NDSolveréussit à gérer le cas de la variable dépendante 1.

Heureusement, le problème est facile à contourner. Définissez simplement l' DependentVariablesoption:

With[{symbol = \[FormalAlpha]}, 
 NDSolveValue[{symbol'[t] == 1, y'[t] == 1, symbol[0] == 0, y[0] == 0}, {symbol, y}, 
   {t, 0, 1}, DependentVariables -> {symbol, y}]]