Hi!
I have a quadratic optimization problem and I have some difficulties coding
it with R. The math version of the problem looks like this:
min sum(mj -mj^)^2 which goes from 1 to J
st.
mj-1 <= mj - delta1
1/(Qj-1 -Qj-2)(mj-2 -mj-1) <= 1/(Qj -Qj-1 ) (mj-1 - mj) -delta2
And I'm coding it like this:
Dmat <- matrix(0, J,J)
diag(Dmat) <- 1
dvec <- -hsmooth
Aeq <- 0
beq <- 0
Amat <- matrix(0,2*J-3,J)
bvec <- rep(0,2*J-3)
for(j in 1:J)
{
Amat[j-1,j-1] = -1
Amat[j-1,j] = 1
bvec[j-1] = Delta1
}
for(j in 2:J)
{
Amat[J-1+j-2,j] = -1/ (Q[j] - Q[j-1])
Amat[J-1+j-2,j-1]= 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2])
Amat[J-1+j-2,j-2]= -1/(Q[j-1] - Q[j-2])
bvec[J-1+j-1]= Delta2
}
solution <- solve.QP(Dmat, dvec, Amat, bvec)
I get errors:
Error in Amat[J - 1 + j - 2, j - 1] <- 1/(Q[j] - Q[j - 1]) + 1/(Q[j - :
replacement has length zero
And
Error in solve.QP(Dmat, dvec, Amat, bvec) :
Amat and dvec are incompatible!
I'm not sure what I'm doing wrong here, and I really could use some help
with this. Thanks in advance!
[[alternative HTML version deleted]]
Q[j-2] gives you Q[0] in your first inner loop iteration. R arrays start at one. B.> On 2018-06-13, at 07:21, Maija Sirkj?rvi <maija.sirkjarvi at gmail.com> wrote: > > Amat[J-1+j-2,j-1]= 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2])
Keep replies on list please. You are not accessing a value from vector Q if you access the zero'th element! R > Q <- c(3, 5, 8) R > Q[0] numeric(0) R > Q[1] [1] 3 R > Q[2] [1] 5 In the first iteration of the loop j is 2 thus j-2 is 0 and that's the reason for the error message: you are trying to replace a matrix element with a zero-length (i.e. unassigned) numeric value. Perhaps, in your mind, you are mixing up the index of a vector element and its value? If you need two zeros to start your vector, do something like R > Q <- c(0, 0, Q) R > Q [1] 0 0 3 5 8 Clear now? B.> On 2018-06-14, at 01:22, Maija Sirkj?rvi <maija.sirkjarvi at gmail.com> wrote: > > Many thanks for your message! > > The thing is that I need Q[j-2] to be zero for the first two iterations because I don't have those values (J starts from 1). Do you have any idea how to do it? > > Thanks again! > > Maija > > 2018-06-13 15:52 GMT+03:00 Boris Steipe <boris.steipe at utoronto.ca>: > Q[j-2] gives you Q[0] in your first inner loop iteration. > R arrays start at one. > > B. > > > > On 2018-06-13, at 07:21, Maija Sirkj?rvi <maija.sirkjarvi at gmail.com> wrote: > > > > Amat[J-1+j-2,j-1]= 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2]) > >
Thanks for the reply! I got that figured out, but still have some problems
with the quadratic programming.
It seems that my Amat and dvec are incompatible. Amat is a matrix of zeros
size: *2*J-3,J* and dvec is a vector of length *J*. There should be no
problem, but apparently there is. The piece of code looks like this:
Dmat <- matrix(0,nrow= J, ncol=J)
diag(Dmat) <- 1
dvec <- rep(0,J)
dvec
dvec <- -hsmooth
Aeq <- 0
beq <- 0
Amat <- matrix(0,2*J-3,J)
bvec <- rep(0,2*J-3)
for(j in 2:J)
{
Amat[j-1,j-1] = -1
Amat[j-1,j] = 1
bvec[j-1] = Delta1
}
for(j in 3:J)
{
Amat[J-1+j-2,j] = -1/(Q[j] - Q[j-1])
Amat[J-1+j-2,j-1]= 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2])
Amat[J-1+j-2,j-2]= -1/(Q[j-1] - Q[j-2])
bvec[J-1+j-2]= Delta2
}
solution <- solve.QP(Dmat, dvec, Amat, bvec)
2018-06-14 15:52 GMT+03:00 Boris Steipe <boris.steipe at utoronto.ca>:
> Keep replies on list please.
>
> You are not accessing a value from vector Q if you access the zero'th
> element!
> R > Q <- c(3, 5, 8)
> R > Q[0]
> numeric(0)
> R > Q[1]
> [1] 3
> R > Q[2]
> [1] 5
>
> In the first iteration of the loop j is 2 thus j-2 is 0 and that's the
> reason for the error message: you are trying to replace a matrix element
> with a zero-length (i.e. unassigned) numeric value. Perhaps, in your mind,
> you are mixing up the index of a vector element and its value? If you need
> two zeros to start your vector, do something like
>
> R > Q <- c(0, 0, Q)
> R > Q
> [1] 0 0 3 5 8
>
>
> Clear now?
> B.
>
>
>
> > On 2018-06-14, at 01:22, Maija Sirkj?rvi <maija.sirkjarvi at
gmail.com>
> wrote:
> >
> > Many thanks for your message!
> >
> > The thing is that I need Q[j-2] to be zero for the first two
iterations
> because I don't have those values (J starts from 1). Do you have any
idea
> how to do it?
> >
> > Thanks again!
> >
> > Maija
> >
> > 2018-06-13 15:52 GMT+03:00 Boris Steipe <boris.steipe at
utoronto.ca>:
> > Q[j-2] gives you Q[0] in your first inner loop iteration.
> > R arrays start at one.
> >
> > B.
> >
> >
> > > On 2018-06-13, at 07:21, Maija Sirkj?rvi <maija.sirkjarvi at
gmail.com>
> wrote:
> > >
> > > Amat[J-1+j-2,j-1]= 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2])
> >
> >
>
>
[[alternative HTML version deleted]]