2014-12-18 93 views
1

我正在尋找一種方法來解決具有兩個非線性相等約束的優化問題。具有兩個非線性相等約束的最小二乘法優化

我的成本函數是

E = 0 
for n in range(1, N): 
    E += (np.linalg.norm((x[:, i] - o - np.dot(x[:, i], a) * a)) - r) ** 2 

我的兩個非線性等於約束

np.dot(a, o) = 0 
np.linalg.norm(a) = 1 

我可以使用scipy.leastsq來解決這個問題?我如何編寫代碼?

謝謝

更新:我發現最小化就可以解決問題的狀態here。但是我遇到了另一個問題。

我有以下代碼

(result, ier) = optimize.minimize(Step1CostFun, P, args=(S), 
            method='Nelder-Mead', 
            bounds=bnds, constraints=cons) 

其中那些即將P constaints參數進行優化,P.shape =(1,7)。 S包含觀察數據,S.shape =(3,51)。

至於限制,我有

def DotConstraint(P): 
(r, a1, a2, a3, o1, o2, o3) = P 
return np.dot([a1, a2, a3], [o1, o2, o3]) 


def NormConstraint(P): 
    (r, a1, a2, a3, o1, o2, o3) = P 
    return np.linalg.norm([a1, a2, a3]) - 1 

cons = ({'type': 'eq', 'fun': DotConstraint}, 
     {'type': 'eq', 'fun': NormConstraint}) 

但是,我得到了一個錯誤,

ValueError: operands could not be broadcast together with shapes (1,7) (3,51) 

誰能幫看看?謝謝

+0

這個問題可能是對堆棧溢出比較合適。 –

+0

謝謝。我會把它移到那裏。 – Ben

回答

0

很難準確地判斷出錯的地方,但請注意,您不需要將額外的參數傳遞給目標函數,只需將目標函數關閉至x即可。另外,我得到的錯誤表明Nelder-Mead不能在約束條件下工作。看起來,與等式約束一起工作的唯一方法是SLSQP。下面是代碼爲我工作:

import numpy as np 
from scipy import optimize 

def DotConstraint(P): 
    (r, a1, a2, a3, o1, o2, o3) = P 
    return np.dot([a1, a2, a3], [o1, o2, o3]) 

def NormConstraint(P): 
    (r, a1, a2, a3, o1, o2, o3) = P 
    return np.linalg.norm([a1, a2, a3]) - 1 

cons = ({'type': 'eq', 'fun': DotConstraint}, {'type': 'eq', 'fun': NormConstraint}) 

P = (1,0,0,1,2,0,0) 

x = [np.array([3,0,1]), np.array([2,1,2]), np.array([1,0,3]), np.array([2, -1, 4]), np.array([2.6, 0.8, 5])] 

def CostFunction(P): 
    (r, a1, a2, a3, o1, o2, o3) = P 
    a = np.array([a1, a2, a3]) 
    o = np.array([o1, o2, o3]) 
    return reduce(lambda i,j: i+j, map(lambda arr: (np.linalg.norm(arr - o - np.dot(arr,a)*a) - r)**2, x)) 

res = optimize.minimize(CostFunction, P, method='SLSQP', constraints=cons) 
print res 
相關問題