2016-12-20 4 views
0

非常に複雑な方程式のルーツを見つけ出す必要があります。私は、Pythonに役立つ一連の関数があると読んでいます。私は彼らがどのように動作するか把握しようとしましたが、かなりうまくいかなかったのです。私が見た例ではなく、私は、この関数の根を見つけるために必要なすべての非常に簡単です:BとK実数正の数でSciPy Newton Method

enter image description here

。誰も助けることができますか?

+0

'私は、彼らがどのように機能するかを把握することを試みたが、私はあなたがしようとしたものを示し、また、あなたが得たエラーを含めてくださいかなりbad'失敗しました。 – cel

+0

BとKは定数ですが、それらは以前に設定されたいくつかのパラメータに従って変更できます。私はそれらをどのように設定できるのか理解できません。私はdef f(x、B、K)という関数を定義しようと考えていましたが、うまくいくかどうかわかりません。 – haster8558

+1

* "def f(x、B、K)関数を定義しようと考えていましたが、うまくいくかどうかわかりません" *これはscipy最適化関数で行う標準的な方法です。試してみます。 –

答えて

2

ここでは2つの解決法がありますが、2番目はおそらく問題を解決するより簡単で正しい方法です。

このトリックは、fにKとBの値を記憶させる必要があるということです。これを行う方法の1つは、別の関数の内部関数にすることです。外部関数は、KとBを設定するために使用されます。これらは、返される内部関数の可変スコープにあります。このようにして、内部のf関数は値を覚えることができます。返された関数は、単純にNewton-Raphsonメソッドに渡され、ルートを検出します。

from scipy.misc import factorial 
from scipy.optimize import newton 
import numpy as np 

def get_f(K=1, B=1): 
    def f(x): 
     return np.exp(-B*(np.power(B, x))-factorial(x)*K) 
    return f 

f = get_f(K=2, B=3) 
print newton(f, 3, maxiter=1000) 

ユーザがnewton関数はニュートン・ラプソン関数に追加の引数を渡すために使用することができるargs引数を有することをコメントしました。関数がf(x、a、b、c ...)の形式の場合、a、b、c ...はargsで与えられる余分な引数です。

同じソリューションは次のようになります。

from scipy.misc import factorial 
from scipy.optimize import newton 
import numpy as np 

def f(x, K, B): 
    return np.exp(-B*(np.power(B, x))-factorial(x)*K) 

print newton(f, 3, args=(2, 3), maxiter=1000) 
+1

"*トリックは、関数fをKとBの値を覚えておかなければならないということです。" *トリックは必要ありません。 'newton'の引数' args'を使うだけです。 –

+0

ありがとう@WarrenWeckesser、知っていい:) –