質問: sympyのsolveを使って3次方程式の解を求めたら、 1.12558092959482 - 0.e-23*I とか 2.78364471203253 + 0.e-20*I という答えが返ってきました。 このeとかIはどういう意味なのでしょうか?? Iが純虚数なのはなんとなくわかりますが、明らかに実解が存在するのに虚数の答えが返ってくるのは変ですよね・・?
回答: ### eとIについて `e`は日本語では「指数表記」ないし「科学的表記」と呼ばれているものです。 https://ja.wikipedia.org/wiki/指数表記 Pythonに限らず一般的に用いられている書き方で、`●e△`で数 ●×10△ を示します。 たとえば`1.0e3`は 1.0×103 = 1000 のことですし、`1.23e-2`は 1.23×10-2 = 0.0123 のことです。 `I`はsympyの記法で、√(-1)のことです。 このことはsympyのドキュメントに書いてあります。 ### 実数解と虚数解について 以上のことから、`1.12558092959482 - 0.e-23*I`というのは実数であることが分かります。 虚数部が0.0の複素数、つまり実数です。 なので解が虚数になっているわけではないです。 (厳密にはちょっと違うかもしれないのですが、ラフには実数と言って大丈夫でしょう。) もし実数解のみが欲しいのであれば、変数を定義するときに ``` x = Symbol('x', real=True) ``` とすればよいです(参考)。 参考までに、sympyの`solve()`についてはここに(英語ですが)ドキュメントがあります。 あるいはもしかしたら、解の最終的な数値を得る際に複素数演算を挟んだためそのような表現になっているのかもしれません。 誤差の影響で虚数成分がほんの少しだけ入った、という話です。 sympyはなるべく記号操作で解を求めるライブラリですが、最終的に数値表現しようとすると誤差が入り得ます。 ### 類似の質問(+別の意見) * "Ignore imaginary roots in sympy" - 本家StackOverflowより + この質問の中にあるコメントの和訳です: もし単に解の float/double 型の値が欲しいだけなのであれば、おそらくsympyは使うべきライブラリでは無いです。多分、numpyやscipyを使うともっと良いパフォーマンスが得られ、コードもシンプルになるでしょう。また、もしnumpy/scipyよりsympyの方がサイズが小さいからという理由でsympyを選んだのなら、sympyの中で数値の任意桁演算のために使われているライブラリmpmathの方がより小さいです。 -- Krastanov Mar 4 '13 at 23:50