微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

if (temp < vmin) { 错误:参数长度为零

如何解决if (temp < vmin) { 错误:参数长度为零

我正在尝试为一些控制问题编写马尔可夫链近似值。 但是我在 R 中有以下错误,我在 Stackoverflow 中检查了类似的问题,但仍然有 不知道如何解决。任何帮助将不胜感激。

错误来自于我想在 for 循环中的所有 'u' 中找到最小值的地方。

具体来说,在 uit-for-loop 中,对于每个下一个 uit,我可以获得一个新的单个值(我认为)temp 并想将其与存储的临时最小值进行比较单值变量 vmin。这就是 if-else 句中的意思。

最好跳过参数设置和初始化过程。

#----- parameters ------
xleft=0; xright=10
yleft=0; yright=10
h=0.01
Nx=(xright-xleft)/h
Ns=2
Nu=11; hu=0.2
la=0.1
qMainDiag=c(-0.5,-0.5)
qSubDiag=c(0.5,0.5)
alpha=c(0.2,0.25)
beta=c(0.35,0.2)
a=c(0.6,0.8)
b=c(0.5,0.3)
c=c(0.45,0.5)
d=c(0.65,0.8)
tol=10^(-8)
maxitr=10000
#---- Initialization -----
Vold=array(0,dim=c(Nx+1,Nx+1,Ns))
Vnew=array(0,Ns))
Uopt=array(0,Ns))
for(r in 1:Ns){
  for(i in 1:(Nx+1)){
    for(j in 1:(Nx+1)){
      Vold[i,j,r]=1
    }
  }
}
#---- iteration ----
for(n in 1:maxitr){
  for(r in 1:Ns){
    # inner of O
    for(i in 2:Nx){
      for(j in 2:Nx){
        vInt=0
        for(it in 1:(min(i,j)+1)){
          vInt=vInt+Vold[i-it+1,j-it+1,r]*0.1*exp(-0.1*(it-1)*h)*h
        }
        # For each u,want to find the minimum temp value and its u.
        for(uit in 1:Nu){
          x=xleft+(i-1)*h; y=yleft+(j-1)*h
          u=hu*(uit-1)
          Xi11=(alpha[r]*x)^2; Xi22=(beta[r]*y)^2
          f1=x*(a[r]-b[r]*y+u); f2=y*(-c[r]+d[r]*x+u)
          g=1+r*(x+y)*(1+u^2)
          Qh=(Xi11+Xi22)+h*(abs(f1)+abs(f2))+h-(h^2)*qMainDiag[r]
          dlt=(h*h)/Qh
          pforward=0.5*(Xi11+2*h*max(f1,0.0))/Qh
          pback=0.5*(Xi11+2*h*max(-f1,0.0))/Qh
          pup=0.5*(Xi22+2*h*max(f2,0.0))/Qh
          pdown=0.5*(Xi22+2*h*max(-f2,0.0))/Qh
          pswitch=(h*h*qSubDiag[r])/Qh
          pstay=h/Qh
          temp=(1-la*dlt)*(pforward*Vold[i+1,r]+pback*Vold[i-1,r]
                           +puP*Vold[i,j+1,r]+pdown*Vold[i,j-1,r]
                           +pswitch*Vold[i,3-r]
                           +pstay*Vold[i,r])+la*dlt*vInt+dlt*g
          # find the minimal value (Here is the spot!!!)
          if(uit==1){
            vmin=temp; umin=u
          }else if(temp<vmin){
            vmin=temp; umin=u
          }
        }
        Vnew[i,r]=vmin
        Uopt[i,r]=umin
      }
    }
    errormax=max(abs(Vold-Vnew))
    print(n)
    print(errormax)
    Vold=Vnew
    if(errormax<tol){
      break
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。