Błąd transpose :: nmtx podczas używania greckiego symbolu formalnego w NDSolveValue

Dec 18 2020

Błąd wprowadzony w wersji 12.0 lub wcześniejszej, utrzymujący się do 12.2.


Rozważmy następujące wywołanie NDSolveValuesystemu ODE z 2 zmiennymi zależnymi, gdzie możemy wybrać pierwszą zmienną zależną symbol, jako dowolny symbol z wyjątkiem ylub 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) *)

Jeśli wybierzemy zwykłe symbole łacińskie, zwykłe symbole greckie lub formalne symbole łacińskie, to działa dobrze:

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

Ale jeśli wybierzemy jakikolwiek formalny symbol grecki, otrzymamy błędy:

solver[\[FormalAlpha]]

Transpose::nmtx: {\[FormalAlpha], NDSolve`xs$2814}Nie można transponować pierwszych dwóch poziomów programu .
Part::partw: Część 2 Transpose[{\[FormalAlpha], NDSolve`xs$2814}]nie istnieje.
itp.

Co takiego jest w greckich symbolach formalnych, które powodują zepsucie?

Co ciekawe, wieloznakowe symbole zawierające formalną grekę są w porządku:

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

Należy również zauważyć, że błąd nie występuje, jeśli w programie jest tylko 1 zmienna zależna NDSolveValue.

Odpowiedzi

3 xzczd Dec 18 2020 at 19:39

Wersja 12.2 wypluwa ndodeostrzeżenie. Wygląda na to, że jest to błąd związany z nieudokumentowaną funkcją Internal`ProcessEquations`FindDependentVariables(znam to z tego postu, 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}} *)

Jak widać, nie udało się znaleźć singla \[FormalAlpha]. Ale ta funkcja nie pojawia się w Trace[NDSolveValue[………], TraceInternal->True]i nie mam pojęcia, dlaczego NDSolveudaje się obsłużyć 1 przypadek zmiennej zależnej.

Na szczęście problem jest łatwy do obejścia. Po prostu ustaw DependentVariablesopcję:

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