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