2017-02-16 2 views
1
import math 
from scipy.optimize import fsolve 

def sigma(s, Bpu): 
    return s - math.sin(s) - math.pi * Bpu 

def jac_sigma(s): 
    return 1 - math.cos(s) 

if __name__ == '__main__': 
    Bpu = 0.5 
    sig_r = fsolve(sigma, x0=[math.pi], args=(Bpu), fprime=jac_sigma) 

の最適化をスローし、次のエラー、、上記のスクリプトを実行している変数関数

Traceback (most recent call last): 
    File "C:\Users\RP12808\Desktop\_test_fsolve.py", line 12, in <module> 
    sig_r = fsolve(sigma, x0=[math.pi], args=(Bpu), fprime=jac_sigma) 
    File "C:\Users\RP12808\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\minpack.py", line 146, in fsolve 
    res = _root_hybr(func, x0, args, jac=fprime, **options) 
    File "C:\Users\RP12808\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\minpack.py", line 226, in _root_hybr 
    _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n, n)) 
    File "C:\Users\RP12808\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\minpack.py", line 26, in _check_func 
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) 
TypeError: jac_sigma() takes 1 positional argument but 2 were given 

私は...どのように機能をfsolveはしヤコビアンを渡す方法がわかりませんよこれを解決するのですか?

advance..RP

+0

私はソルバーがfと同じヤコビ行列に同じ追加引数を渡すと思います。 Jacに仮引数を追加してみてください。 –

+0

@PaulPanzerありがとう、喜びはありません、それはミニパックのエラーを投げます – rp12808

+0

私はそれに応じてあなたのQを更新すべきだと思うので、人々は何が起こっているかの手がかりを得ることができます。 –

答えて

3

機能が解消されるようにヤコビ行列は同じ引数を取らなければならない計算機能のおかげで、それが配列を返す必要があります。一般的に

def jac_sigma(s, Bpu): 
    return np.array([1 - math.cos(s)]) 

をヤコビ行列は2次元配列ですが、変数がスカラー(ここにあるように)で、ヤコビ行列が1x1のときは、コードは1次元または2次元の値を受け取ります。 (この場合スカラーを受け入れるといいかもしれませんが、そうではありません)

実際には、戻り値は「配列のような」もので十分です。例えばリストも許容されます:

def jac_sigma(s, Bpu): 
    return [1 - math.cos(s)] 
+0

ありがとうございました。 – rp12808

関連する問題