2015-07-20 127 views
1

我使用optimize.root來查找方程組的數值解。我需要將每個條件表達爲一個單獨的函數,並且我還需要傳遞一些參數給一些條件。但是,似乎optimize.root只能在目標函數本身內完成計算並且不在由目標函數調用的單獨函數中才能正確傳遞參數。將參數傳遞給Python中的目標函數optimize.root

下面的代碼複製問題:

# Conditions to be solved 
def fSSBj(inp): 
    return (0.5*inp[1])/(1+inp[1])-0.9*inp[0] 
def fSSBJ(inp): 
    return inp[0]-inp[2]*inp[1] 

# Objective function with conditions inserted directly 
def objFunc1(inp,pM): 
    out = empty(2) 
    out[0] = (0.5*inp[1])/(1+inp[1])-0.9*inp[0] 
    out[1] = inp[0]-pM*inp[1] 
    return out 

# Objective function that calls the functions with the conditions 
def objFunc2(inp,pM): 
    out = empty(2) 
    out[0] = fSSBj(inp+[pM]) 
    out[1] = fSSBJ(inp+[pM]) 
    return out 

注意,這兩個目標函數使用同樣的輸入;他們也給了相同的輸出:

print objFunc1([1.0,1.0],0.2) 
print objFunc2([1.0,1.0],0.2) 

這兩個命令返回

[-0.65 0.8 ] 

的問題,然而,就是以下兩個命令產生非常不同的結果:

Out1 = optimize.root(objFunc1, [1.0,1.0], args = (0.2), method='hybr') 
Out2 = optimize.root(objFunc2, [1.0,1.0], args = (0.2), method='hybr') 

第一工作得很好;第二個給出錯誤消息(Index is out of bounds)。請問optimize.root如何將參數傳遞給一個函數?

這對我來說是一個問題,因爲(1)我有不同的條件集來解決;和(2)我需要採用一階導數來生成雅可比行列式函數。由於這兩個原因,我使用SymPy的lambdify函數來生成函數及其派生函數,並將它們包含在目標函數中。

+0

它們不完全相同。應該「out [1] = inp [0] -pM * inp [1]」out「[1] = inp [0] -inp [2] * inp [1]」? –

回答

1

我假設numpy將您的輸入列表轉換爲ndarray

不幸的是,

>> [1,1] + [0.2] 
[1, 1, 0.2] 

>> np.array([1,1]) + [0.2] 
array([ 1.2, 1.2]) 

因此,你會得到一個IndexError

0

這是我需要的提示!當我使用numpy.concatenate它的作品。在工作代碼下方:

# Conditions to be solved 
def fSSBj(inp): 
    return (0.5*inp[1])/(1+inp[1])-0.9*inp[0] 
def fSSBJ(inp): 
    return inp[0]-inp[2]*inp[1] 

# Objective function that calls the functions with the conditions 
# Use numpy.concatenate to concatenate the numpy arrays 
def objFunc(inp,pM): 
    out = empty(2) 
    allInp = concatenate((inp,pM)) 
    out[0] = fSSBj(allInp) 
    out[1] = fSSBJ(allInp) 
    return out 

# Be sure to give the argument as a list: 
Out = optimize.root(objFunc, [1.0,1.0], args = ([0.2]), method='hybr')