NDSolveValueでギリシャ語の正式な記号を使用するとTranspose :: nmtxエラーが発生する

Dec 18 2020

12.0以前で導入され、12.2まで続くバグ。


NDSolveValue2つの従属変数を持つODEのシステムに対する次の呼び出しについて考えてみます。ここで、最初の従属変数、を選択して、またはsymbolを除く任意の記号にすることができます。yt

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:の最初の2つのレベルは{\[FormalAlpha], NDSolve`xs$2814}転置できません。
Part::partw:パート2はTranspose[{\[FormalAlpha], NDSolve`xs$2814}]存在しません。

物事を壊す原因となるギリシャの正式な記号についてはどうですか?

興味深いことに、正式なギリシャ語を含む複数文字の記号は問題ありません。

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

また、に従属変数が1つしかない場合は、エラーは発生しないことに注意してください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]。しかし、この関数はに表示されません。また、1つの従属変数のケースの処理に成功するTrace[NDSolveValue[………], TraceInternal->True]理由NDSolveがわかりません。

幸いなことに、この問題は簡単に回避できます。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}]]