如何指定求解微分方程的最终值(而不是初始值)
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) = 3
、r=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.
这应该很容易使用包装函数进行编码,最后一些列表反转从 x
到 y
。
一些 ODE 求解器还允许负步长,因此可以简单地按 tf
到 t0
的降序给出构造 y
的时间,而无需使用一些中介x
.
我想求解 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) = 3
、r=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.
这应该很容易使用包装函数进行编码,最后一些列表反转从 x
到 y
。
一些 ODE 求解器还允许负步长,因此可以简单地按 tf
到 t0
的降序给出构造 y
的时间,而无需使用一些中介x
.