2016-08-17 75 views
1

嗨,基本上我想返回1值,如果輸入是負值,而另一個輸入值是正值。但不能同時返回。返回的值將用於scipy的curve_fit函數以確定我的未知參數(a & b)。如何根據函數的輸入值返回2個值中的一個

我嘗試使用函數內如果循環,但它提供了以下錯誤:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

這裏是我的代碼:

#Input fitting data 
PAP_Applied_H = [-5,5,10] 
PAP_Eb_fit = [30.7,31.3,31.6] 

#Function Fitting 
def f2(x,a,b): 
    if x<0: 
     y=a*((1+(x/b))**2) 
    else: 
     y=a*((1-(x/b))**2) 
    return y 

params2,extras2 = curve_fit(f2,PAP_Applied_H,PAP_Eb_fit,p0=(1,15)) 

#Linear Fitting 
linefit2 = py.polyfit(PAP_Applied_H,PAP_Eb_fit,1) 
l2 = py.poly1d(linefit2) 

x_new2 = list(range(-50000,1000,1)) 
x_line2 = list(range(-3000,3000,1)) 
y_func2 = f2(x_new2,params2[0],params2[1]) 
y_line2 = l2(x_line2) 

所以我應該如何改變功能「F2 '這樣它會返回我想要的值?任何幫助,將不勝感激。提前致謝。

+0

在函數x是一個列表(你說'輸入'的變量)。那麼你認爲要確定輸入列表是正面的還是負面的? –

+0

你寫的'f2'函數沒有什麼問題,除了你傳遞一個'list',而不是'x'的單個值。你如何期待它通過'x = [ - 1,1,1,-1,1]'來表現? x是正面還是負面? –

回答

0

您的輸入x是一個表。您無法檢查整個列表的正值或負值。您必須逐個檢查每個元素。 試試這個:

def f2(x,a,b): 
    y=[] 
    for i in range(len(x)): 
     if x[i]<0: 
      y.append(a*((1+(x[i]/b))**2)) 
     else: 
      y.append(a*((1-(x[i]/b))**2)) 
    return y 

這裏的返回值y也是值的列表。

0

如何:

DEF F(X,A,B):返回一個*(1 - 2個* ABS(X)/ B +(X/B)** 2)

我知道,這是一種解決方法,並不能解決一般的問題。

相關問題