![](/img/trans.png)
[英]How to solve a Second order and Second Degree Differential Equation ( in python )?
[英]How do I solve a second order differential equation in R?
我正在學習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 (我知道這可能並不是學習語言的理想方式)。
我知道這個問題可能沒有什么建設性的價值,但是我只是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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.