Числовой индекс R (0) вместо 0

Это все, и все равно не работает. Я предполагаю, что проблема заключается во втором условии 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

Я был бы очень признателен, если бы здесь была помощь.

У вас сейчас что в R индексация начинается с 1? (R - это не C!)

jogo 08.06.2018 08:42

@Roland Хороший выстрел! Спасибо за комментарий. Кажется, что именно такое поведение нежелательно для OP - поэтому OP должен переосмыслить логику индексации в коде.

jogo 08.06.2018 08:51

Что такое Delta1 и Delta2? В первом цикле for у вас та же проблема с индексом 0.

jogo 08.06.2018 10:59
dvec <- rep(0,J) устарел, потому что вы делаете dvec <- -hsmooth в следующей строке. Что такое hsmooth?
jogo 08.06.2018 11:07

вместо первого цикла for я бы сделал: diag(Amat) <- -1; Amat[cbind(2:J, 1:(J-1))] <- 1; bvec[1:J] <- Delta1

jogo 08.06.2018 11:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
234
1

Ответы 1

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 представляет собой "больше похоже на обычную математическую запись".

Maurits Evers 08.06.2018 08:48

Никинг согласился - это была не самая лучшая моя формулировка. Я имею в виду следующее: если вы посмотрите википедию в разделе «Суммирование», первое обозначение, которое вы найдете, это $ \ sum_ {i = 1} ^ {100} i $. У меня сложилось впечатление, что i чаще запускается с 1, чем с нуля (я могу ошибаться).

Bernhard 08.06.2018 13:21

@Bernard Достаточно честно ;-) Большинство математических рядов, которые приходят мне в голову в первую очередь, начинаются с нуля: геометрические, Тейлора, экспоненциальная функция, ... (о том, что это стоит, см. здесь для многих других серий, начиная с 0 или 1)

Maurits Evers 08.06.2018 17:39

@MauritsEvers Очко взято. В любом случае, это, вероятно, стоило многим и многим людям времени и усилий, что все языки программирования не одинаковы, и этот псевдокод - в этом отношении - подходит для большинства основных языков (C++, Java, JS, Python, ...) или для R.

Bernhard 08.06.2018 18:25

@Bernard Согласен. Я начал кодировать на Фортране (индексирование на основе 1) еще будучи студентом (физики любят Фортран), а затем в какой-то момент перешел на C / C++ (индексирование на основе 0). Ошибки, которые я сделал тогда (и последующие сеансы отладки), все еще преследуют меня ;-)

Maurits Evers 08.06.2018 18:31

Другие вопросы по теме