def problem_relative_error(): # Figure 3 in the lab. a, b, ya = 0.0, 2.0, 0.0 def f(x, ya): return -2.0 + 2.0 * x + 2.0 * np.exp(x) def ode_f(x, y): return np.array([1.0 * y - 2.0 * x + 4.0]) N = np.array([10, 20, 40, 80, 160]) # Number of subintervals Euler_sol, Mid_sol, RK4_sol = np.zeros(len(N)), np.zeros(len(N)), np.zeros(len(N)) for j in range(len(N)): Euler_sol[j] = euler(ode_f, ya, a, b, N[j])[-1] Mid_sol[j] = midpoint(ode_f, ya, a, b, N[j])[-1] RK4_sol[j] = RK4(ode_f, ya, a, b, N[j])[-1] h = 2.0 / N plt.loglog(h, abs((Euler_sol - f(2.0, 0.0)) / f(2.0, 0.0)), "-b", label="Euler method", linewidth=2.0) plt.loglog(h, abs((Mid_sol - f(2.0, 0.0)) / f(2.0, 0.0)), "-g", label="Midpoint method", linewidth=2.0) plt.loglog(h, abs((RK4_sol - f(2.0, 0.0)) / f(2.0, 0.0)), "-k", label="Runge Kutta 4", linewidth=2.0) plt.xlabel("$h$", fontsize=16) plt.ylabel("Relative Error", fontsize=16) # plt.title("loglog plot of relative error in approximation of $y(2)$.") plt.legend(loc="best") # plt.savefig('relative_error.pdf') plt.show() plt.clf()
def Fig3(): a, b, ya = 0., 2., 0. def f(x,ya): return -2. + 2.*x + 2.*np.exp(x) def ode_f(x,y): return np.array([1.*y -2.*x + 4.]) N = np.array([10,20,40,80,160]) # Number of subintervals Euler_sol, Mid_sol, RK4_sol = np.zeros(len(N)), np.zeros(len(N)), np.zeros(len(N)) for j in range(len(N)): Euler_sol[j] = euler(ode_f,ya,a,b,N[j])[-1] Mid_sol[j] = midpoint(ode_f,ya,a,b,N[j])[-1] RK4_sol[j] = RK4(ode_f,ya,a,b,N[j])[-1] h = 2./N plt.loglog(h, abs(( Euler_sol - f(2.,0.))/f(2.,0.) ), '-b', label="Euler method" , linewidth=2.) plt.loglog(h, abs(( Mid_sol - f(2.,0.))/f(2.,0.) ), '-g', label="Midpoint method", linewidth=2. ) plt.loglog(h, abs(( RK4_sol - f(2.,0.))/f(2.,0.) ), '-k', label="Runge Kutta 4" , linewidth=2. ) plt.xlabel("$h$", fontsize=16) plt.ylabel("Relative Error", fontsize = 16) # plt.title("loglog plot of relative error in approximation of $y(2)$.") plt.legend(loc='best') # plt.savefig('Fig3.pdf') plt.show() plt.clf()
def Fig4(): a, b, ya = 0., 8., 1. from math import exp, sin, cos def f(x): return exp(sin(x)) def ode_f(x, y): return np.array([y * cos(x)]) # Number of subintervals N1 = np.array([ 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 20480, 40960, 81920, 163840, 327680, 655360, 1310720 ]) N2, N3 = N1[:12], N1[:10] Euler_sol, Mid_sol, RK4_sol = np.zeros(len(N1)), np.zeros( len(N2)), np.zeros(len(N3)) for j in range(len(N1)): Euler_sol[j] = euler(ode_f, ya, a, b, N1[j])[-1] for j in range(len(N2)): Mid_sol[j] = midpoint(ode_f, ya, a, b, N2[j])[-1] for j in range(len(N3)): RK4_sol[j] = RK4(ode_f, ya, a, b, N3[j])[-1] # Data for a Table? euler_error = np.concatenate((abs( (Euler_sol - f(b)) / f(b))[:, np.newaxis], N1[:, np.newaxis]), axis=1) rk4_error = np.concatenate((abs( (RK4_sol - f(b)) / f(b))[:, np.newaxis], 4 * N3[:, np.newaxis]), axis=1) # Plot number of function evaluations versus relative error fig = plt.figure() plt.loglog(N1, abs((Euler_sol - f(b)) / f(b)), '-b', label="Euler method", linewidth=2.) plt.loglog(2 * N2, abs((Mid_sol - f(b)) / f(b)), '-g', label="Midpoint method", linewidth=2.) plt.loglog(4 * N3, abs((RK4_sol - f(b)) / f(b)), '-k', label="Runge Kutta 4", linewidth=2.) ax = fig.add_subplot(111) plt.ylabel("Error", fontsize=16) plt.xlabel("Functional Evaluations", fontsize=16) ax.legend(loc='best') # ax.invert_xaxis() # plt.savefig('Fig4.pdf') plt.show() plt.clf()
def Exercise3(): a, b, ya = 0., 2., 0. def f(x, ya): return 4. - 2. * x + (ya - 4.) * np.exp(-x) def ode_f(x, y): return np.array([-1. * y - 2. * x + 2.]) N = np.array([10, 20, 40, 80, 160]) # Number of subintervals Euler_sol, Mid_sol, RK4_sol = np.zeros(len(N)), np.zeros(len(N)), np.zeros( len(N)) for j in range(len(N)): Euler_sol[j] = euler(ode_f, ya, a, b, N[j])[-1] Mid_sol[j] = midpoint(ode_f, ya, a, b, N[j])[-1] RK4_sol[j] = RK4(ode_f, ya, a, b, N[j])[-1] # print Euler_sol, Mid_sol, RK4_sol # print "Answer = ", f(2.,0.) h = 2. / N plt.loglog(h, abs((Euler_sol - f(2., 0.)) / f(2., 0.)), '-b', label="Euler method", linewidth=2.) plt.loglog(h, abs((Mid_sol - f(2., 0.)) / f(2., 0.)), '-g', label="Midpoint method", linewidth=2.) plt.loglog(h, abs((RK4_sol - f(2., 0.)) / f(2., 0.)), '-k', label="Runge Kutta 4", linewidth=2.) plt.xlabel("$h$", fontsize=16) plt.ylabel("Relative Error", fontsize=16) plt.title("loglog plot of relative error in approximation of $y(2)$.") plt.legend(loc='best') # plt.savefig("Exercise3.pdf") # plt.show() plt.clf()
def problem_relative_error(): # Figure 3 in the lab. a, b, ya = 0., 2., 0. def f(x, ya): return -2. + 2. * x + 2. * np.exp(x) def ode_f(x, y): return np.array([1. * y - 2. * x + 4.]) N = np.array([10, 20, 40, 80, 160]) # Number of subintervals Euler_sol, Mid_sol, RK4_sol = np.zeros(len(N)), np.zeros(len(N)), np.zeros( len(N)) for j in range(len(N)): Euler_sol[j] = euler(ode_f, ya, a, b, N[j])[-1] Mid_sol[j] = midpoint(ode_f, ya, a, b, N[j])[-1] RK4_sol[j] = RK4(ode_f, ya, a, b, N[j])[-1] h = 2. / N plt.loglog(h, abs((Euler_sol - f(2., 0.)) / f(2., 0.)), '-b', label="Euler method", linewidth=2.) plt.loglog(h, abs((Mid_sol - f(2., 0.)) / f(2., 0.)), '-g', label="Midpoint method", linewidth=2.) plt.loglog(h, abs((RK4_sol - f(2., 0.)) / f(2., 0.)), '-k', label="Runge Kutta 4", linewidth=2.) plt.xlabel("$h$", fontsize=16) plt.ylabel("Relative Error", fontsize=16) # plt.title("loglog plot of relative error in approximation of $y(2)$.") plt.legend(loc='best') # plt.savefig('relative_error.pdf') plt.show() plt.clf()
def Fig4(): a, b, ya = 0., 8., 1. from math import exp, sin, cos def f(x): return exp(sin(x)) def ode_f(x,y): return np.array([y*cos(x)]) # Number of subintervals N1 = np.array([10,20,40,80,160,320,640,1280,2560,5120, 10240,20480,40960,81920,163840,327680,655360,1310720]) N2, N3 = N1[:12],N1[:10] Euler_sol, Mid_sol, RK4_sol = np.zeros(len(N1)), np.zeros(len(N2)), np.zeros(len(N3)) for j in range(len(N1)): Euler_sol[j] = euler(ode_f,ya,a,b,N1[j])[-1] for j in range(len(N2)): Mid_sol[j] = midpoint(ode_f,ya,a,b,N2[j])[-1] for j in range(len(N3)): RK4_sol[j] = RK4(ode_f,ya,a,b,N3[j])[-1] # Data for a Table? euler_error = np.concatenate((abs(( Euler_sol - f(b))/f(b) )[:,np.newaxis], N1[:,np.newaxis]),axis=1) rk4_error = np.concatenate((abs(( RK4_sol - f(b))/f(b) )[:,np.newaxis], 4*N3[:,np.newaxis]),axis=1) # Plot number of function evaluations versus relative error fig = plt.figure() plt.loglog(N1, abs(( Euler_sol - f(b))/f(b) ),'-b', label="Euler method" , linewidth=2.) plt.loglog(2*N2, abs(( Mid_sol - f(b))/f(b) ), '-g', label="Midpoint method", linewidth=2. ) plt.loglog(4*N3, abs(( RK4_sol - f(b))/f(b) ), '-k', label="Runge Kutta 4" , linewidth=2. ) ax = fig.add_subplot(111) plt.ylabel("Error", fontsize=16) plt.xlabel("Functional Evaluations", fontsize = 16) ax.legend(loc='best') # ax.invert_xaxis() # plt.savefig('Fig4.pdf') plt.show() plt.clf()