2012-09-09 40 views
5

me gustaría resolver la siguiente ecuación de programación cuadrática utilizando la función IPOP de kernlab:Solución de programación cuadrática utilizando R

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

donde en nuestra matriz 3x3 ejemplo H, f es 3x1, A es 2x3, b es 2x1 , LB y UB son ambos 3x1.

editar 1 Mi código R es:

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 

Sé por Matlab que es algo como esto:

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); 

y la respuesta es un vector de 3x1 es igual a [0.57 , 0,57,0.57];

Sin embargo, cuando lo intento en R, utilizando la función de IPOP de kernlab biblioteca IPOP (f, H, A, B, LB, UB, 0)) y estoy frente Error en crossprod (r, q): argumentos no conformables

agradezco cualquier comentario

+0

Por favor, publique el código R que utilizó, incluso donde define 'f',' H', 'A',' b', 'LB', y' UB'. – Max

+0

¿No debería ser movido al foro R? –

+0

@Max, he agregado algunos códigos R – user702846

Respuesta

2

la pregunta original pregunta por el mensaje de error error en crossprod (r, q): argumentos no conformables. La respuesta es que r se debe especificar con las mismas dimensiones que b. Entonces, si b es 2x1, entonces r también debe ser 2x1.

Una pregunta secundaria (de los comentarios) pregunta por qué el sistema presentado en la pregunta original funciona en Matlab pero no en R. La respuesta es que R y Matlab especifican los problemas de manera diferente. Matlab permite que las restricciones de desigualdad se ingresen por separado de las restricciones de igualdad. Sin embargo, en R las restricciones deben ser del tipo b<=Ax<=b+r (al menos dentro de la función kernlabipop). Entonces, ¿cómo podemos imitar las restricciones de desigualdad originales? La manera simple es hacer b muy negativo y para hacer r'=-b+r, donde r' es su nuevo vector r. Ahora todavía tenemos el mismo límite superior en las restricciones porque r'+b=-b+r+b=r. Sin embargo, hemos puesto un límite inferior en las restricciones, también. Mi sugerencia es intentar resolver el sistema con algunos valores diferentes para b para ver si la solución es consistente.

EDIT:

Esta es probablemente una mejor manera de manejar la solución del programa:

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

donde estas definiciones dependen del código R previamente definido.

+0

¡Comprobé la respuesta considerando diferente b y el resultado parece consistente! – user702846

+0

¡el nuevo código no funciona si H es una matriz completamente cero! se queja de que H no es positivo definido, ¡aunque funciona bajo matlab! – user702846

+0

@ user702846, No hay ninguna razón por la que no pueda seguir utilizando el otro código. La función 'solve.QP' debe hacer uso del hecho de que' H' es positivo definido para resolver el programa. Estoy buscando más opciones para resolver programas cuadráticos. – Max

Cuestiones relacionadas