Links to .m source file and .out output file, click to read test_mtx.m source file test_mtx_m.out output file
Links to .m source file and .png output, shown below stiff1.m source file using ode23 stiff1_m.png plot output % stiff1.m using ode23 % y1' = y2 y2' = (1-y1^2)*y2-y1 function stiff1() [t,y]=ode23(@vdp, [0 20], [2; 0]); plot(t,y(:,1),'-o',t,y(:,2),'-o') title('Solution of van der Pol Equation (\mu = 1) with ODE23'); xlabel('Time t'); ylabel('Solution y'); legend('y_1','y_2') function dydt = vdp(t, y) dydt = [y(2); (1-y(1)^2)*y(2)-y(1)]; end % vdp end % stiff1 Links to .m source file and .png output, shown below stiff.m source file using ode15s stiff_m.png plot output % stiff.m using ode15s % y1' = y2 y2' = 1000*(1-y1^2)*y2-y1 function stiff() [t,y]=ode15s(@vdp1000, [0 3000], [2 0]); plot(t,y(:,1),'-o') title('Solution with(\mu = 1000) with ODE15'); xlabel('Time t'); ylabel('Solution y'); legend('y_1','y_2') function dydt = vdp1000(t, y) dydt = [y(2); 1000*(1-y(1)^2)*y(2)-y(1)]; end % vdp1000 end % stiff Links to .m source file and .png output, shown below difeq1.m ODE definition, first order run_difeq1.m source file using ode45 difeq1_m.png plot output % difeq1.m simple ODE function dydt=difeq1(t,y) dydt = t*t + 2.0*t + 3.0; % run_difeq1.m simple first order t_range = [0 1]; [t,y] = ode45(@difeq1, t_range, [0]); size(t); size(y); for i=1:20 j=(i-1.0)/19.0; t2(i) = j; y2(i) = j*j*j/3.0 + j*j + 3.0*j; end plot(t, y, t2, y2, '--'); xlabel('time'); ylabel('y'); title('ODE solution and exact solution'); Links to .m source file and .png output, shown below difeq1.m ODE definition, first order run_difeq1.m source file using ode45 difeq1_m.png plot output % difeq2.m second order function dydt=difeq2(t,y) dydt = [y(2);-y(1)]; % dy^2 = -y y=sin(t) % run_difeq2.m second order t_range = [0 6.28]; [t,y] = ode45(@difeq2, t_range, [0 1.0]); size(t); size(y); for i=1:64 j=(i-1.0)/10.0; t2(i) = j; y2(i) = sin(j); end plot(t, y(:,1), t, y(:,2), '.', t2, y2, '--'); xlabel('time'); ylabel('y'); title('ODE solution and first, and exact solution');
Links to .m source file and .png output, shown below driver_cg.m source file to be timed test_driver_cg.m source file various n test_driver_cg_m.out timing output various n driver_cg4.png one plot output function driver_cg(N,fid) h = 1 / (N+1); x = [h : h : 1-h]; y = x; [X, Y] = ndgrid(x,y); F = (-2*pi^2) * (cos(2*pi*X).*(sin(pi*Y)).^2 + (sin(pi*X)).^2.*cos(2*pi*Y)); b = h^2 * F(:); clear X Y F; tic; A = setupA(N); tol = 1.0e-6; maxit = 99999; u = zeros(N^2,1); [u,flag,relres,iter,resvec] = pcg(A,b,tol,maxit,[],[],u); Uint = reshape(u, [N N]); % N.B.: Uint has only solutions on interior points timesec = toc; % append boundary to x, y, and to U: x = [0 x 1]; y = [0 y 1]; [X, Y] = ndgrid(x,y); U = zeros(size(X)); U(2:end-1,2:end-1) = Uint; % plot numerical solution: figure; H = mesh(X,Y,U); xlabel('x'); ylabel('y'); zlabel('u'); % compute and plot numerical error: Utrue = (sin(pi*X)).^2 .* (sin(pi*Y)).^2; E = U - Utrue; figure; H = mesh(X,Y,E); xlabel('x'); ylabel('y'); zlabel('u-u_h'); % compute L^inf norm of error and print: enorminf = max(abs(E(:))); fprintf(fid,'N = %5d\n', N); fprintf(fid,'tol = %10.1e, maxit = %d\n', tol, maxit); fprintf(fid,'flag = %1d, iter = %d, relres = %24.16e\n', flag, iter, relres); fprintf(fid,'h = %24.16e\n', h); fprintf(fid,'h^2 = %24.16e\n', h^2); fprintf(fid,'enorminf = %24.16e\n', enorminf); fprintf(fid,'C = enorminf / h^2 = %24.16e\n', (enorminf/h^2)); fprintf(fid,'wall clock time = %10.2f seconds\n', timesec); function A = setupA(N) I = speye(N); s = [-1*ones(1,N-1) 2*ones(1,N) -1*ones(1,N-1)]'; i = [2:N 1:N 1:N-1]'; j = [1:N-1 1:N 2:N ]'; T = sparse(i,j,s); A = kron(I,T) + kron(T,I); % test_driver_cg.m Gobberts driver_cg.m function test_driver_cg fid=fopen('test_driver_cg_m.out','w'); N=4; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=8; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=16; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=32; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=64; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=128; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=256; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=512; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); N=1024; fprintf(fid,'test_driver_cg running, N=%d \n', N); driver_cg(N,fid); fprintf(fid,'driver_cg ran, N=%d \n\n', N); fprintf(fid,'test_driver_cg finished \n'); end % test_driver_cg test_driver_cg running, N=4 N = 4 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 3, relres = 4.0645864755649299e-16 h = 2.0000000000000001e-01 h^2 = 4.0000000000000008e-02 enorminf = 1.1672672560746400e-01 C = enorminf / h^2 = 2.9181681401865993e+00 wall clock time = 0.18 seconds driver_cg ran, N=4 test_driver_cg running, N=8 N = 8 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 10, relres = 1.3833872844782684e-15 h = 1.1111111111111110e-01 h^2 = 1.2345679012345678e-02 enorminf = 3.9152467804694280e-02 C = enorminf / h^2 = 3.1713498921802370e+00 wall clock time = 0.02 seconds driver_cg ran, N=8 test_driver_cg running, N=16 N = 16 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 24, relres = 6.6499448293299502e-07 h = 5.8823529411764705e-02 h^2 = 3.4602076124567475e-03 enorminf = 1.1267467797972608e-02 C = enorminf / h^2 = 3.2562981936140836e+00 wall clock time = 0.02 seconds driver_cg ran, N=16 test_driver_cg running, N=32 N = 32 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 48, relres = 5.5636640914657905e-07 h = 3.0303030303030304e-02 h^2 = 9.1827364554637292e-04 enorminf = 3.0127765546470453e-03 C = enorminf / h^2 = 3.2809136680106321e+00 wall clock time = 0.02 seconds driver_cg ran, N=32 test_driver_cg running, N=64 N = 64 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 96, relres = 7.0188563830089490e-07 h = 1.5384615384615385e-02 h^2 = 2.3668639053254440e-04 enorminf = 7.7810619700791062e-04 C = enorminf / h^2 = 3.2874986823584220e+00 wall clock time = 0.04 seconds driver_cg ran, N=64 test_driver_cg running, N=128 N = 128 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 192, relres = 9.3340277731590903e-07 h = 7.7519379844961239e-03 h^2 = 6.0092542515473829e-05 enorminf = 1.9764834768531969e-04 C = enorminf / h^2 = 3.2890661538314050e+00 wall clock time = 0.24 seconds driver_cg ran, N=128 test_driver_cg running, N=256 N = 256 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 387, relres = 8.9244309654496858e-07 h = 3.8910505836575876e-03 h^2 = 1.5140274644582053e-05 enorminf = 4.9797438427923169e-05 C = enorminf / h^2 = 3.2890710107258974e+00 wall clock time = 1.94 seconds driver_cg ran, N=256 test_driver_cg running, N=512 N = 512 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 783, relres = 9.0704526218887027e-07 h = 1.9493177387914229e-03 h^2 = 3.7998396467669058e-06 enorminf = 1.2494278882391185e-05 C = enorminf / h^2 = 3.2881068792000065e+00 wall clock time = 14.70 seconds driver_cg ran, N=512 test_driver_cg running, N=1024 N = 1024 tol = 1.0e-06, maxit = 99999 flag = 0, iter = 1581, relres = 9.3989188600245957e-07 h = 9.7560975609756097e-04 h^2 = 9.5181439619274241e-07 enorminf = 3.1266064945967287e-06 C = enorminf / h^2 = 3.2848909483856881e+00 wall clock time = 142.16 seconds driver_cg ran, N=1024 test_driver_cg finishedsome timing, using ge rather than cg
Links to .m source file and .png output, shown below driver_ge.m source file to be timed test_driver_ge.m source file various n test_driver_ge_m.out timing output various n driver_ge4.png one plot output function driver_ge(N,fid) h = 1 / (N+1); x = [h : h : 1-h]; y = x; [X, Y] = ndgrid(x,y); F = (-2*pi^2) * (cos(2*pi*X).*(sin(pi*Y)).^2 + (sin(pi*X)).^2.*cos(2*pi*Y)); b = h^2 * F(:); clear X Y F; tic; A = setupA(N); u = A \ b; Uint = reshape(u, [N N]); % N.B.: Uint has only solutions on interior points timesec = toc; % append boundary to x, y, and to U: x = [0 x 1]; y = [0 y 1]; [X, Y] = ndgrid(x,y); U = zeros(size(X)); U(2:end-1,2:end-1) = Uint; % plot numerical solution: figure; plot3(X,Y,U); view(27.5,20); xlabel('x'); ylabel('y'); zlabel('u'); % compute and plot numerical error: Utrue = (sin(pi*X)).^2 .* (sin(pi*Y)).^2; E = U - Utrue; figure; plot3(X,Y,E); view(8.5,2); xlabel('x'); ylabel('y'); zlabel('u-u_h'); % compute L^inf norm of error and print: enorminf = max(abs(E(:))); fprintf(fid,'N = %5d\n', N); fprintf(fid,'h = %24.16e\n', h); fprintf(fid,'h^2 = %24.16e\n', h^2); fprintf(fid,'enorminf = %24.16e\n', enorminf); fprintf(fid,'C = enorminf / h^2 = %24.16e\n', (enorminf/h^2)); fprintf(fid,'wall clock time = %10.2f seconds\n', timesec); function A = setupA(N) I = speye(N); s = [-1*ones(1,N-1) 2*ones(1,N) -1*ones(1,N-1)]'; i = [2:N 1:N 1:N-1]'; j = [1:N-1 1:N 2:N ]'; T = sparse(i,j,s); A = kron(I,T) + kron(T,I); % test_driver_ge.m Gobberts driver_ge.m function test_driver_ge fid=fopen('test_driver_ge_m.out','w'); N=4; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=8; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=16; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=32; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=64; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=128; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=256; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=512; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); N=1024; fprintf(fid,'test_driver_ge running, N=%d \n', N); driver_ge(N,fid); fprintf(fid,'driver_ge ran, N=%d \n\n', N); fprintf(fid,'test_driver_ge finished \n'); end % test_driver_ge test_driver_ge running, N=4 N = 4 h = 2.0000000000000001e-01 h^2 = 4.0000000000000008e-02 enorminf = 1.1672672560746400e-01 C = enorminf / h^2 = 2.9181681401865993e+00 wall clock time = 0.69 seconds driver_ge ran, N=4 test_driver_ge running, N=8 N = 8 h = 1.1111111111111110e-01 h^2 = 1.2345679012345678e-02 enorminf = 3.9152467804693947e-02 C = enorminf / h^2 = 3.1713498921802099e+00 wall clock time = 0.02 seconds driver_ge ran, N=8 test_driver_ge running, N=16 N = 16 h = 5.8823529411764705e-02 h^2 = 3.4602076124567475e-03 enorminf = 1.1267474206801520e-02 C = enorminf / h^2 = 3.2563000457656393e+00 wall clock time = 0.02 seconds driver_ge ran, N=16 test_driver_ge running, N=32 N = 32 h = 3.0303030303030304e-02 h^2 = 9.1827364554637292e-04 enorminf = 3.0127943178556160e-03 C = enorminf / h^2 = 3.2809330121447653e+00 wall clock time = 0.01 seconds driver_ge ran, N=32 test_driver_ge running, N=64 N = 64 h = 1.5384615384615385e-02 h^2 = 2.3668639053254440e-04 enorminf = 7.7812147640843321e-04 C = enorminf / h^2 = 3.2875632378256299e+00 wall clock time = 0.03 seconds driver_ge ran, N=64 test_driver_ge running, N=128 N = 128 h = 7.7519379844961239e-03 h^2 = 6.0092542515473829e-05 enorminf = 1.9766136774113097e-04 C = enorminf / h^2 = 3.2892828205801603e+00 wall clock time = 0.33 seconds driver_ge ran, N=128 test_driver_ge running, N=256 N = 256 h = 3.8910505836575876e-03 h^2 = 1.5140274644582053e-05 enorminf = 4.9807274579038996e-05 C = enorminf / h^2 = 3.2897206786709465e+00 wall clock time = 0.80 seconds driver_ge ran, N=256 test_driver_ge running, N=512 N = 512 h = 1.9493177387914229e-03 h^2 = 3.7998396467669058e-06 enorminf = 1.2500832120454497e-05 C = enorminf / h^2 = 3.2898314883078901e+00 wall clock time = 3.54 seconds driver_ge ran, N=512 test_driver_ge running, N=1024 N = 1024 h = 9.7560975609756097e-04 h^2 = 9.5181439619274241e-07 enorminf = 3.1313407333755094e-06 C = enorminf / h^2 = 3.2898648580026446e+00 wall clock time = 15.39 seconds driver_ge ran, N=1024 test_driver_ge finishedA simple test of conjugate gradient
Links to .m source file and .png output, shown below (one of several versions of conjugate gradient) conjgrad.m source file to be tested test_conjgrad.m test source test_conjgrad_m.out test output % conjgrad.m solve Ax=b for x by conjugate gradient method (initial x 0 OK) % A must be symmetric positive definite for convergence % added file output of debug function [x] = conjgrad(A, b, x, tol, maxit) debug = 2; r = b - A * x; p = r; rsold = r' * r; for i = 1:maxit Ap = A * p; alpha = rsold / (p' * Ap); x = x + alpha * p; r = r - alpha * Ap; rsnew = r' * r; if(debug > 1) disp('conjgrad.m iter, rsnew =') disp(i) disp(rsnew) end % if if sqrt(rsnew) < tol break; end % if p = r + (rsnew / rsold) * p; rsold = rsnew; end % end for if(debug > 0) disp('conjgrad final iter, rsnew =') disp(i) disp(rsnew) end % if end % conjgrad % test_conjgrad.m simple case 4 by 4 matrix % x computed using b = 1,2,3,4 function test_conjgrad() diary('test_conjgrad_m.out'); disp('test_conjgrad_m running with simeq and conjgrad') disp('solve Ax=b for x given A and b') A = [ 1 2 5 9 ; 2 6 9 10 ; 5 9 11 13 ; 9 10 13 19 ] b = [1 ; 2 ; 3 ; 4 ] % must be column x = A \ b; % solve A x = b disp('simeq solution x=') disp(x) disp('initial guess for conjgrad') x0 = [0 ; 0 ; 0 ; 0 ] xc = conjgrad(A, b, x0, 1.0e-10, 9); disp('conjgrad solution xc=') disp(xc) disp('check A det, eig') Ad = det(A) [v e] = eig(A); disp(e) disp('l u lu(A)') [l u] = lu(A) disp('ichol(A)') C = ichol(A) % fails because A is not sparse disp('test_conjgrad.m finished') end % test_conjgrad test_conjgrad_m running with simeq and conjgrad solve Ax=b for x given A and b A = 1 2 5 9 2 6 9 10 5 9 11 13 9 10 13 19 b = 1 2 3 4 simeq solution x= 0.1567 0.0896 0.1194 0.0075 initial guess for conjgrad x0 = 0 0 0 0 conjgrad.m iter, rsnew = 1 0.3117 conjgrad.m iter, rsnew = 2 0.0467 conjgrad.m iter, rsnew = 3 5.0755e-04 conjgrad.m iter, rsnew = 4 7.2548e-24 conjgrad final iter, rsnew = 4 7.2548e-24 conjgrad solution xc= 0.1567 0.0896 0.1194 0.0075 check A det, eig Ad = 134.0000 -3.5791 0 0 0 0 -0.3051 0 0 0 0 3.2617 0 0 0 0 37.6226 l u lu(A) l = 0.1111 0.2353 1.0000 0 0.2222 1.0000 0 0 0.5556 0.9118 -0.8472 1.0000 1.0000 0 0 0 u = 9.0000 10.0000 13.0000 19.0000 0 3.7778 6.1111 5.7778 0 0 2.1176 5.5294 0 0 0 1.8611 ichol(A) First argument must be sparse. C = ichol(A)
Last updated 2/20/2017