>> help beam_warming [u,u_true,x,t] = beam_warming(t_0,t_f,M,N) solves the advection equation u_t + c u_x = 0 on [0,2 pi] For initial data cos(x), we assume periodic initial data. For step-function initial, we assume u_x = 0 at the ends. >> help lax_friedrichs [u,u_true,x,t] = lax_friedrichs(t_0,t_f,M,N) solves the advection equation u_t + c u_x = 0 on [0,2 pi] For initial data cos(x), we assume periodic initial data. For step-function initial, we assume u_x = 0 at the ends. >> help lax_wendroff [u,u_true,x,t] = lax_wendroff(t_0,t_f,M,N) solves the advection equation u_t + c u_x = 0 on [0,2 pi] For initial data cos(x), we assume periodic initial data. For step-function initial, we assume u_x = 0 at the ends. I want to check that all of my codes converge properly. For example, Lax-Wendroff should have an error that decreases like O(dt^2+dx^2). But I have to be careful and take dt and dx to zero at the same rate. (This came from the truncation error analysis.) So I'll take dx/dt = some fixed number and will then check to see if the error goes to zero like dt^2. Since this would then imply that it's O(dt^2 + dx^2) at least. (Note: it could be O(dt^2 + dx^3) and we would miss the extra accuracy in dx.) First compute six solutions: >> [u1,u_true,x,t] = lax_wendroff(0,1,20,20); >> [u2,u_true,x,t] = lax_wendroff(0,1,40,40); >> [u3,u_true,x,t] = lax_wendroff(0,1,80,80); >> [u4,u_true,x,t] = lax_wendroff(0,1,160,160); >> [u5,u_true,x,t] = lax_wendroff(0,1,320,320); >> [u6,u_true,x,t] = lax_wendroff(0,1,640,640); Now check that their differences aren't at the level of round-off: >> (u1(1,21)-u2(1,41)) ans = 3.1272e-03 >> (u2(1,41)-u3(1,81)) ans = 7.6089e-04 >> (u3(1,81)-u4(1,161)) ans = 1.8709e-04 >> (u4(1,161)-u5(1,321)) ans = 4.6352e-05 >> (u5(1,321)-u6(1,641)) ans = 1.1534e-05 Now check the ratios: >> (u1(1,21)-u2(1,41))/(u2(1,41)-u3(1,81)) ans = 4.1099e+00 >> (u2(1,41)-u3(1,81))/(u3(1,81)-u4(1,161)) ans = 4.0671e+00 >> (u3(1,81)-u4(1,161))/(u4(1,161)-u5(1,321)) ans = 4.0362e+00 >> (u4(1,161)-u5(1,321))/(u5(1,321)-u6(1,641)) ans = 4.0187e+00 Since the ratios are going to 4, this shows that my Lax-Wendroff code is converging. Since I know the exact solution, I should also check that it's converging to the correct solution. As opposed to just converging. >> [u1,u_true,x,t] = beam_warming(0,1,20,20); >> [u2,u_true,x,t] = beam_warming(0,1,40,40); >> [u3,u_true,x,t] = beam_warming(0,1,80,80); >> [u4,u_true,x,t] = beam_warming(0,1,160,160); >> [u5,u_true,x,t] = beam_warming(0,1,320,320); >> [u6,u_true,x,t] = beam_warming(0,1,640,640); >> (u1(1,21)-u2(1,41)) ans = -8.5900e-03 >> (u2(1,41)-u3(1,81)) ans = -1.7115e-03 >> (u3(1,81)-u4(1,161)) ans = -3.7604e-04 >> (u4(1,161)-u5(1,321)) ans = -8.7761e-05 >> (u1(1,21)-u2(1,41))/(u2(1,41)-u3(1,81)) ans = 5.0191e+00 >> (u2(1,41)-u3(1,81))/(u3(1,81)-u4(1,161)) ans = 4.5512e+00 >> (u3(1,81)-u4(1,161))/(u4(1,161)-u5(1,321)) ans = 4.2849e+00 >> (u4(1,161)-u5(1,321))/(u5(1,321)-u6(1,641)) ans = 4.1446e+00 Since the ratios are going to 4, this shows that my Beam-warming code is converging. Since I know the exact solution, I should also check that it's converging to the correct solution. As opposed to just converging. >> [u1,u_true,x,t] = lax_friedrichs(0,1,20,20); >> [u2,u_true,x,t] = lax_friedrichs(0,1,40,40); >> [u3,u_true,x,t] = lax_friedrichs(0,1,80,80); >> [u3,u_true,x,t] = lax_friedrichs(0,1,80,80); >> [u4,u_true,x,t] = lax_friedrichs(0,1,160,160); >> [u5,u_true,x,t] = lax_friedrichs(0,1,320,320);; >> [u6,u_true,x,t] = lax_friedrichs(0,1,640,640); >> (u1(1,21)-u2(1,41))/(u2(1,41)-u3(1,81)) ans = 1.4616e+00 >> (u2(1,41)-u3(1,81))/(u3(1,81)-u4(1,161)) ans = 1.7235e+00 >> (u3(1,81)-u4(1,161))/(u4(1,161)-u5(1,321)) ans = 1.8596e+00 >> (u4(1,161)-u5(1,321))/(u5(1,321)-u6(1,641)) ans = 1.9292e+00 Since the ratios are going to 2, this shows that my Lax-Friedrichs code is converging. Since I know the exact solution, I should also check that it's converging to the correct solution. As opposed to just converging.