R -Package以这种方式deSolve
描述使用的参数times
:
需要输出的时间序列;
丹尼斯喜欢的文件还有一个重要的句子:
我们注意到,对于某些实现,需要输出的向量时间定义了该方法执行其步骤的网格,因此解决方案的准确性很大程度上取决于输入向量时间。
下面是一个简单的例子,洛伦兹方程,在关于包的书中提到deSolve
:
library(deSolve)
parameters <- c(
a = -8/3,
b = -10,
c = 28)
state <- c(
X = 1,
Y = 1,
Z = 1)
# ---- define function in R
Lorenz <- function(t, state, parameters) {
with(as.list(c(state, parameters)),{
# rate of change
dX <- a*X + Y*Z
dY <- b * (Y-Z)
dZ <- -X*Y + c*Y - Z
# return the rate of change
list(c(dX, dY, dZ))
}) # end with(as.list ...
}
times_1 <- seq(0, 100, by = 1)
out_1 <- lsoda(y = state, times = times_1, func = Lorenz, parms = parameters)
times_2 <- seq(0, 100, by = 0.01)
out_2 <- lsoda(y = state, times = times_2, func = Lorenz, parms = parameters)
tail(out_1)
time X Y Z
[96,] 95 30.54833 11.802554 12.445819
[97,] 96 21.26423 4.341405 4.785116
[98,] 97 33.05220 13.021730 12.934761
[99,] 98 21.06394 2.290509 1.717839
[100,] 99 10.34613 1.242556 2.238154
[101,] 100 32.87323 -13.054632 -13.194377
tail(out_2)
time X Y Z
[9996,] 99.95 17.16735 -7.509679 -12.08159
[9997,] 99.96 17.66567 -7.978368 -12.77713
[9998,] 99.97 18.26620 -8.468668 -13.47134
[9999,] 99.98 18.97496 -8.977816 -14.15177
[10000,] 99.99 19.79639 -9.501998 -14.80335
[10001,] 100.00 20.73260 -10.036203 -15.40840
您可以在 t = 100 时看到结果的差异。这来自不同的定义times
。
问候,
J_F