0001 function ok= calc_jacobian_test
0002
0003
0004
0005
0006
0007
0008
0009
0010 ok= 1;
0011 delta = 1e-5;
0012 testvec= [5,20,40,130];
0013
0014 mdl= make_aa_mdl2;
0015
0016 disp('test jacobian_adjoint (2D) for difference data')
0017 ok=ok & run_jacobian_test( mdl, delta, testvec );
0018 ok=ok & run_dataprior_test( mdl );
0019
0020
0021 disp('test jacobian_adjoint (2D) for normalized difference data');
0022 mdl = mdl_normalize(mdl,1);
0023 ok=ok & run_jacobian_test( mdl, delta, testvec );
0024 ok=ok & run_dataprior_test( mdl );
0025
0026 mdl= make_aa_mdl3;
0027
0028 disp('test jacobian_adjoint (3D) for difference data')
0029 ok=ok & run_jacobian_test( mdl, delta, testvec );
0030 ok=ok & run_dataprior_test( mdl );
0031
0032 mdl = mdl_normalize(mdl,1);
0033 disp('test jacobian_adjoint (3D) for normalized difference data')
0034 ok=ok & run_jacobian_test( mdl, delta, testvec );
0035 ok=ok & run_dataprior_test( mdl );
0036
0037 mdl= make_np_mdl;
0038
0039 disp('test np_calc_jacobian for difference data')
0040 ok=ok & run_jacobian_test( mdl, delta, testvec );
0041 ok=ok & run_dataprior_test( mdl );
0042
0043 mdl = mdl_normalize(mdl,1);
0044 disp('test np_calc_jacobian for normalized difference data')
0045 ok=ok & run_jacobian_test( mdl, delta, testvec );
0046 ok=ok & run_dataprior_test( mdl );
0047
0048
0049
0050 function ok= run_jacobian_test( mdl, delta, testvec );
0051 calc_norm = 0;
0052 if mdl_normalize(mdl)
0053 calc_norm = 1;
0054 end
0055
0056 img= eidors_obj('image', 'homg image');
0057 img.fwd_model= mdl;
0058
0059 img.elem_data= ones( size(mdl.elems,1) ,1);
0060 homg_data=fwd_solve( img);
0061
0062 J= calc_jacobian( img );
0063
0064
0065 sumdiff= 0;
0066 bkgnd_elem_data= img.elem_data;
0067 for testelem = testvec
0068 img.elem_data= bkgnd_elem_data;
0069 img.elem_data(testelem)= bkgnd_elem_data(testelem)+delta;
0070 inh_data=fwd_solve( img);
0071
0072 if calc_norm
0073 simJ= 1/delta* (inh_data.meas ./ homg_data.meas - 1);
0074 else
0075 simJ= 1/delta* (inh_data.meas-homg_data.meas);
0076 end
0077
0078 plot([J(:,testelem) simJ]);
0079 sumdiff = sumdiff + std( J(:,testelem) - simJ );
0080 end
0081
0082 tol= 1e-4*std(J(:));
0083 dif= sumdiff/length(testvec);
0084 if sumdiff/length(testvec) > tol
0085 eidors_msg('Jacobian calculation error (%s) tol(%3.2g)>diff(%3.2g)', ...
0086 mdl.name,tol,dif, 1);
0087 ok=0;
0088 else
0089 ok=1;
0090 end
0091
0092
0093
0094
0095
0096 function ok= run_dataprior_test( mdl )
0097 img= eidors_obj('image', 'homg image');
0098 img.fwd_model= mdl;
0099
0100 img.elem_data= ones( size(mdl.elems,1) ,1);
0101 homg_data=fwd_solve( img);
0102
0103 DP= calc_meas_icov( img );
0104
0105
0106 testvec= diag(DP);
0107 if mdl_normalize(mdl)
0108
0109
0110 testvec = homg_data.meas.^2 ./ diag(DP);
0111 end
0112
0113 mdiff = full(max(abs(diff( testvec ))));
0114 if mdiff > 1e-12
0115 ok=0;
0116 eidors_msg('Dataprior calculation error (%s) = %f', mdl.name, mdiff, 1);
0117 keyboard
0118 else
0119 ok=1;
0120 end
0121
0122
0123
0124
0125
0126 function mdl= make_aa_mdl2;
0127 n_elec= 16;
0128 n_rings= 1;
0129 options = {'no_meas_current','no_rotate_meas'};
0130 params= mk_circ_tank(8, [], n_elec);
0131
0132 params.stimulation= mk_stim_patterns(n_elec, n_rings, '{ad}','{ad}', ...
0133 options, 10);
0134 params.solve= 'fwd_solve_1st_order';
0135 params.system_mat= 'system_mat_1st_order';
0136 params.jacobian= 'jacobian_adjoint';
0137 params.normalize_measurements = 0;
0138 mdl = eidors_obj('fwd_model', params);
0139 mdl.name= 'AA_1996 mdl';
0140
0141 function mdl= make_aa_mdl3;
0142 i_mdl = mk_common_model('b3cz2',16);
0143 mdl= i_mdl.fwd_model;
0144 mdl.name= 'AA_1996 mdl';
0145 mdl.solve= 'fwd_solve_1st_order';
0146 mdl.system_mat= 'system_mat_1st_order';
0147 mdl.jacobian= 'jacobian_adjoint';
0148
0149
0150
0151 function mdl= make_np_mdl;
0152 i_mdl = mk_common_model('n3r2',16);
0153 mdl= i_mdl.fwd_model;
0154 mdl.name= 'NP_2003 mdl';
0155 mdl.solve= 'np_fwd_solve';
0156 mdl.system_mat= 'np_calc_system_mat';
0157 mdl.jacobian= 'np_calc_jacobian';
0158
0159 function mdl= make_ms_mdl;
0160 i_mdl = mk_common_model('n3r2',16);
0161 mdl= i_mdl.fwd_model;
0162 mdl.name= 'MS_2005 mdl';
0163 mdl.solve= 'np_fwd_solve';
0164 mdl.system_mat= 'np_calc_system_mat';
0165 mdl.jacobian= 'ms_calc_jacobian';