Mercurial > repos > public > sbplib
diff convergenceTable.m @ 23:ad1a41d135a1
Added function to calculate convergence given errors. Added function to print convergence table (not finished.)
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 25 Sep 2015 11:08:47 +0200 |
parents | |
children | ddfb98209aa2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/convergenceTable.m Fri Sep 25 11:08:47 2015 +0200 @@ -0,0 +1,121 @@ +function convergenceTable(methodName, T, orders, m, e, q, tableType) + default_arg('tableType','plaintext') + + switch tableType + case {'plaintext','text','plain'} + plainTextTable(methodName, T, orders, m, e, q); + case {'tex', 'latex'} + latexTable(methodName, T, orders, m, e, q); + end +end + +function plainTextTable(methodName, T, orders, m, e, q) + description = sprintf('method: %s\nT: %d\n'); + + + eW = 0; + qW = 0; + for i = 1:length(orders) + log_e{i} = log10(e{i}); + eW = max(eW, findFieldWidth('%.2f',log_e{i})); + qW = max(qW, findFieldWidth('%.2f',q{i})); + end + + mW = findFieldWidth('%d',m); + orderHeaderWidth = eW + qW + 1; + + + % Print order headers + fprintf(' %*s |',mW,'') + for i = 1:length(orders) + fprintf(' %-*s |', orderHeaderWidth, sprintf('Order %d', orders{i})); + end + fprintf('\n'); + + + % Print eq headers + fprintf(' %*s |',mW,'m'); + for i = 1:length(orders) + fprintf(' %*s %*s |', eW, 'e', qW, 'q'); + end + fprintf('\n'); + + + % Print devider + m_dev = repmat('-',1,mW); + column_dev = repmat('-',1,orderHeaderWidth); + fprintf('-%s-+',m_dev); + for i = 1:length(orders) + fprintf('-%s-+', column_dev); + end + fprintf('\n'); + + + + % Print each row + for i = 1:length(m) + fprintf(' %*d |',mW,m(i)); + for j = 1:length(orders) + fprintf(' %*.2f %*.2f |', eW, log_e{j}(i), qW, q{j}(i)); + end + fprintf('\n'); + end + +end + +function latexTable(methodName, T, orders, m, e, q) + + nOrders = length(orders); + + header = { + '\begin{table}[H]' + '\centering' + ['\begin{tabular}{c' repmat('|cc',1,nOrders) '} &'] + orderheaders(orders) + '\hline' + ['$N$' repmat('& $log_{10}(l_2)$ & $q$',1,nOrders) ' \\'] + '\hline' + }; + + footer = { + '\end{tabular}' + '\caption{Error $l_2$, and convergence rate, $q$, for SBP operators of orders 4 and 6 at different grid densities $N$. PROBLEM DESCRIPTION.}' + '\label{table:LABEL}' + '\end{table}' + }; + + data = cell(1,length(m)); + data{1} = num2str(m(1)); + for j = 1:nOrders + data{1} = [data{1} ' & ' sprintf('%8.2f',log10(orders(j).e(1))) ' & ' ]; + end + data{1} = [data{1} '\\']; + + for i = 2:length(m) + data{i} = [data{i} num2str(m(i)) ]; + for j = 1:nOrders + data{i} = [data{i} ' & ' sprintf('%8.2f',log10(orders(j).e(i))) ' & ' sprintf('%8.2f',(orders(j).q(i-1))) ]; + end + data{i} = [data{i} '\\']; + end + + nlc = sprintf('\n'); + + header = strjoin(header', nlc); + data = strjoin(data, nlc); + footer = strjoin(footer', nlc); + + table = strjoin({header, data, footer}, nlc); + fprintf('%s\n', table); +end + + + +function s = orderheaders(orders) + s= sprintf('\\multicolumn{2}{|c}{%dth order}',orders(1).order); + nOrders = length(orders); + for i = 2:nOrders + s = [s sprintf('& \\multicolumn{2}{|c}{%dth order}',orders(i).order)]; + end + s = [s ' \\']; +end