Оптимизация с ограничением в R (целевая функция в optim имеет длину 0, а не 1)

#r #optimization #constraints

#r #оптимизация #ограничения

Вопрос:

Я хочу свести эту функцию к минимуму с помощью ограничений введите описание изображения здесь

Шаг заключается в том, что мне нужно найти t(i), который оптимизирует (минимизирует) E(TC)

Вот мои коды для n=3 и я хочу минимизировать E(TC) с оптимальным t(i) ,i =1,2,3. Обратите внимание, что t(1) должно быть равно нулю, и с ограничением t(2)lt;t(3)

 OptExplt;-function(te){  mu=0.001299059  sigm=0.00006375925  D=80  K=500  F=0.7  T=40  Po=-0.0208801593  mu=0.001299059    n=3  t=as.vector(n,mode="numeric")  P1=as.vector(n,mode="numeric")  P2=as.vector(n,mode="numeric")  Pt1=as.vector(n,mode="numeric")  Pt2=as.vector(n,mode="numeric")   for (i in 2:(n)){  t[1]=0  t[i]=te[i-1]}    for (i in 1:n){  if(i!=n){  P1[i]=Po*exp((mu (sigm^2)/2)*t[i])*D*(t[i 1]-t[i])  P2[i]=(1/2)*Po*exp((mu (sigm^2)/2)*t[i])*F*D*(t[i 1]-t[i])^2}  else {  P1[i]=Po*exp((mu (sigm^2)/2)*t[i])*D*(T-t[i])  P2[i]=(1/2)*Po*exp((mu (sigm^2)/2)*t[i])*F*D*(T-t[i])^2}}    Pt1=sum(P1)  Pt2=sum(P2)    E=n*K Pt1 Pt2    #constraint  if (t[3]lt;T amp; t[1]lt;t[2] amp; t[2]lt;t[3]){  return(E)} }  optmz=optim(c(3,5),fn=OptExp)  

Но в результате получается

 Error in optim(c(3, 5), fn = OptExp) :   objective function in optim evaluates to length 0 not 1  

Кто-нибудь знает, что не так в моем коде?

*ps: Я также пытаюсь использовать consrtOptim

 n=2  t=as.vector(n,mode="numeric")  t[1]=0   OptExplt;-function(te){  mu=0.001299059  sigm=0.00006375925  D=80  K=500  F=0.7  T=40  Po=-0.0208801593  mu=0.001299059    P1=as.vector(n,mode="numeric")  P2=as.vector(n,mode="numeric")  Pt1=as.vector(n,mode="numeric")  Pt2=as.vector(n,mode="numeric")    for (i in 2:(n)){  t[1]=0  t[i]=te[i-1]}    for (i in 1:n){  if(i!=n){  P1[i]=Po*exp((mu (sigm^2)/2)*t[i])*D*(t[i 1]-t[i])  P2[i]=(1/2)*Po*exp((mu (sigm^2)/2)*t[i])*F*D*(t[i 1]-t[i])^2}  else {  P1[i]=Po*exp((mu (sigm^2)/2)*t[i])*D*(T-t[i])  P2[i]=(1/2)*Po*exp((mu (sigm^2)/2)*t[i])*F*D*(T-t[i])^2}}    Pt1=sum(P1)  Pt2=sum(P2)    E=n*K Pt1 Pt2  return(E) }  lb=t[n-1] u1=cbind(c(1,-1));u1 c1=c(lb,-40) init=c(3) valuelt;-constrOptim(init,f=OptExp,ui=u1,ci=c1,grad=NULL)  

обратите внимание, что ограничение для n=2 равно t(1)=0lt;t(2)

и он возвращается

 one-dimensional optimization by Nelder-Mead is unreliable: use "Brent" or optimize() directly  

Комментарии:

1. Вы не можете просто ничего не возвращать в функции OptExp. Откуда у тебя эта идея? Возможно, вам захочется изучить функцию: constrOptim которая позволяет задавать ограничения линейного неравенства.

2. Я пробовал использовать constrOptim, пожалуйста, посмотрите на мой отредактированный вопрос.. Есть идеи? Спасибо

Ответ №1:

Простое следование инструкциям в сообщениях об ошибках (не требуется думать) приводит к:

 valuelt;-constrOptim(init,f=OptExp,ui=u1,ci=c1,grad=NULL,  method="Brent",lower=0,upper=40)  

и

 OptExplt;-function(te,...){   

Для более чем одного t метода использования=»Нелдер-Мид» (или лучше BFGS)