使用uniroot更新函数中的值

kgqe7b3p  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(116)

我想根据R中uniroot的结果更新函数中的一个特定值。
例如,如果我试图解决x,其中s = 60000和t = 19.95我有:
第一个月
对于下一次迭代,我想更新s的值,使s = 59789,以及t的值,使t = 19.90。重复地,这应该一直更新到t = 0,对于t向下0.05步。因此,399次迭代,因为19.95/0.05 = 399。
(mu只是一个预定义的函数,例如μ(40,19.95)= 0.003204。
下面是一些示例代码:

s <- 60000
t <- 19.95

f <- function(x) (s - x - 0.05*(0.04*x + 1810.726 - mu(40, t)*(s - x)))

uniroot(f, lower=0.1, upper=100000000)$root

有谁能给我一些如何实施的建议吗?
mu()的计算公式如下:

mu <- function(x, t) {
  A <- .00022
  B <- 2.7*10^(-6)
  c <- 1.124
  mutemp <- A + B*c^(x + t)
  out <- ifelse(t <= 2, 0.9^(2 - t)*mutemp, mutemp)
  out
}

预期结果应如下所示:

t x
0 0.0000
1 1853.8638 11 26882.9244
2 3817.7860 12 30070.8515
3 5894.9409 13 33384.7327
4 8088.4838 14 36823.9198
5 10400.9021 15 40387.3491
6 12834.5166 16 44073.5260
7 15391.4745 17 47880.5110
8 18073.7445 18 51805.9074
9 20883.1160 19 55846.8507
10 23821.2011 20 60000.0000

59789的值对应于V_{19.95} = 59789,并且V_{20} = 60000是给定的起始值。

qhhrdooz

qhhrdooz1#

这个for循环可能会有帮助。

1.运行所有代码
s <- 60000
t <- 20

mu <- function(x, t) {
  A <- .00022
  B <- 2.7*10^(-6)
  c <- 1.124
  mutemp <- A + B*c^(x + t)
  out <- ifelse(t <= 2, 0.9^(2 - t)*mutemp, mutemp)
  out}

f <- function(x) (s - x - 0.05*(0.04*x + 1810.726 - mu(40, t)*(s - x)))
2.运行下面的for循环进行迭代

2.1预定义结果的长度。在您的情况下为400(t/0.05 = 400)。

output <- vector(mode = "numeric", length = t/0.05)

2.2从1到400运行for循环。将每个uniroot结果保存到步骤2.1,然后相应地重新分配s和t。

for (i in 1:400) {
  output[i] <- uniroot(f, lower=0.1, upper=100000000)$root
  s <- output[i]
  t <- 20 - i * 0.05
}
3.检查结果
output

希望这是有帮助的。

x759pob2

x759pob22#

您可以在已定义的tseq序列上使用vapply

s <- 6e4
tseq <- seq.int(19.95, 0, -.05)

x <- vapply(tseq, \(t) {
  s <<- uniroot(\(x) (s - x - 0.05*(0.04*x + 1810.726 - mu(40, t)*(s - x))), lower=0.1, upper=100000000)$root
}, numeric(1L))

请注意,<<-在全局环境中更改了s,并在最后获得最后一个值。

s
# [1] 2072.275

res <- cbind(t=tseq, x)

head(res)
#          t        x
# [1,] 19.95 59789.92
# [2,] 19.90 59580.25
# [3,] 19.85 59371.01
# [4,] 19.80 59162.18
# [5,] 19.75 58953.77
# [6,] 19.70 58745.77

相关问题