2017-08-01 8 views
0

多項式関数のヘッセ行列を計算するのに、numddifftoolsパッケージを使用しています(R^nからR^nまで)。リストの代わりにnumpy配列を使用するようにコードを変更している間に、コードを破ったことが分かりました。具体的に:Numpyとnumdifftools多次元関数

import numpy as np 
import numdifftools as nd 

def function(x): 

    out = np.zeros(2) 
    out[0] = x[0] - x[1]**2/2.0 

    return float(out[0]) 

tempHessian = nd.Hessian(function, method='complex') 
tempHessian([0.4,0.4]) 

は、エラーが生成されます ... \コンティニュアム\ Anaconda3 \ libに\のsite-packages \ ipykernel_launcher.py:8:ComplexWarning:本当の破棄に虚部を複素数値をキャスト

とヘッセンがゼロになります。

しかし、これは正常に動作します:

import numpy as np 
import numdifftools as nd 

def function(x): 

    return x[0] - x[1]**2/2.0 

tempHessian = nd.Hessian(function, method='complex') 
tempHessian([0.4,0.4]) 

任意のアイデア何の問題だろうか?ありがとう! outは、このように作成され

+0

あなたはコード内のどの行が警告をトリガーしているかを把握してください。 warningsモジュールを使用して、警告を例外にすることができます。 https://stackoverflow.com/questions/5644836/in-python-how-does-one-catch-warnings-as-if-they-were-exceptions – ngoldbaum

+0

問題は「浮動(out [0])」ですマトリックスを「真の」ものに変換する。 – axaroth

答えて

0

out = np.zeros(2) 

それはnumpy.float64を入力しています。そのような配列に複素数値を代入することはできません。使用しているnumpyのバージョンに応じて、警告またはエラーが表示されます。

数字の微分のためのcomplex step methodでは、関数が複素数値で機能する必要があります。 outnumpy.float64にすると、その方法が破られます。 float(out[0])を使用して戻り値を浮動小数点に変換すると、メソッドが破損します。

def function(x): 

    out = np.zeros(2, dtype=x.dtype) 
    out[0] = x[0] - x[1]**2/2.0 

    return out[0] 

これはxと同じデータ型でoutを作成します。

あなたはこのような何かを試すことができます。したがって、xが複雑な場合は、複雑なステップメソッドで必要とされるように、戻り値も複雑です。

(あなたが最初の要素だけが使用されているサイズ2を有することがoutを作成する理由はもちろん、私たちは知らない。おそらくこれは、使用している実際のコードを簡略化したものである。)

+0

ありがとう、それは魅力のように動作します。はい、私はそれをよりよく理解し、ここに投稿するために問題を単純化しました。 :) – ClemensFiedler

関連する問題