| 220 | yb_changes = [] |
| 221 | |
| 222 | def rk4(x0, y0, f): |
| 223 | ds = 0.01 |
| 224 | stotal = 0 |
| 225 | xi = x0 |
| 226 | yi = y0 |
| 227 | xb, yb = self.blank_pos(xi, yi) |
| 228 | xf_traj = [] |
| 229 | yf_traj = [] |
| 230 | while check(xi, yi): |
| 231 | xf_traj.append(xi) |
| 232 | yf_traj.append(yi) |
| 233 | try: |
| 234 | k1x, k1y = f(xi, yi) |
| 235 | k2x, k2y = f(xi + 0.5 * ds * k1x, yi + 0.5 * ds * k1y) |
| 236 | k3x, k3y = f(xi + 0.5 * ds * k2x, yi + 0.5 * ds * k2y) |
| 237 | k4x, k4y = f(xi + ds * k3x, yi + ds * k3y) |
| 238 | except IndexError: |
| 239 | break |
| 240 | xi += ds * (k1x + 2 * k2x + 2 * k3x + k4x) / 6.0 |
| 241 | yi += ds * (k1y + 2 * k2y + 2 * k3y + k4y) / 6.0 |
| 242 | if not check(xi, yi): |
| 243 | break |
| 244 | stotal += ds |
| 245 | new_xb, new_yb = self.blank_pos(xi, yi) |
| 246 | if new_xb != xb or new_yb != yb: |
| 247 | if self.blank[new_yb, new_xb] == 0: |
| 248 | self.blank[new_yb, new_xb] = 1 |
| 249 | xb_changes.append(new_xb) |
| 250 | yb_changes.append(new_yb) |
| 251 | xb = new_xb |
| 252 | yb = new_yb |
| 253 | else: |
| 254 | break |
| 255 | if stotal > 2: |
| 256 | break |
| 257 | return stotal, xf_traj, yf_traj |
| 258 | |
| 259 | sf, xf_traj, yf_traj = rk4(x0, y0, f) |
| 260 | sb, xb_traj, yb_traj = rk4(x0, y0, g) |