Последовательность семян (ищет конкретный результат) - PullRequest
0 голосов
/ 17 марта 2019

Как я могу изменить семя, чтобы оно дало мне результат, который я ищу, и когда совпадение найдено, как я могу получить номер семени?

код:

set.seed(0)
delta_S<- rep(0,10)
S<- rep(100,10)  
epsilon<- rep(0,10)

  for(i in 1:10){
  epsilon[i]=rnorm(1,0,1)
  delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
  S[i+1]=S[i]+delta_S[i]
 }
  S
  S[11]

Результат, который я ищу S [11], равен 111,54

.

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Вы можете использовать цикл while

S = rep(0, 100)
j = 0

# You can vary digits in order to obtain more precision if you wish
while(round(S[11], digits=2) != 111.54){

  j = j + 1
  set.seed(j)
  delta_S<- rep(0,10)
  S <- rep(100,10)  
  epsilon<- rep(0,10)

  for(i in 1:10){
    epsilon[i]=rnorm(1,0,1)
    delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
    S[i+1]=S[i]+delta_S[i]
  }

}

> j
535

> S
[1] 100.0000  94.6090 103.9302 104.7556 103.1598 105.6781 106.1706 109.8297 109.4760 107.2198 111.5372

> S[11]
111.5372
1 голос
/ 18 марта 2019

Вы могли бы сделать этот подход грубой силы. Имейте в виду, что это не эффективно, но оно делает свое дело. По сути, вы хотите пройтись по номерам начальных чисел и распечатать начальные числа, которые дают S [11] равный 111,54. Я округлил результат до 2 десятичных знаков. В 10 000 семян я нашел два, которые дают S [11] равный 111,54: 535 и 1937.

for (seed_number in 1:10000){
    set.seed(seed_number)
  for(i in 1:10){
    epsilon[i]=rnorm(1,0,1)
    delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
    S[i+1]=S[i]+delta_S[i]
  }
  if(round(S[11],2)==111.54) print(paste("seed is",seed_number))
}

[1] "seed is 535"
[1] "seed is 1937"

Используя ваш код, вы можете убедиться, что set.seed(535) приведет к S [11] = 111.5372. То же самое верно для set.seed(1937)

set.seed(535)
delta_S<- rep(0,10)
S<- rep(100,10)  
epsilon<- rep(0,10)

for(i in 1:10){
  epsilon[i]=rnorm(1,0,1)
  delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
  S[i+1]=S[i]+delta_S[i]
}
S[11]
#[1] 111.5372
0 голосов
/ 18 марта 2019

Pierre Laopointe предоставил хороший подход к этой проблеме, но обратите внимание, что вы получили 2 ответа, что логично, потому что:

set.seed(535)
for(i in 1:10){
+   epsilon[i]=rnorm(1,0,1)
+   delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
+   S[i+1]=S[i]+delta_S[i]
+ }
> print(S[11])
[1] 111.5372
> set.seed(1937)
> for(i in 1:10){
+   epsilon[i]=rnorm(1,0,1)
+   delta_S[i]=0.15*(1/52)*S[i]+0.3*(sqrt(1/52))*epsilon[i]*S[i]
+   S[i+1]=S[i]+delta_S[i]
+ }
> print(S[11])
[1] 111.5388

У вас есть 10 случайных эпсилон [i], и я не знаю, нужно ли вам этоинформация, но важно то, что они отличаются в каждом варианте

> set.seed(535)
> rnorm(10,0,1)
 [1] -1.3651733  2.2988608  0.1215605 -0.4354961  0.5174488  0.0426911  0.7590733 -0.1467427 -0.5647193  0.8985600
> set.seed(1937)
> rnorm(10,0,1)
 [1] -0.780397161 -1.862636176  1.900480228  0.999418781  0.492969410 -0.005050631 -0.130317961  0.140431618  0.621808733
[10]  0.767121606

И поэтому это не означает, что полученное вами семя даст те же результаты с другими семенами в разных обстоятельствах.

...