Erreur Transpose :: nmtx lors de l'utilisation du symbole grec formel dans NDSolveValue
Bug introduit dans la version 12.0 ou antérieure, persistant jusqu'à la version 12.2.
Considérez l'appel suivant à NDSolveValue
pour un système d'ODE avec 2 variables dépendantes, où nous pouvons choisir la première variable dépendante,, symbol
comme étant n'importe quel symbole sauf 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) *)
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 deTranspose[{\[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
La v12.2 crache un ndode
avertissement. 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 NDSolve
réussit à gérer le cas de la variable dépendante 1.
Heureusement, le problème est facile à contourner. Définissez simplement l' DependentVariables
option:
With[{symbol = \[FormalAlpha]},
NDSolveValue[{symbol'[t] == 1, y'[t] == 1, symbol[0] == 0, y[0] == 0}, {symbol, y},
{t, 0, 1}, DependentVariables -> {symbol, y}]]