簡體   English   中英

R中for循環中的時間離散化

[英]time discretization in for-loop in R

由於時間離散化,我可以通過在時間上向后計算三個函數來計算函數。 時間步長用h表示。 h可以是h = 1/12,h = 1/100和h = 1000。 該函數的三個值應該相似,因為我們只是在不同的時間離散化下在相同范圍內計算它們。 如果我們假設h = 1/12,然后我將計算65:60范圍內所有序列的函數。

h<-1/12
a <- seq(65, 60, (-h)) 

[1] 65.00000 64.91667 64.83333 64.75000 64.66667 64.58333 64.50000 64.41667 64.33333 64.25000 64.16667
[12] 64.08333 64.00000 63.91667 63.83333 63.75000 63.66667 63.58333 63.50000 63.41667 63.33333 63.25000
[23] 63.16667 63.08333 63.00000 62.91667 62.83333 62.75000 62.66667 62.58333 62.50000 62.41667 62.33333
[34] 62.25000 62.16667 62.08333 62.00000 61.91667 61.83333 61.75000 61.66667 61.58333 61.50000 61.41667
[45] 61.33333 61.25000 61.16667 61.08333 61.00000 60.91667 60.83333 60.75000 60.66667 60.58333 60.50000
[56] 60.41667 60.33333 60.25000 60.16667 60.08333 60.00000

這些值給出了:

mu10<-function(t){return(alfa+beta*exp(gamma*t))} 
#mu20=1.03*mu10 #(i write this one in the for-loop)
mu12<-0.5
mu21<-3
r<-log(1+0.01)
b1<-(-1500)
b2<-25000*0.15*12
c10<-45000*10
c20<-45000*10
gamma<-0.044
alpha<-(-0.0073)
beta<-0.0009

我想做的事:創建一個計算此的for循環:

v(65) = h *(b1 + mu10 * c10 + mu12)

w(65) = h *(b2 + mu20 * c20 + mu21)

v(64.91667) = v(65) + h *(-r * v(65)+ b1 + mu10 *(c10-v(65))+ mu12 *(w(65)-v(65)))

w(64.91667) = w(65) + h *(-r * w(65)+ b2 + mu20 *(c20-w(65))+ mu21 *(v(65)-w(65)))

v(64.83333)= v(64.91667) + h *(-r * v(64.91667)+ b1 + mu10 *(c10-v(64.91667))+ mu12 *(w(64.91667)-v(64.91667))))

w(64.83333)= w(64.91667) + h *(-r * w(64.91667)+ b1 + mu10 *(c10-w(64.91667))+ mu12 *(v(64.91667)-w(64.91667))))

V(60)= ....

瓦特(60)= ....

如您所見,這些方程式相互依賴。 上一步中的方程式取決於我們計算的方程式。

我有興趣找出v(60)和w(60)是何時使用時間離散化。

我測試過的內容:

h<-1/12
a <- seq(65, 60, (-h)) 
v <- a*0
w <- a*0
mu10<-function(t){return(alfa+beta*exp(gamma*t))} 
#mu20=1.03*mu10 #(i write this one in the for-loop)
mu12<-0.5
mu21<-3
r<-log(1+0.01)
b1<-(-1500)
b2<-25000*0.15*12
c10<-45000*10
c20<-45000*10
gamma<-0.044
alpha<-(-0.0073)
beta<-0.0009

for (t in 2:length(a)){
  v[1] <- h*(b1+mu10(a[t])*c10)
  w[1] <- h*(b2+mu10(a[t])*1.03*c20)
  v[t] <- v[t-1]+h*(-r*v[t-1]+b1+mu10(a[t])*(c10-v[t-1])+mu12*(w[t-1]-v[t-1]))
  w[t] <- w[t-1]+h*(-r*w[t-1]+b2+mu10(a[t])*1.03*(c20-w[t-1])+mu21*(v[t-1]-w[t-1]))
}
v[60]
w[60]

問題是:當我將h更改為h = 1/100 och h = 1000(不同的時間離散長度)時,當我更改h時,我會得到完全不同的v [60]和w [60]值。 我認為它們應該相似。因為當h為1 / 12、1 / 100或1/1000時,我們停下來並想知道t = 60時的函數值代碼中有錯誤,因為它是“相同”的函數而h只是實際時間離散化,我們如何縮短計算的時間間隔。 代碼提示?

當h = 1/12

> v[60]
[1] 37606.36
> w[60]
[1] 50852.52

當h = 1/100

> v[60]
[1] 3612.329
> w[60]
[1] 15315.34

當h = 1000時

> v[60]
[1] 175.1585
> w[60]
[1] 2700.449

您讀出了第60個迭代步驟。 如果使用數字x對向量進行子集化,則會收到該向量的第x個元素。 您對時間= 60的最后一個迭代步驟感興趣。您可以使用a==60子集,或者,由於您僅對最后一個元素感興趣,只需使用length(a)

結果是:

H = 1/12號

v[length(a)]
38184.65
w[length(a)]
51430.8

h = 1/100

v[length(a)]
37607.17
w[length(a)]
50853.34

h = 1/1000

v[length(a)]
37536.09
w[length(a)]
50782.26

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM