2017-04-11 15 views
1

引数を関数に渡そうとしていますが、正しく実行していますが、それでもエラーが返されます: TypeError:p_vinet引数が4つ与えられましたTypeError:p_vinet()は2つの位置引数をとりますが、4が与えられました

ここで私のコードの部分があります、そして、私はエラーを与える部分を与えます。

volumeMgOになる前に計算された配列である:

array([ 7.64798549, 7.67153344, 7.67153344, 7.8068763 , 7.97288941, 
8.14781986, 8.33321177, 8.53118834, 8.74433596, 8.97545339, 
9.22826581, 9.50740563, 9.81962839]) 

params_MgOこのです:

params_MgO = [11.244, 160., 4.0] 

VINET関数である:

def p_vinet(v, params): 
    """ 
    This function will calculate pressure from Vinet equation. 

    Parameters 
    ========== 
    v = volume 
    params = [V0, K0, K0'] 

    Returns 
    ======= 
    Pressure calculated from Vinet equation 
    """ 
    f_v = np.power(v/params[0], 1./3.) 
    eta = 1.5 * (params[2] - 1.) 

    P = 3 * params[1] * ((1 - f_v)/np.power(f_v, 2)) * np.exp(eta * (1 - 
    f_v)) 

    return P 

最後に、傾斜機能だけです微分係数を取る簡単な方法:

def slope(func, x, h, args=()): 
    """ 
    find a slope for function f at point x 

    Parameters 
    ========= 
    f = function 
    x = independent variable for f 
    h = distance along x to the neighboring points 

    Returns 
    ======= 
    slope 
    """ 

    rise = func(x+h, *args) - func(x-h, *args) 
    run = 2.*h 

    s = rise/run 

    return s 

ここに問題の原因があります。私が入力した場合:

BulkModulus_MgO = np.zeros(volumeMgO.size) 
for i in range(volumeMgO.size): 
    BulkModulus_MgO[i] = slope(p_vinet, volumeMgO[i], volumeMgO[i]*0.0001, 
    args=(params_MgO)) 

を、私はこのエラーを取得する:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-116-60467d989bbc> in <module>() 
    1 BulkModulus_MgO = np.zeros(volumeMgO.size) 
    2 for i in range(volumeMgO.size): 
----> 3  BulkModulus_MgO[i] = slope(p_vinet, volumeMgO[i], 
volumeMgO[i]*0.0001, args=(params_MgO)) 

<ipython-input-100-618f25e85d34> in slope(func, x, h, args) 
15  """ 
16 
---> 17  rise = func(x+h, *args) - func(x-h, *args) 
18  run = 2.*h 
19 

TypeError: p_vinet() takes 2 positional arguments but 4 were given 

私はそれを得ることはありません。 p_vinetは引数vとparamsを必要とし、slope関数のx + hとx-hを介してvを供給し、paramsはp_vinetが展開する3つのエントリを持つリストです。それは2つの議論です。なぜ私は4を供給していると言っているのですか?

ご迷惑をおかけして申し訳ございませんが、コードをどのように提示しているのですか。私はジュピターのノートブックでコーディングしており、すべての機能は別々です。 volumeMgOは前のコードとは別に問題なく計算されます。

答えて

0

のは、このコード行を見てみましょう:

BulkModulus_MgO[i] = slope(p_vinet, volumeMgO[i], volumeMgO[i]*0.0001, 
    args=(params_MgO)) 

このようにする必要があります引数:args=(params_MgO,)(その内の1つの要素を持つタプル)の代わりに、args=(params_MgO)(ないタプル、3つの要素の単なる配列)秒であるためcase解凍*argsslope()にすると、さらに3つの引数(各要素params_MgO)が得られます。だから、slope()の機能で4つの議論があるのです。最初のケースでは、アンパックは単一のパラメータとして配列全体を提供します(p_vinet()関数のパラメータのように)。

関連する問題