Mathematica12.0における組込みシンンボルDSolveのバグ

この記事は，2019年5月に公開された Mathematica **12.0** を対象とした記事です．今後公開されるバージョンでは，~~修正されているかもしれません~~修正されました ．バージョン12.0.0上の組込みシンボル`DSolve`に不具合があります．

##### 2020年5月3日 追記
2020年3月にリリースされたWolfram Language **12.1** (Mathematica **12.1**)においては，この記事に記載されている現象が解消されています．筆者は，Wolfram社の公開リソース の一つである Wolfram Language Sandbox にて確認しました．

PUBLIC RESOURCES
https://www.wolfram.com/resources/

##### 2020年3月11日 追記
この不具合について，筆者はWolfram EngineをJupyter Notebookに導入して同様な検証しました．Wolfram Language 12上で実行した結果，全く同じ結果が返されました．したがってMathematicaの核であるWolfram Languageに誤った結果を返す原因があると思われます．

##### 2019年12月26日 追記
この不具合は，すべての微分方程式に対して発生するものではなく，微分方程式のなかでも“ある何かしらの条件を持った”微分方程式において発生します．この条件は，当記事の筆者は存じません．

### 組込みシンボル`DSolve`
このシンボルは，簡単に言えば微分方程式を解く機能があります．詳しくはリファレンスを参照してください:

DSolve（ドキュメントセンター）
https://reference.wolfram.com/language/ref/DSolve.html.ja?source=footer

例題として，次の微分方程式を解く:

```mathematica:sample
DSolve[{y'[x] == x + x^2 + y[x] + y[x]^2, y[0] == 1}, y[x], x]
```

結果はHermite多項式や，合流形超幾何関数を含み，正しくは

<details><summary>クリックで結果を開く</summary><div>

```mathematica
{{y[x] -> ((10 + 10 I) (-1)^(1/4)HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[1/4 - I/8, 1/2, I/4] - (8 + 4 I) HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[1/4 - I/8, 1/2, I/4] - (12 - 4 I) x HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[1/4 - I/8, 1/2, I/4] - (6 + 2 I) (-1)^(1/4)HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[1/4 - I/8, 1/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (8 - 4 I) (-1)^(1/4)x HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[1/4 - I/8, 1/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] + (8 +  4 I) HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[1/4 - I/8, 1/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] + (12 -  4 I) x HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[1/4 - I/8, 1/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (3 - 4 I) (-1)^(1/4)HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[5/4 - I/8, 3/2, I/4] + (1 - 3 I) HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[5/4 - I/8, 3/2, I/4] - (2 + 4 I) x HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[5/4 - I/8, 3/2, I/4] - (4 + 3 I) (-1)^(3/4)HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[5/4 - I/8, 3/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (8 + 6 I) (-1)^(3/4)x HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[5/4 - I/8, 3/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (5 -  5 I) HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[5/4 - I/8, 3/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (10 -  10 I) x HermiteH[-(1/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[5/4 - I/8, 3/2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2])/(2 ((2 +    6 I) HermiteH[-(1/2) + I/4,   1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[1/4 - I/8,   1/2, I/4] + (2 + 4 I) (-1)^(1/4)  HermiteH[-(3/2) + I/4, 1/2 (-1)^(1/4)] Hypergeometric1F1[  1/4 - I/8, 1/  2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (2 +    6 I) HermiteH[-(1/2) + I/4,   1/2 (-1)^(1/4)] Hypergeometric1F1[1/4 - I/8, 1/  2, (1/2 (-1)^(1/4) + (-1)^(1/4) x)^2] - (2 -    I) HermiteH[-(1/2) + I/4,   1/2 (-1)^(1/4) + (-1)^(1/4) x] Hypergeometric1F1[5/4 - I/8,   3/2, I/4]))}}
```

</div>
</details>
のようになります（そのはずです．筆者は検算しておりません）．

### 発生する現象
さきの例題を，執筆時点（2019年10月26日）で最新の Mathematica12.0.0 で実行してみます．結果，

```
{{y[x] -> (-4 - 3 x)/(2 (-2 + 3 x))}}
```

のように与えられます．しかし，これは与えられた微分方程式を満たしません（手計算でもとの微分方程式に代入することで解でないことが確認できる）．他にも，1階線形連立微分方程式を解こうとした場合にも（必ずではないが）間違った解が与えられることがあります．

このようなバグは公開後すぐに見つかったらしく，一部コミュニティでも投稿がありました:

Wrong answer from DSolve when solving a differential equation
https://mathematica.stackexchange.com/questions/197518/wrong-answer-from-dsolve-when-solving-a-differential-equation

### 対策方法
組込みシンボル`DSolve`は，2.0(1991年)で導入され，最近では(12.0)2019年に修正されました．しかし，修正と宣言されたものの，不具合を孕んでしまったようです．
したがって，バージョン12.0ではなく，過去のDSolveを組み込んであるバージョンを使うか，今後~~公開されるであろう~~公開された修正済みのものを使えばよいです．