如何在 R 中构建具有模式的序列
How to construct a sequence with a pattern in R
我想构造一个长度为 50 的以下类型的序列:
Xn+1=4*Xn*(1-Xn)。供您参考,这是 r=4 的逻辑图。对于参数 r = 4 且初始状态在 (0,1) 的 Logistic Map,吸引子也是区间 (0,1),概率测度对应于参数 a = 0.5 和 b 的 beta 分布= 0.5。 (Logistic 映射是 2 次多项式映射(等效地,递推关系),经常被引用为一个原型示例,说明非常简单的非线性动力学方程可以产生多么复杂、混乱的行为)。我如何在 R 中执行此操作?
这不是真正的 R
问题,是吗?更基础的编程。无论如何,您可能需要一个累加器和一个要处理的值。
values <- 0.2 ## this accumulates as a vector, starting with 0.2
xn <- values ## xn gets the first value
for (it in 2:50) { ## start the loop from the second iteration
xn <- 4L*xn*(1L-xn) ## perform the sequence function
values <- c(values, xn) ## add the new value to the vector
}
values
# [1] 0.2000000000 0.6400000000 0.9216000000 0.2890137600 0.8219392261 0.5854205387 0.9708133262 0.1133392473 0.4019738493 0.9615634951 0 .1478365599 0.5039236459
# [13] 0.9999384200 0.0002463048 0.0009849765 0.0039360251 0.0156821314 0.0617448085 0.2317295484 0.7121238592 0.8200138734 0.5903644834 0 .9673370405 0.1263843622
# [25] 0.4416454208 0.9863789723 0.0537419811 0.2034151221 0.6481496409 0.9122067356 0.3203424285 0.8708926280 0.4497546341 0.9899016128 0 .0399856390 0.1535471506
# [37] 0.5198816927 0.9984188732 0.0063145074 0.0250985376 0.0978744041 0.3531800204 0.9137755744 0.3151590962 0.8633353611 0.4719496615 0 .9968527140 0.0125495222
# [49] 0.0495681269 0.1884445109
网上有一些现成的解决方案。我引用了mage's blog的一般解决方案,您可以在其中找到更详细的描述。
logistic.map <- function(r, x, N, M){
## r: bifurcation parameter
## x: initial value
## N: number of iteration
## M: number of iteration points to be returned
z <- 1:N
z[1] <- x
for(i in c(1:(N-1))){
z[i+1] <- r *z[i] * (1 - z[i])
}
## Return the last M iterations
z[c((N-M):N)]
}
对于 OP 示例:
logistic.map(4,0.2,50,49)
我想构造一个长度为 50 的以下类型的序列: Xn+1=4*Xn*(1-Xn)。供您参考,这是 r=4 的逻辑图。对于参数 r = 4 且初始状态在 (0,1) 的 Logistic Map,吸引子也是区间 (0,1),概率测度对应于参数 a = 0.5 和 b 的 beta 分布= 0.5。 (Logistic 映射是 2 次多项式映射(等效地,递推关系),经常被引用为一个原型示例,说明非常简单的非线性动力学方程可以产生多么复杂、混乱的行为)。我如何在 R 中执行此操作?
这不是真正的 R
问题,是吗?更基础的编程。无论如何,您可能需要一个累加器和一个要处理的值。
values <- 0.2 ## this accumulates as a vector, starting with 0.2
xn <- values ## xn gets the first value
for (it in 2:50) { ## start the loop from the second iteration
xn <- 4L*xn*(1L-xn) ## perform the sequence function
values <- c(values, xn) ## add the new value to the vector
}
values
# [1] 0.2000000000 0.6400000000 0.9216000000 0.2890137600 0.8219392261 0.5854205387 0.9708133262 0.1133392473 0.4019738493 0.9615634951 0 .1478365599 0.5039236459
# [13] 0.9999384200 0.0002463048 0.0009849765 0.0039360251 0.0156821314 0.0617448085 0.2317295484 0.7121238592 0.8200138734 0.5903644834 0 .9673370405 0.1263843622
# [25] 0.4416454208 0.9863789723 0.0537419811 0.2034151221 0.6481496409 0.9122067356 0.3203424285 0.8708926280 0.4497546341 0.9899016128 0 .0399856390 0.1535471506
# [37] 0.5198816927 0.9984188732 0.0063145074 0.0250985376 0.0978744041 0.3531800204 0.9137755744 0.3151590962 0.8633353611 0.4719496615 0 .9968527140 0.0125495222
# [49] 0.0495681269 0.1884445109
网上有一些现成的解决方案。我引用了mage's blog的一般解决方案,您可以在其中找到更详细的描述。
logistic.map <- function(r, x, N, M){
## r: bifurcation parameter
## x: initial value
## N: number of iteration
## M: number of iteration points to be returned
z <- 1:N
z[1] <- x
for(i in c(1:(N-1))){
z[i+1] <- r *z[i] * (1 - z[i])
}
## Return the last M iterations
z[c((N-M):N)]
}
对于 OP 示例:
logistic.map(4,0.2,50,49)