回答編集履歴

3

コード全体を再掲

2018/02/21 06:46

投稿

退会済みユーザー
test CHANGED
@@ -43,3 +43,139 @@
43
43
  return u0.copy()
44
44
 
45
45
  ```
46
+
47
+
48
+
49
+ 以上を踏まえてコード全体を再掲
50
+
51
+ ```python
52
+
53
+ #各モジュールをインポート
54
+
55
+ import numpy as np
56
+
57
+ import matplotlib.pyplot as plt
58
+
59
+ %matplotlib inline
60
+
61
+
62
+
63
+ #時間経過を定義
64
+
65
+ dt_1=0.0001
66
+
67
+
68
+
69
+ #時間の初期値を入力
70
+
71
+ t0=0
72
+
73
+
74
+
75
+ #時間の最大値
76
+
77
+ t_max=10
78
+
79
+ #試行回数
80
+
81
+ trials_1=np.arange(t0,t_max,dt_1)
82
+
83
+
84
+
85
+ #関数の値を入れるオブジェクトを生成
86
+
87
+ a_points_1=[]
88
+
89
+
90
+
91
+ #関数を定義
92
+
93
+ def u(t,x,x1):
94
+
95
+ return -4*x
96
+
97
+ #x'の式
98
+
99
+ def y(t,x,x1):
100
+
101
+ return x1
102
+
103
+
104
+
105
+ #runge-kuttaをtrials回実行
106
+
107
+ #結果をa_pointsに入れる
108
+
109
+ def rp():
110
+
111
+ y0 = np.array(1.0, dtype=np.float)
112
+
113
+ u0 = np.array(0.0, dtype=np.float)
114
+
115
+ for t in trials_1:
116
+
117
+ x1=RK(y0,u0,dt_1)
118
+
119
+ a_points_1.append(x1)
120
+
121
+ print(a_points_1[:3])
122
+
123
+
124
+
125
+ #runge-kuttaの実行式
126
+
127
+ #k:y, l:u
128
+
129
+ def RK(y0,u0,dt):
130
+
131
+
132
+
133
+ k1=y0*dt
134
+
135
+ l1=u0*dt
136
+
137
+
138
+
139
+ k2=(u0+l1*0.5)*dt
140
+
141
+ l2=-4*(y0+k1*0.5)*dt
142
+
143
+
144
+
145
+ k3=(u0+l2*0.5)*dt
146
+
147
+ l3=-4*(y0+k2*0.5)*dt
148
+
149
+
150
+
151
+ k4=(u0+l3)*dt
152
+
153
+ l4=-4*(y0+k3)*dt
154
+
155
+
156
+
157
+ k=(k1+2*k2+2*k3+k4)/6
158
+
159
+ l=(l1+2*l2+2*l3+l4)/6
160
+
161
+
162
+
163
+ y0+=k
164
+
165
+ u0+=l
166
+
167
+
168
+
169
+ return u0.copy() # もしくはfloat(u0)
170
+
171
+ #このu0の値をfor文で繰り返す際に更新していきたい
172
+
173
+ #現状では初期値のu0=0が常に代入されて、同じ計算結果が返ってくる
174
+
175
+
176
+
177
+ #プログラムを実行
178
+
179
+ rp()
180
+
181
+ ```

2

修正

2018/02/21 06:46

投稿

退会済みユーザー
test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ```
32
32
 
33
- を、次のようにしてください。
33
+ を、次のようにしてください(LouiS0616さんのコメントを受けて修正)
34
34
 
35
35
  ```Python
36
36
 

1

修正

2018/02/21 05:10

投稿

退会済みユーザー
test CHANGED
@@ -16,9 +16,29 @@
16
16
 
17
17
  これを```t,y0,u0=0,1,0```の代わりに使ってください。
18
18
 
19
- それから、returnの部分としておく必要があるはずです。
19
+ それから、値を更新する部分
20
20
 
21
21
  ```Python
22
+
23
+ y0=y0+k
24
+
25
+ u0=u0+l
26
+
27
+
28
+
29
+ return u0
30
+
31
+ ```
32
+
33
+ を、次のようにしてください。
34
+
35
+ ```Python
36
+
37
+ y0 += k
38
+
39
+ u0 += l
40
+
41
+
22
42
 
23
43
  return u0.copy()
24
44