Buckets:
| from numpy import * | |
| def solver(I, a, T, dt, theta): | |
| """Solve u'=-a*u, u(0)=I, for t in (0,T] with steps of dt.""" | |
| dt = float(dt) # avoid integer division | |
| Nt = int(round(T/dt)) # no of time intervals | |
| T = Nt*dt # adjust T to fit time step dt | |
| u = zeros(Nt+1) # array of u[n] values | |
| t = linspace(0, T, Nt+1) # time mesh | |
| u[0] = I # assign initial condition | |
| for n in range(0, Nt): # n=0,1,...,Nt-1 | |
| u[n+1] = (1 - (1-theta)*a*dt)/(1 + theta*dt*a)*u[n] | |
| return u, t | |
| def exact_solution(t, I, a): | |
| return I*exp(-a*t) | |
| from matplotlib.pyplot import * | |
| def plot_numerical_and_exact(theta, I, a, T, dt): | |
| """Compare the numerical and exact solution in a plot.""" | |
| u, t = solver(I=I, a=a, T=T, dt=dt, theta=theta) | |
| t_e = linspace(0, T, 1001) # fine mesh for u_e | |
| u_e = exact_solution(t_e, I, a) | |
| plot(t, u, 'r--o', # red dashes w/circles | |
| t_e, u_e, 'b-') # blue line for exact sol. | |
| legend(['numerical', 'exact']) | |
| xlabel('t') | |
| ylabel('u') | |
| title('theta=%g, dt=%g' % (theta, dt)) | |
| savefig('plot_%s_%g.png' % (theta, dt)) | |
| def test_solver_three_steps(): | |
| """Compare three steps with known manual computations.""" | |
| theta = 0.8; a = 2; I = 0.1; dt = 0.8 | |
| u_by_hand = array([I, | |
| 0.0298245614035, | |
| 0.00889504462912, | |
| 0.00265290804728]) | |
| Nt = 3 # number of time steps | |
| u, t = solver(I=I, a=a, T=Nt*dt, dt=dt, theta=theta) | |
| tol = 1E-15 # tolerance for comparing floats | |
| diff = abs(u - u_by_hand).max() | |
| success = diff <= tol | |
| assert success | |
| test_solver_three_steps() | |
| plot_numerical_and_exact(I=1, a=2, T=8, dt=0.8, theta=1) | |
| show() | |
Xet Storage Details
- Size:
- 1.79 kB
- Xet hash:
- d630bf44074c9f9b47d7b84bfbff3c6f75cc1ebc5218316333318b55ca67643b
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.