2017-09-06 22 views
1

私は二次微分方程式(おそらくdeSolveパッケージを使用)を解くためにRを学習しています。私は2つの1次微分方程式としてそれを書くことによって、Pythonで書かれている。しかし、他の類似しているが、複雑な問題のpythonのために、簡単にこの問題を解決するためのPythonRの2階微分方程式を解くにはどうすればよいですか?

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でode(vode/bdf)を試しましたが、問題はまだあります。今、私はどのように問題を解決するにはRを確認したいと思います。誰かが私の例(基本的にコード変換!)私はRに他のものを試してみても学ぶことができるようにRでこの問題を解決する方法のを提供してくださいあれば、私はずっと義務がありますいくつかR(これは言語を学ぶのに理想的な方法ではないことがわかります)。そう私と一緒に負担してください、

私はこの質問は少し建設的価値を有することができることを理解し、私はRにちょうど初心者です!

+2

[この論文](https://journal.r-project.org/archive/2010-2/RJournal_2010-2_Soetaert~et~al.pdf)は、 「R」で 'deSolve'をどのように使用するかについて、最小限の例で半分まで説明します。しかし、私はあなたがPythonがなぜエラーを表示するのか、 'R 'を使ってあなたの問題を解決すると思う理由について考えることをお勧めします。 –

+0

私は現在、pythonがエラーを表示している理由を理解しようとしています。答えが見つからない場合は、stackoverflowのヘルプを求めます。しかし、助けを探して、私はこのポストに出くわしました:https://stackoverflow.com/questions/16973036/odd-scipy-ode-integration-error そして、ode(vode/bdf)を実装しようとしましたが、問題は解決しません。だから今しようとするR – Archimedes

+1

私はあなたが持っているエラーについての情報なしで誰もがあなたをさらに助けることは難しいと思う。あなたがリンクしている投稿は、 'scipy.integrate.ode'を使って、堅いメソッドか非堅いメソッドのどちらを使用するかを指定するよう提案しています。あなたはこれをやったと思いますか? –

答えて

2

これは、直接このコードでMでRを計算するより高速な方法はあり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() 

にPythonコードの翻訳する必要があります:

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

関連する問題