如何使用deSolve

时间:2019-09-07 16:09:55

标签: r ode

我想用R来数值求解一个称为Lane-Emden方程的特定微分方程。 https://en.wikipedia.org/wiki/Lane%E2%80%93Emden_equation#Numerical_solutions

我对如何在deSolve中为ODE求解器提出问题感到困惑。我有一些代码,它给出了一个我不理解并且不知道如何解决的错误。

我试图改编K Soetart等人的《解决R中的微分方程》一书中的例子。

library(deSolve)
x <- seq(0,20,0.1)
n <- 1
y_ini <- c(phi=0, theta=1)

derivs <- function(x,y,parms){
  with(as.list(y),{
  dtheta <- -phi/(xi^2)
  dphi <- theta^n * xi^2
  list(c(dtheta,dphi))})
}

out <- ode(y=y_ini,times <- x,func = derivs,parms=NULL)

eval(substitute(expr),data,enclos = parent.frame())中的错误:找不到对象'xi'调用:... func2-> func-> with-> with.default-> eval-> eval执行暂停

1 个答案:

答案 0 :(得分:0)

执行注释中提到的所有更改:

  • xi的参数列表中使用derivs代替x
  • 同步状态向量和导数中的thetaphi的顺序
  • 通过将第一次更改为较小的正值来避免被零除

提供代码

library(deSolve)
x <- seq(0.0001,20,0.1)
n <- 1
y_ini <- c(theta=1, phi=0 )

derivs <- function(xi,y,parms){
  with(as.list(y),{
  dtheta <- -phi/(xi^2)
  dphi <- theta^n * xi^2
  list(c(dtheta,dphi))})
}

out <- ode(y=y_ini,times <- x,func = derivs,parms=NULL)
print(out)
theta <- out[,"theta"]
plot(times, theta)

然后生成图

https://github.com/fireuser909/override