質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

10716閲覧

scipyで最適化したい関数に複素数が含まれていると適切に最適化されない

SATSUKI.

総合スコア21

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/06/02 06:33

編集2017/06/02 08:07

[不備があったため再投稿]
python、数学共に初心者です。

###前提・実現したいこと/発生している問題
pythonの科学技術計算ライブラリscipy.optimize.minimizeのbfgs法で関数の最適化を行っています。
パラメーターはx[0],x[1],x[2]の三つです。
最適化したい関数に複素数が含まれていると以下のようなwarningが出ます。
最適化したい関数は計算すると除算と二乗によりjが消えるので、最適化された関数にもパラメーターにも虚数部が含まれないはずです。
虚数が含まれていない場合、問題がないことは確認済みです。
最適化されたパラメーターは適切な値にならないのですが、どうすればいいでしょうか?
また初歩的な間違いかもしれませんが、よろしくお願いします。

###該当のソースコード

python

1import numpy as np 2from scipy import optimize 3 4def f(x): #最適化したい関数 5 return ((3+4j)-(3*x[0]+4j))**2+((3+4j)-(3+x[1]*1j))**2+((x[2]+0j)-(23+0j))**2 6 7result=optimize.fmin_bfgs(f, [1,1,1]) #bfgs法 8 9for i,elem in enumerate(result): 10 print('x[%s]=%s' %(i,elem) ) #最適化後のパラメーターの表示

###実行結果

/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/scipy/optimize/optimize.py:628: ComplexWarning: Casting complex values to real discards the imaginary part grad[k] = (f(*((xk + d,) + args)) - f0) / d[k] /.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/scipy/optimize/linesearch.py:171: ComplexWarning: Casting complex values to real discards the imaginary part amin, amax, isave, dsave) Optimization terminated successfully. Current function value: -67457804844318816.000000 Iterations: 3 Function evaluations: 85 Gradient evaluations: 17 x[0]=1.0 x[1]=-473759632.1 x[2]=396220148.629

###エラーメッセージ

ComplexWarning: Casting complex values to real discards the imaginary part (複素数を実数にキャストすると、虚数部が破棄されます)

###補足情報(言語/FW/ツール等のバージョンなど)
python3.6.0
numpy1.11.3
scipy0.18.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/06/02 06:57 編集

複素数の「最小値」ってなんですか?
SATSUKI.

2017/06/02 08:12

申し訳ありません、複素数に対する理解が足りなかったのと、関数が間違っていたため再投稿しました
guest

回答3

0

複素数には大小の概念がありません。したがって、複素数に値をとる関数を最小化することに意味はありません。

投稿2017/06/02 06:50

WathMorks

総合スコア1582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SATSUKI.

2017/06/02 08:12

申し訳ありません、複素数に対する理解が足りなかったのと、関数が間違っていたため再投稿しました
guest

0

rkhsさんがおっしゃるとおりなのですが、それは複素平面上をイメージすれば「そっか・・・」と気づかれると思います。1+0jと0+1jの「どちらが大きいの?」と言われても「原点からの距離は同じ」だし「実数分は前者が大きい」し「虚数部は後者が大きい」けど、単純に大小と言われても「決まらない」ということになります。

複素関数に対しbfgs法を使い得るような場面を考えるとするなら、例えば原点からの距離やある複素ベクトルとfの微分の傾き等々に興味があるといった場面だと思うので元の複素関数fをそれらを表す実関数gへ置き換えgに対してbfgs法でパラメータを求めるといった方法になると思います。

投稿2017/06/02 08:04

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SATSUKI.

2017/06/02 08:14

丁寧な回答ありがとうございます。複素数に対する理解が足りなかったので、なるほどと思いました。わかりやすかったです。また関数が間違っていたため再投稿しました
guest

0

ベストアンサー

計算したら虚数部が0になることがわかるのは人間様だけで、
pythonはそんな高度なことを思考しないのでわかりません。
というわけで、python的には、計算結果は複素数です。

計算結果が常に実数になるんなら
予め式変形して虚数成分を消去しましょう。

投稿2017/06/02 08:23

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SATSUKI.

2017/06/02 11:03

やはり、そうなのですね... 実際に扱いたい関数はこれよりもっと複雑なので、sympyなどを使って展開しようと思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問