質問するログイン新規登録

質問編集履歴

1

最適化したい関数が間違っていました。

2017/06/02 08:07

投稿

SATSUKI.
SATSUKI.

スコア21

title CHANGED
@@ -1,1 +1,1 @@
1
- scipyで複素数を扱おうとすると虚数部が廃棄され
1
+ scipyで最適化したい関数に複素数が含まれていると適切に最適化されない
body CHANGED
@@ -1,13 +1,14 @@
1
+ **[不備があったため再投稿]**
1
2
  python、数学共に初心者です。
2
3
 
3
4
  ###前提・実現したいこと/発生している問題
4
5
  pythonの科学技術計算ライブラリscipy.optimize.minimizeのbfgs法で関数の最適化を行っています。
5
6
  パラメーターはx[0],x[1],x[2]の三つです。
6
- 最適化したい関数に複素数が含まれていると以下のようなwarningが出て虚数部が破棄されてしいます。
7
+ 最適化したい関数に複素数が含まれていると以下のようなwarningが出ます。
7
- おそらくscipy側処理の途中破棄されるんだと思うのですが...
8
+ **最適化したい関数は計算すると除算と二乗によりjが消えるので、最適化された関数にもパラメーターにも虚数部が含まれないはずです。**
8
9
  虚数が含まれていない場合、問題がないことは確認済みです。
9
- 最適化されたパラメーターの虚数部も表示したいのですが、どうすればいいでしょうか?
10
+ 最適化されたパラメーターは適切な値にならないのですが、どうすればいいでしょうか?
10
- よろしくお願いします。
11
+ また初歩的な間違いかもしれませんが、よろしくお願いします。
11
12
 
12
13
 
13
14
  ###該当のソースコード
@@ -16,7 +17,7 @@
16
17
  from scipy import optimize
17
18
 
18
19
  def f(x): #最適化したい関数
19
- return (x[0]-3.8j)**2+(x[1]-5j)**2+(x[2]-23j)**2
20
+ return ((3+4j)-(3*x[0]+4j))**2+((3+4j)-(3+x[1]*1j))**2+((x[2]+0j)-(23+0j))**2
20
21
 
21
22
  result=optimize.fmin_bfgs(f, [1,1,1]) #bfgs法
22
23
 
@@ -31,13 +32,13 @@
31
32
  /.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
32
33
  amin, amax, isave, dsave)
33
34
  Optimization terminated successfully.
34
- Current function value: -568.440000
35
+ Current function value: -67457804844318816.000000
35
36
  Iterations: 3
36
- Function evaluations: 25
37
+ Function evaluations: 85
37
- Gradient evaluations: 5
38
+ Gradient evaluations: 17
38
- x[0]=1.06314602515e-06
39
+ x[0]=1.0
39
- x[1]=1.06314602515e-06
40
+ x[1]=-473759632.1
40
- x[2]=1.11913584022e-07
41
+ x[2]=396220148.629
41
42
  ```
42
43
 
43
44