我使用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
函數來生成函數及其派生函數,並將它們包含在目標函數中。
它們不完全相同。應該「out [1] = inp [0] -pM * inp [1]」out「[1] = inp [0] -inp [2] * inp [1]」? –