Błąd transpose :: nmtx podczas używania greckiego symbolu formalnego w NDSolveValue
Błąd wprowadzony w wersji 12.0 lub wcześniejszej, utrzymujący się do 12.2.
Rozważmy następujące wywołanie NDSolveValue
systemu ODE z 2 zmiennymi zależnymi, gdzie możemy wybrać pierwszą zmienną zależną symbol
, jako dowolny symbol z wyjątkiem y
lub 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ęść 2Transpose[{\[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
Wersja 12.2 wypluwa ndode
ostrzeż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 NDSolve
udaje się obsłużyć 1 przypadek zmiennej zależnej.
Na szczęście problem jest łatwy do obejścia. Po prostu ustaw DependentVariables
opcję:
With[{symbol = \[FormalAlpha]},
NDSolveValue[{symbol'[t] == 1, y'[t] == 1, symbol[0] == 0, y[0] == 0}, {symbol, y},
{t, 0, 1}, DependentVariables -> {symbol, y}]]