gpt4 book ai didi

python - 如何在 R 中求解二阶微分方程?

转载 作者:行者123 更新时间:2023-12-01 02:37:27 25 4
gpt4 key购买 nike

我正在学习R来求解二阶微分方程(可能使用 deSolve 包)。我用 python 将其写为两个一阶微分方程,如下所示

import  numpy  as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

def fun(X, t):
y , dy , z = X
M = np.sqrt (1./3. * (1/2. * dy **2 + 1./2. * y **2))
dz = (M*z) # dz/dt
ddy = -3.* M * dy - y # ddy/dt

return [dy ,ddy ,dz]

y0 = 1

dy0 = -0.1

z0 = 1.

X0 = [y0, dy0, z0]

M0 = np.sqrt (1./3. * (1./2. * dy0 **2. + 1./2.* y0 **2))

t = np.linspace(0., 100., 10001.) # time spacing

sol = odeint(fun, X0, t)

y = sol[:, 0]

dy = sol[:, 1]

z = sol[:, 2]

M = np.sqrt (1./3. * (1./2. * dy**2. + 1./2.* y **2))

#Graph plotting
plt.figure()
plt.plot(t, y)
plt.plot(t, z)
plt.plot(t, M)
plt.grid()
plt.show()

Python很容易解决这个问题,但是对于另一个类似但复杂的问题,Python会显示错误。我也尝试过 python 中的 ode(vode/bdf) 但问题仍然存在。现在,我想检查一下R如何解决这个问题。因此,如果有人请给我提供一个如何在 R 中解决此问题的示例(基本上是代码翻译!),以便我可以尝试其他方法,我将非常感激一个R并且还学习一些R(我知道这可能不是学习语言)。

我知道这个问题可能没有什么建设性的值(value),但我只是R的新手,所以请耐心等待!

最佳答案

这应该是 Python 代码到 R 的翻译

library(deSolve)

deriv <- function(t, state, parameters){
with(as.list(c(state, parameters)),{

M <- sqrt(1/3 * (1/2 * dy^2 + 1/2 * y^2))
dz <- M*z # dz/dt
ddy <- -3* M * dy - y # ddy/dt

list(c(dy, ddy, dz))

})
}

state <- c(y = 1,
dy = -0.1,
z = 1)

times <- seq(0, 100, length.out = 10001)

sol <- ode(func = deriv, y = state, times = times, parms = NULL)

y <- sol[, "y"]

dy <- sol[, "dy"]

z <- sol[, "z"]

M <- sqrt(1/3 * (1/2 * dy^2 + 1/2* y^2))

plot(times, z, col = "red", ylim = c(-1, 18), type = "l")
lines(times, y, col = "blue")
lines(times, M, col = "green")
grid()

有一种更快的方法可以使用以下代码直接计算 R 中的 M:

library(deSolve)

deriv <- function(t, state, parameters){
with(as.list(c(state, parameters)),{

M <- sqrt(1/3 * (1/2 * dy^2 + 1/2 * y^2))
dz <- M*z # dz/dt
ddy <- -3* M * dy - y # ddy/dt

list(c(dy, ddy, dz), M = M)

})
}

state <- c(y = 1,
dy = -0.1,
z = 1)

times <- seq(0, 100, length.out = 10001)

sol <- ode(func = deriv, y = state, times = times, parms = NULL)

## save to file

write.csv2(sol,file = "path_to_folder/R_ODE.csv")

## plot

matplot(sol[,"time"], sol[,c("y", "z", "M")], type = "l")
grid()

enter image description here

关于python - 如何在 R 中求解二阶微分方程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46074599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com