質問するログイン新規登録

回答編集履歴

3

コード全体を再掲

2018/02/21 06:46

投稿

退会済みユーザー
answer CHANGED
@@ -20,4 +20,72 @@
20
20
  u0 += l
21
21
 
22
22
  return u0.copy()
23
+ ```
24
+
25
+ 以上を踏まえてコード全体を再掲
26
+ ```python
27
+ #各モジュールをインポート
28
+ import numpy as np
29
+ import matplotlib.pyplot as plt
30
+ %matplotlib inline
31
+
32
+ #時間経過を定義
33
+ dt_1=0.0001
34
+
35
+ #時間の初期値を入力
36
+ t0=0
37
+
38
+ #時間の最大値
39
+ t_max=10
40
+ #試行回数
41
+ trials_1=np.arange(t0,t_max,dt_1)
42
+
43
+ #関数の値を入れるオブジェクトを生成
44
+ a_points_1=[]
45
+
46
+ #関数を定義
47
+ def u(t,x,x1):
48
+ return -4*x
49
+ #x'の式
50
+ def y(t,x,x1):
51
+ return x1
52
+
53
+ #runge-kuttaをtrials回実行
54
+ #結果をa_pointsに入れる
55
+ def rp():
56
+ y0 = np.array(1.0, dtype=np.float)
57
+ u0 = np.array(0.0, dtype=np.float)
58
+ for t in trials_1:
59
+ x1=RK(y0,u0,dt_1)
60
+ a_points_1.append(x1)
61
+ print(a_points_1[:3])
62
+
63
+ #runge-kuttaの実行式
64
+ #k:y, l:u
65
+ def RK(y0,u0,dt):
66
+
67
+ k1=y0*dt
68
+ l1=u0*dt
69
+
70
+ k2=(u0+l1*0.5)*dt
71
+ l2=-4*(y0+k1*0.5)*dt
72
+
73
+ k3=(u0+l2*0.5)*dt
74
+ l3=-4*(y0+k2*0.5)*dt
75
+
76
+ k4=(u0+l3)*dt
77
+ l4=-4*(y0+k3)*dt
78
+
79
+ k=(k1+2*k2+2*k3+k4)/6
80
+ l=(l1+2*l2+2*l3+l4)/6
81
+
82
+ y0+=k
83
+ u0+=l
84
+
85
+ return u0.copy() # もしくはfloat(u0)
86
+ #このu0の値をfor文で繰り返す際に更新していきたい
87
+ #現状では初期値のu0=0が常に代入されて、同じ計算結果が返ってくる
88
+
89
+ #プログラムを実行
90
+ rp()
23
91
  ```

2

修正

2018/02/21 06:46

投稿

退会済みユーザー
answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  return u0
16
16
  ```
17
- を、次のようにしてください。
17
+ を、次のようにしてください(LouiS0616さんのコメントを受けて修正)
18
18
  ```Python
19
19
  y0 += k
20
20
  u0 += l

1

修正

2018/02/21 05:10

投稿

退会済みユーザー
answer CHANGED
@@ -7,7 +7,17 @@
7
7
  ```
8
8
 
9
9
  これを```t,y0,u0=0,1,0```の代わりに使ってください。
10
- それから、returnの部分としておく必要があるはずです。
10
+ それから、値を更新する部分
11
11
  ```Python
12
+ y0=y0+k
13
+ u0=u0+l
14
+
15
+ return u0
16
+ ```
17
+ を、次のようにしてください。
18
+ ```Python
19
+ y0 += k
20
+ u0 += l
21
+
12
22
  return u0.copy()
13
23
  ```