Ошибка Transpose :: nmtx при использовании греческого формального символа в NDSolveValue
Ошибка, появившаяся в версии 12.0 или более ранней, сохраняется до 12.2.
Рассмотрим следующий призыв к NDSolveValue
системе ODE с 2 зависимыми переменными, где мы можем выбрать в качестве первой зависимой переменной symbol
любой символ, кроме y
или 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) *)
Если мы выберем обычные латинские символы, обычные греческие символы или формальные латинские символы, это будет работать нормально:
solver[a]
solver[α]
solver[\[FormalA]]
(* OK *)
Но если мы выберем любой формальный греческий символ, мы получим ошибки:
solver[\[FormalAlpha]]
Transpose::nmtx
: Первые два уровня{\[FormalAlpha], NDSolve`xs$2814}
нельзя транспонировать.
Part::partw
: Часть 2Transpose[{\[FormalAlpha], NDSolve`xs$2814}]
не существует.
и т.п.
Что такого в греческих формальных символах, что заставляет вещи ломаться?
Интересно, что допустимы многосимвольные символы, содержащие формальный греческий язык:
solver[a\[FormalAlpha]]
solver[\[FormalAlpha]\[FormalAlpha]]
(* OK *)
Также обратите внимание, что ошибка не возникает, если в NDSolveValue
.
Ответы
v12.2 выдает ndode
предупреждение. Кажется, это ошибка, связанная с недокументированной функцией Internal`ProcessEquations`FindDependentVariables
(я знаю это из этого сообщения, кстати):
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}} *)
Как видим, сингла найти не удается \[FormalAlpha]
. Но эта функция не отображается Trace[NDSolveValue[………], TraceInternal->True]
, и я понятия не имею, почему NDSolve
удается обработать регистр 1 зависимой переменной.
К счастью, проблему легко обойти. Просто установите DependentVariables
опцию:
With[{symbol = \[FormalAlpha]},
NDSolveValue[{symbol'[t] == 1, y'[t] == 1, symbol[0] == 0, y[0] == 0}, {symbol, y},
{t, 0, 1}, DependentVariables -> {symbol, y}]]