如何指定求解微分方程的最终值(而不是初始值)

how to specify final value (rather than initial value) for solving differential equations

我想求解 R 中的微分方程(deSolve?),我没有初始条件,只有状态变量的最终条件。如何做到这一点?

典型代码为:ode(times, y, parameters, function ...) 其中y是初始条件,function定义了微分方程。

你的方程 time reversible,也就是说,你能否改变你的微分方程,使它们 运行 及时倒退?大多数情况下,这只是意味着反转梯度的符号。例如,对于速率为 r 的简单指数增长模型(梯度为 x = r*x),然后翻转符号使梯度为 -r*x 并生成指数衰减而不是指数衰减增长。

如果是这样,您所要做的就是将最终条件用作初始条件,更改梯度的符号,然后就完成了。

正如@LutzLehmann 所建议的,有一个更简单的答案:ode 可以处理负时间步长,因此只需输入您的时间向量 (t_end, 0)。这是一个示例,使用 f'(x) = r*x(即指数增长)。如果 f(1) = 3r=1,并且我们想要 t=0 处的值,分析上我们会说:

x(T) = x(0) * exp(r*T) 
x(0) = x(T) * exp(-r*T)
     = 3 * exp(-1*1)
     = 1.103638

现在让我们在 R 中试试:

library(deSolve)
g <- function(t, y, parms) { list(parms*y) }
res <- ode(3, times = c(1, 0), func = g, parms = 1)
print(res)
##   time        1
## 1    1 3.000000
## 2    0 1.103639

我最初误读了你的问题,因为你说你知道 初始条件和最终条件。这种类型的问题称为 boundary value problem and requires a separate class of numerical algorithms from standard (more elementary) initial-value problems.

library(sos)
findFn("{boundary value problem}")

告诉我们,CRAN 上有几个 R 包(bvpSolve 看起来最有前途)可以解决这类问题。

给定一个微分方程

    y'(t) = F(t,y(t))

在区间 [t0,tf]y(tf)=yf 作为初始条件,可以通过考虑

将其转换为标准形式
    x(s) = y(tf - s)  
    ==>  x'(s) = - y'(tf-s) = - F( tf-s, y(tf-s) )
         x'(s) = - F( tf-s, x(s) )

现在

    x(0) = x0 = yf.

这应该很容易使用包装函数进行编码,最后一些列表反转从 xy


一些 ODE 求解器还允许负步长,因此可以简单地按 tft0 的降序给出构造 y 的时间,而无需使用一些中介x.