Mathematica 10.4のRegionPlotのバグ


10.3.1ではできたことが,

10.4でできなくなってしまいました(10.4.1, 11.1.1もダメ)。(報告済み)

MathematicaのMaxValueとMinValueのバグ


Mathematica 10.1, 10.2, 10.3, 10.4.1, 11.1.1

Mathematicaの最大化MaxValueと最小化MinValueには,簡約のためのSimplifyの中では使えないというバグがあります(製造元には報告済みです)。

例として,0 <= t <= 1, 0 <= p <= 2 Pi, 0 <= q <= 2 Piという制約のもとで,f = Abs[t Sin[p] Sin[q]]という関数の最大値と最小値を求めます。

f = Abs[t Sin[p] Sin[q]];
cond = And[0 <= t <= 1, 0 <= p <= 2 Pi, 0 <= q <= 2 Pi];

当たりを付けるために,まずは数値的に求めます。

{NMaxValue[{f, cond}, {t, p, q}], NMinValue[{f, cond}, {t, p, q}]}

結果が{1., 0.}になることに,特に問題はないでしょう。

解析的に求めようとすると,うまく行きません。

MaxValue[{f, cond}, {t, p, q}]
(*結果は割愛。入力がそのまま返される*)

こういう関数の最大・最小は,そのままではうまくいかないとしたものです。残念ですが,これはしょうがない。

しかし,Simplifyの中で使うと計算が進むことがあります。制約条件を仮定して結果を整理することを試みます。

Simplify[MaxValue[{f, cond}, {t, p, q}], cond]

得られる結果は「∞」,もちろん間違いです。MinValueの場合も同様で,「-∞」という間違った結果が得られます。

Simplifyの仮定(外側のcond)が,MaxValueの制約(内側のcond)を簡約しているのが一因だと思います。そういうことがあるのは,次の例でわかります。

Simplify[MaxValue[{1/x^2, 0 < x}, x, Integers], 0 < x]

結果はMaxValue[{x^(-2), True}, x, Integers]になります。制約がTrueになっていますが,これはいけません。

Tweet-a-Programではちょっと違うことが起きているみたいです(こういうのは初めて見ました)。

他に原因があるかどうかはよくわかりません。

MaximizeMinimaizeでは,この問題は発生しません。一般に,MaximizeMinimizeMaxValueMinValueより遅いということになっているのですが,速さよりは正確さが大事なので,こちらを使った方がいいのかもしれません。

MathematicaのIntegrateのバグ


Mathematica 10.1, 10.2, 10.3, 10.4.1, 11.1.1の積分(Integrate)には,仮定の利用に関して,9.0や10.0には無かったバグがあります。(製造元には報告済みです。)

例として,Abs[(x + 1) (x - a) (x - 1)]-1 <= x <= 1で積分することを考えます。

Absの中にパラメータがaがありますが,これは実数だと仮定します。Integrateには,そういう仮定を与えるための便利なオプションAssumptionsがあります。

Integrate[Abs[(x + 1) (x - a) (x - 1)], {x, -1, 1}, 
 Assumptions -> Element[a, Reals]]

これで,a <= -1なら-4a/3a >= 1なら4a/3,それ以外つまり-1 < a < 1なら(-a^4 + 6a^2 + 3)/6と,aの値で場合分けされた結果が得られます。すばらしい。

しかし,仮定がうまく取り入れられない,取り入れられないならまだしも,仮定を使ったせいで間違った答えが出てきてしまうことがあります。

Integrate[Abs[(x + 1) (x - 2 a + b) (x - 1)], {x, -1, 1}, 
 Assumptions -> And[-1 < a < 1, b == a]]

Mathematicaの一部のバージョンでは1/2という結果になりますが,これは間違いです。b == aという仮定を考慮すると被積分関数は最初の例と同じになるので,積分結果は(-a^4 + 6a^2 + 3)/6にならなければなりません。

どういうわけか,Integrateの中に直接数式を書かなければうまくいきます。

f = Abs[(x + 1) (x - a) (x - 1)];
Integrate[f, {x, -1, 1}, 
 Assumptions -> And[-1 < a < 1, b == a]]

原因はよくわかりませんが,Assumptionsは怖くて使えません。

この積分は,Mathematica 9.0(Windows)や10.0(Raspberry Pi)では正しく行えただけに,10.1でできなくなって残念です。機能追加と品質保持の優先順位が間違っている気がします。

