Это все, и все равно не работает. Я предполагаю, что проблема заключается во втором условии Amat и структуре if else:
Dmat <- matrix(0,nrow= J, ncol=J)
diag(Dmat) <- 1
dvec <- rep(0,J)
dvec <- -hsmooth
Aeq <- matrix(nrow= J, ncol=0)
beq <- rep(0)
Amat <- matrix(0,J,2*J-3)
bvec <- vector(mode = "numeric", length=2*J-3)
for(j in 1:J)
{
Amat[j-1,j-1] = -1
Amat[j,j-1] = 1
bvec[j-1] = Delta1
}
for(j in 2:J){
Amat[j,J-1+j-2] = -1/ (Q[j] - Q[j-1])
if (j==2)
{Amat[j-1,J-1+j-2] = 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - 0)
}
else
{Amat[j-1,J-1+j-2] = 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2])
}
Amat[j-2,J-1+j-2] = -1/ (Q[j-1] - Q[j-2])
bvec[J-1+j-2] = Delta2
}
solution1 <- solve.QP(Dmat, dvec, Amat, bvec, meq=0, factorized=FALSE)
Математическая форма следующая:
min sum (mj- m ^), где j изменяется от 1 до J.
ул.
mj-1 <= mj - дельта1
1 / (Qj-1 -Qj-2) (mj-2 -mj-1) <= 1 / (Qj -Qj-1) (mj-1 - mj) -delta2
Я был бы очень признателен, если бы здесь была помощь.
@Roland Хороший выстрел! Спасибо за комментарий. Кажется, что именно такое поведение нежелательно для OP - поэтому OP должен переосмыслить логику индексации в коде.
Что такое Delta1 и Delta2? В первом цикле for у вас та же проблема с индексом 0.
dvec <- rep(0,J) устарел, потому что вы делаете dvec <- -hsmooth в следующей строке. Что такое hsmooth?
вместо первого цикла for я бы сделал: diag(Amat) <- -1; Amat[cbind(2:J, 1:(J-1))] <- 1; bvec[1:J] <- Delta1





R не является C. Индексы в R начинаются с 1, а не с нуля. Итак, первый элемент в Q - это Q[1]. Это не похоже на ряд других (вдохновленных C) языков, но больше похоже на обычную математическую нотацию.
Так что вы, вероятно, захотите заменить Q[j-2] на Q[j-1].
Вопрос сильно изменился с тех пор, как я поставил свой ответ. Проблема все еще остается:
for(j in 1:J)
{
Amat[j-1,j-1] = -1
Wenn j - это 1, тогда j-1 равен нулю, а Amat[0,0] не является полезным выражением, когда предполагается, что индексы начинаются с 1.
Просто для придирки: я не уверен, насколько индексирование на основе 1 представляет собой "больше похоже на обычную математическую запись".
Никинг согласился - это была не самая лучшая моя формулировка. Я имею в виду следующее: если вы посмотрите википедию в разделе «Суммирование», первое обозначение, которое вы найдете, это $ \ sum_ {i = 1} ^ {100} i $. У меня сложилось впечатление, что i чаще запускается с 1, чем с нуля (я могу ошибаться).
@Bernard Достаточно честно ;-) Большинство математических рядов, которые приходят мне в голову в первую очередь, начинаются с нуля: геометрические, Тейлора, экспоненциальная функция, ... (о том, что это стоит, см. здесь для многих других серий, начиная с 0 или 1)
@MauritsEvers Очко взято. В любом случае, это, вероятно, стоило многим и многим людям времени и усилий, что все языки программирования не одинаковы, и этот псевдокод - в этом отношении - подходит для большинства основных языков (C++, Java, JS, Python, ...) или для R.
@Bernard Согласен. Я начал кодировать на Фортране (индексирование на основе 1) еще будучи студентом (физики любят Фортран), а затем в какой-то момент перешел на C / C++ (индексирование на основе 0). Ошибки, которые я сделал тогда (и последующие сеансы отладки), все еще преследуют меня ;-)
У вас сейчас что в
Rиндексация начинается с 1? (R- это неC!)