|
EIDORS: Electrical Impedance Tomography and Diffuse Optical Tomography Reconstruction Software |
|
EIDORS
(mirror) Main Documentation Tutorials − Image Reconst − Data Structures − Applications − FEM Modelling − GREIT − Old tutorials − Workshop Download Contrib Data GREIT Browse Docs Browse SVN News Mailing list (archive) FAQ Developer
|
Basic EIDORS data structuresBasic EIDORS data structures: the fwd_modelTo understand a the basic EIDORS data structures, we define an electrical resistor, with ground at one end, and a single electrode (with contact resistance of 20Ω) at the other.
% tutorial1_create_fwd_model
% $Id: tutorial020a.m 4092 2013-05-27 22:17:28Z bgrychtol $
r_mdl= eidors_obj('fwd_model','demo resistor model');
r_mdl = mdl_normalize( r_mdl, 0);
% Geometry
r_mdl.nodes= [1,1,1; 2,2,2];
r_mdl.elems= [1,2];
r_mdl.boundary= [1,2];
% Define Electrodes (there is only one)
r_mdl.electrode(1).z_contact= 10; % ohms
r_mdl.electrode(1).nodes= 1;
r_mdl.gnd_node= 2;
show_fem(r_mdl); view(-12,24);
print_convert tutorial020a.png '-density 50';
Figure: this shows a single line representing the resistor in 3D. Not very interesting, but this is a simple example. Defining stimulation patternsIn order to simulate the voltages, define an electrical resistor, with ground at one end, and a single electrode at the other.
% Create stimulation patterns and solve fwd_model
% $Id: tutorial020b.m 3850 2013-04-16 18:13:39Z aadler $
% Define stimulation patterns
for i=1:3
r_mdl.stimulation(i).stimulation= 'Amps';
r_mdl.stimulation(i).stim_pattern= ( 0.001*i );
r_mdl.stimulation(i).meas_pattern= 1; % measure electrode 1
end
r_mdl.solve= @tutorial020_f_solve;
% Define an 'image'
resistor = eidors_obj('image', 'resistor');
resistor.elem_data= 1000;
resistor.fwd_model= r_mdl;
% Calculate data for 1k resistor
data_1k0 =fwd_solve( resistor );
% Now change resistor to be 1.2k
resistor.elem_data= 1200;
data_1k2 =fwd_solve( resistor );
Output data is given by:
>> disp(data_1k0)
name: 'resistor model data'
meas: [3x1 double]
type: 'data'
>> disp(data_1k0.meas')
1.0200 2.0400 3.0600
Forward solver functionThis calculation depends on a forward solver function, which calculates measurements from a given image. This function normally needs to be custom written for the physics of the problem. EIDORS provides several fuctions for EIT.The forward solver used here is tutorial020_f_solve, shown below:
function data =tutorial020_f_solve( img )
% Forward Model for a resistor
% For each stimulation there is I1 into Node1
% Node2 is connected to gnd with Zcontact
%
% each stim has one measurement pattern where
% Vmeas= Meas_pat * Node1
% = Meas_pat * I1 * ( Zcontact*2 + R )
%
% Thus
% V= IR => [V1;V2;V3] = [I1;I2*I3]*(R + 2*Zcontact)
R= img.elem_data;
stim = img.fwd_model.stimulation;
n_stim= length( stim );
V= zeros(n_stim, 1);
for i=1:n_stim
I = stim(i).stim_pattern;
meas_pat = stim(i).meas_pattern;
zc = img.fwd_model.electrode( find(I) ).z_contact;
V(i) = meas_pat * I * ( R + 2*zc);
end
data.name='resistor model data';
data.meas= V;
Image reconstructionImage reconstruction can be handled via a standard EIDORS image functions.
% Solve resistor model
% $Id: tutorial020c.m 3127 2012-06-08 16:19:25Z bgrychtol $
% Now we complete the fwd_model
r_mdl.jacobian= @jacobian_perturb;
% Now create an inverse model
i_mdl= eidors_obj('inv_model','resistor inverse');
i_mdl.fwd_model= r_mdl;
i_mdl.jacobian_bkgnd.value= 1000;
% regulatization not needed for this problem
i_mdl.RtR_prior= @prior_tikhonov;
i_mdl.hyperparameter.value= 0;
i_mdl.reconst_type= 'difference';
i_mdl.solve= @inv_solve_diff_GN_one_step;
% Reconstruct resistor change
reconst= inv_solve(i_mdl, data_1k0, data_1k2);
Thus the output is, giving a resistance change of 200Ω
>>reconst =
name: 'solved by aa_inv_solve'
elem_data: 200.0000
inv_model: [1x1 struct]
fwd_model: [1x1 struct]
type: 'image'
|
Last Modified: $Date: 2017-02-28 13:12:08 -0500 (Tue, 28 Feb 2017) $ by $Author: aadler $