def convergence_rate(): """What is the convergence rate of the Euler-Cromer method?""" from vib_undamped import convergence_rates def solver_wrapper(I, w, dt, T): # convergence_rates demands a solver that returns u, t u, v, t = solver(I, w, dt, T) return u, t def solver_ic_fix_wrapper(I, w, dt, T): # convergence_rates demands a solver that returns u, t u, v, t = solver(I, w, dt, T) return u, t def solver_adjust_w_wrapper(I, w, dt, T): # convergence_rates demands a solver that returns u, t u, v, t = solver_adjust_w(I, w, dt, T, True) return u, t # Plain Euler-Cromer r = convergence_rates(8, solver_wrapper) print(round(r[-1], 1)) # Does it help to fix the initia condition? r = convergence_rates(8, solver_ic_fix_wrapper) print(round(r[-1], 1)) # Adjusted w r = convergence_rates(8, solver_adjust_w_wrapper) print(round(r[-1], 1))
def convergence_rate(): """What is the convergence rate of the Euler-Cromer method?""" from vib_undamped import convergence_rates def solver_wrapper(I, w, dt, T): # convergence_rates demands a solver that returns u, t u, v, t = solver(I, w, dt, T) return u, t def solver_ic_fix_wrapper(I, w, dt, T): # convergence_rates demands a solver that returns u, t u, v, t = solver(I, w, dt, T) return u, t def solver_adjust_w_wrapper(I, w, dt, T): # convergence_rates demands a solver that returns u, t u, v, t = solver_adjust_w(I, w, dt, T, True) return u, t # Plain Euler-Cromer r = convergence_rates(8, solver_wrapper) print round(r[-1], 1) # Does it help to fix the initia condition? r = convergence_rates(8, solver_ic_fix_wrapper) print round(r[-1], 1) # Adjusted w r = convergence_rates(8, solver_adjust_w_wrapper) print round(r[-1], 1)
def test_convergence(): """Verify 2nd-order convergence.""" from vib_undamped import convergence_rates def wrapped_solver(I, w, dt, T): u, t, v, t_v = solver(I, w, dt, T) return u, t r = convergence_rates(8, wrapped_solver, 8) print r assert abs(r[-1] - 2) < 1E-5
from vib_undamped import (zeros, linspace, convergence_rates, main) def solver(I, w, dt, T, return_v=False): """ Solve u'=v, v'=-w**2*u for t in (0,T], u(0)=I and v(0)=0, by the velocity Verlet method with time step dt. """ dt = float(dt) Nt = int(round(T / dt)) u = zeros(Nt + 1) v = zeros(Nt + 1) t = linspace(0, Nt * dt, Nt + 1) u[0] = I v[0] = 0 for n in range(Nt): u[n + 1] = u[n] + v[n] * dt - 0.5 * dt**2 * w**2 * u[n] v[n + 1] = v[n] - 0.5 * dt * w**2 * (u[n] + u[n + 1]) if return_v: return u, v, t else: # Return just u and t as in the vib_undamped.py's solver return u, t if __name__ == '__main__': main(solver_function=solver) raw_input() print convergence_rates(m=5, solver_function=solver)
zeros, linspace, convergence_rates, main) def solver(I, w, dt, T, return_v=False): """ Solve u'=v, v'=-w**2*u for t in (0,T], u(0)=I and v(0)=0, by the velocity Verlet method with time step dt. """ dt = float(dt) Nt = int(round(T/dt)) u = zeros(Nt+1) v = zeros(Nt+1) t = linspace(0, Nt*dt, Nt+1) u[0] = I v[0] = 0 for n in range(Nt): u[n+1] = u[n] + v[n]*dt - 0.5*dt**2*w**2*u[n] v[n+1] = v[n] - 0.5*dt*w**2*(u[n] + u[n+1]) if return_v: return u, v, t else: # Return just u and t as in the vib_undamped.py's solver return u, t if __name__ == '__main__': main(solver_function=solver) raw_input() print convergence_rates(m=5, solver_function=solver)