Ошибка Transpose :: nmtx при использовании греческого формального символа в NDSolveValue

Dec 18 2020

Ошибка, появившаяся в версии 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: Часть 2 Transpose[{\[FormalAlpha], NDSolve`xs$2814}]не существует.
и т.п.

Что такого в греческих формальных символах, что заставляет вещи ломаться?

Интересно, что допустимы многосимвольные символы, содержащие формальный греческий язык:

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

Также обратите внимание, что ошибка не возникает, если в NDSolveValue.

Ответы

3 xzczd Dec 18 2020 at 19:39

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}]]