Mathematica の新バージョンには,常に多くの新しい機能が含まれている.しかし当初からの周到なデザインにより,すべてのバージョン間でほぼ完全な互換性が保たれている.その結果,例えば1988年のバージョン1用に書かれたほとんどすべてのプログラムは,Mathematica バージョン7でもそのまま変更なしで走り,かつ実行速度も大いに向上している.(Mathematica バージョン1以降の非互換変更

この理想を,バージョン8以降でも大切にしてほしいものです。

MathematicaのTeXFormのバグ


Mathematica 10.1, 10.2, 10.3, 10.4.1, 11.1.1 for Windows, 10.0 for Raspberry Pi

Mathematicaには,表現をTeX形式に変換するTeXFormがあります。たとえば,TeXForm[Integrate[f[x], x]]とすると「\int f(x) \, dx」を返してくれます。便利です。

しかし,バグがあります。

TeXForm[Abs[r + 1/2]]の結果が「\left\left| r+\frac{1}{2}\right\right|」になりますが,これはTeXで処理できません。正しくは「\left| r+\frac{1}{2}\right|」です。TeXForm[Abs[r]]なら「\left| r\right|」という正しい結果が返ります。

開発元には報告済みですが,今のところ手で直すしかありません。計算結果から自動的に論文を書かせるようなどと思うと困ったことになるでしょう。

MathematicaのFindShortestTour[]のバグ


先日CodeIQで、巡回セールスパースン問題を出題しました。

Mathematicaには、指定した点をすべて通る最短の巡回路を求める関数 FindShortestTour[] があるので、これを使えば簡単なはずでしたが、実はそこにはトラップがあったかもしれません。

追記:問題は3つありますが、Mathematica 10.3.1, 10.4, 11.1.1 for Windowsで未解決なのは3番目のみです。

問題1(10.0.2 for Windowsで解決済)

Mathematica 10.0.1 for Windowsでは、{{6, 2}, {4, 6}, {3, 4}, {6, 7}}という4点を通る最短巡回路を求められませんでした。

問題2(10.0 for Linux ARM (32-bit) (August 4, 2014)で解決済)

10.0 for Linux ARM (32-bit) (January 29, 2014)の FindShortestTour[] は、仕様がマニュアルと違っていました。

pts = {{1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 1}, {2, 3}, {2, 5}, {3, 1}, {3, 2}, {3, 4}, {3, 5}, {4, 1}, {4, 3}, {4, 5}, {5, 1}, {5, 2}, {5, 3}, {5, 4}};
FindShortestTour[%]

マニュアルによれば、巡回路の最初と最後は同じ(この例では1)はずなのですが、ここで得られる結果は「{14 + 5 Sqrt[2], {1, 2, 7, 3, 4, 5, 8, 12, 11, 15, 19, 14, 18, 17, 16, 13, 9, 10, 6}}」で、仕様とは違っていました。

問題3(10.1, 10.2, 10.3, 10.3, 10.4, 10.4.1, 11.1.1 for Windowsで未解決)

1分待っても結果が返ってこない場合があります(Core i7-4930K)。(Wolfram/AlphaならOK

FindShortestTour[{{0, 0}, {1, 0}, {0, 1}, {1, 1}, {0, 536870913}}]

浮動小数点で近似値だけでも・・・と思っても、やはりダメな場合があります(カーネルが落ちます)。

FindShortestTour[{{1., 0}, {0, 1}, {6421482390570520, 4284269602932036}, {239817909316376, 7744567430237013}, {2528914430818969, 5966759469595075}}]

マニュアルでは見つけられませんでしたが、「Method -> "IntegerLinearProgramming"」を付けておくとうまくいくと、サポートから教えてもらいましたが、計算はできても結果が正しくない場合があります。(この例でオプションを外すとカーネルが落ちます。)

cities = {
 {12581820340729273, 10017935966728831},
 {12754218452664193, 14539145895971681},
 {14822745302277607, 14565274414261943},
 {11873373307008371, 9781014188323403},
 {16116822349097741, 15873203518310113},
 {12701673778654019, 11291535066125623},
 {9392560345300883, 14963106019249771},
 {11529795864075473, 17759422650313613},
 {9007199254742147, 18014398509483463},
 {9007199254742149, 18014398509483461}};
FindShortestTour[cities, Method -> "IntegerLinearProgramming"]

一部のバージョンでは、巡回路{1, 4, 7, 9, 10, 8, 5, 3, 2, 6, 1}が得られますが、正解は{1, 4, 7, 10, 9, 8, 5, 3, 2, 6, 1}です。

何も気にせず使えるようになるにはまだ時間がかかりそうです。