2012-09-09 21 views
5

我想使用IPOP函數從kernlab解決以下二次規劃方程式二次規劃:求解,使用R

min 0.5*x'*H*x + f'*x 
subject to: A*x <= b 
Aeq*x = beq 
LB <= x <= UB 

其中在我們的例H 3×3矩陣,f是3X1,A是2×3,b爲2×1 ,LB和UB都是3x1。

編輯1 我的R代碼裏面是:

library(kernlab) 
H <- rbind(c(1,0,0),c(0,1,0),c(0,0,1)) 
f = rbind(0,0,0) 
A = rbind(c(1,1,1), c(-1,-1,-1)) 
b = rbind(4.26, -1.73) 
LB = rbind(0,0,0) 
UB = rbind(100,100,100) 
> ipop(f,H,A,b,LB,UB,0) 
Error in crossprod(r, q) : non-conformable arguments 

我從MATLAB知道是這樣的:

H = eye(3); 
f = [0,0,0]; 
nsamples=3; 
eps = (sqrt(nsamples)-1)/sqrt(nsamples); 
A=ones(1,nsamples); 
A(2,:)=-ones(1,nsamples); 
b=[nsamples*(eps+1); nsamples*(eps-1)]; 

Aeq = []; 
beq = []; 
LB = zeros(nsamples,1); 
UB = ones(nsamples,1).*1000; 

[beta,FVAL,EXITFLAG] = quadprog(H,f,A,b,Aeq,beq,LB,UB); 

,答案是3×1的矢量等於[0.57 ,0.57,0.57];

但是,當我嘗試在R上使用kernlab庫的ipop函數 ipop(f,H,A,b,LB,UB,0))並且我面臨crossprod(r,q)中的錯誤:非順應性參數

我明白任何評論

+0

請張貼您使用的R代碼,包括您在哪裏定義f,H,A,b,LB和UB。 – Max

+0

這不應該被移到R論壇嗎? – 2012-09-10 02:11:17

+0

@Max,我加了幾個R代碼 – user702846

回答

2

原來的問題詢問關於在crossprod錯誤消息錯誤(R,q):非順應性參數。答案是r必須用與b相同的尺寸指定。所以如果b是2x1那麼r也必須是2x1。

第二個問題(來自評論)詢問爲什麼原始問題中提出的系統在Matlab中工作,但在R中不工作。答案是R和Matlab指定了不同的問題。 Matlab允許不等式約束與等式約束分開輸入。然而,在R中,約束條件必須全部爲b<=Ax<=b+r(至少在kernlab函數ipop內)。那麼我們如何模仿原來的不平等約束呢?簡單的方法是使b非常負,並使r'=-b+r,其中r'是您的新r載體。現在我們仍然有約束上限,因爲r'+b=-b+r+b=r。但是,我們也已經在約束上設置了一個下限。我的建議是嘗試用b的幾個不同值解決系統,看看解決方案是否一致。

編輯:

這可能是一個更好的方式來處理解決方案:

library(quadprog);
dvec <- -f;
Dmat <- H;
Amat <- -t(A);
bvec <- -rbind(4.26,-1.73);
solve.QP(Dmat, dvec, Amat, bvec)

其中這些定義依賴於先前定義的R代碼裏面。

+0

我檢查了答案考慮不同b和結果看起來一致! – user702846

+0

如果H是一個完全爲零的矩陣,則新代碼不起作用!它抱怨H不是肯定的,雖然它在matlab下工作! – user702846

+0

@ user702846,沒有理由不能繼續使用其他代碼。 「solve.QP」函數必須利用「H」解正確的事實。我正在尋找更多的選項來解決二次方案。 – Max