# -*- coding: UTF-8 -*- from math import * import numpy as np ############################################ # ルンゲ・クッタ法 dx/dt=f(t,x) # time : 現在の時間 # h : 時間刻み幅 # x : 現在の状態 # dx : 微係数(f(t,x):subで計算する) # g : 作業域(g[4][n]) # n : 微分方程式の次数 # sub : 微係数を計算する関数の名前 # return : time+h # coded by Y.Suganuma ############################################ def rkg(time, h, x, dx, g, n, sub) : h2 = 0.5 * h sub(time, x, dx) for i1 in range(0, n) : g[0][i1] = h * dx[i1] time += h2 for i1 in range(0, n) : g[1][i1] = x[i1] + 0.5 * g[0][i1] sub(time, g[1], dx) for i1 in range(0, n) : g[1][i1] = h * dx[i1] for i1 in range(0, n) : g[2][i1] = x[i1] + 0.5 * g[1][i1] sub(time, g[2], dx) for i1 in range(0, n) : g[2][i1] = h * dx[i1] time += h2 for i1 in range(0, n) : g[3][i1] = x[i1] + g[2][i1] sub(time, g[3], dx) for i1 in range(0, n) : g[3][i1] = h * dx[i1] for i1 in range(0, n) : x[i1] = x[i1] + (g[0][i1] + 2.0 * g[1][i1] + 2.0 * g[2][i1] + g[3][i1]) / 6.0 return time ---------------------------------- # -*- coding: UTF-8 -*- import numpy as np from math import * from function import rkg ############################################ # 微分方程式(ルンゲ・クッタ法) # 例:d2x/dt+3dx/dt+2x=1 # coded by Y.Suganuma ############################################ # 微係数の計算 */ def snx(time, x, dx) : dx[0] = x[1] dx[1] = -2.0 * x[0] - 3.0 * x[1] + 1.0 # 初期設定 n = 2 x = np.array([0.0, 0.0], np.float) dx = np.empty(n, np.float) g = np.empty((4, n), np.float) time = 0.0 h = 0.01 # 計算と出力 for i1 in range(0, 101) : print("time = " + str(time) + ", x = " + str(x[0])) time = rkg(time, h, x, dx, g, n, snx)